sos博 发表于 2019-2-1 20:37:20

stm8怎么实现bootloader,尤其是地址问题

我用stm8l050j3,想要实现串口升级固件,所以需要bootloader。
我找到了一个网上的程序。还是挺全的,但是因为芯片不同,flash大小不同,我不会分配内存地址。
我的芯片是8K flash的。
1,第一个问题是IAR编译的
我编译看到的是程序占用吗?


如果是的话,3个memory是表示什么意思,bootloader的总大小是3107byte吗?那我APP从4K开始可以吧?如果从0x8000开始,那4K位置应该是多少怎么算的呢?


2,下图从哪是8K呢,好像都说是0x8000开始,但是我看图片里有虚线那是什么意思呢?我的bootloader是从0x8000开始,还是从0x8100开始?


我也没搞懂到底是0x8000还是0x00800,这个到底是左对齐还是右对齐?

我找的程序是下面的这个,但是他芯片是64K的,我的是8K
<p>#define USER_APP_START_ADD   ((u32)0xA000)//用户APP起始地址</p><p>
</p><p>//重新初始化STM8的中断向量表把它重新定义到APP的中断向量中
void STM8_HanderIqr_Init(void)
{
disableInterrupts();   //关闭所有中断

u8 Index;      

FLASH_Unlock(FLASH_MemType_Program);//解锁flash

for(Index = 1; Index < 0X20;Index++)
{
   if(FLASH_ReadWord(0X8000+4*Index)!=(0X82000000+USER_APP_START_ADD+Index*4))
   {
    FLASH_ProgramWord(0X8000+4*Index,0X82000000+USER_APP_START_ADD+Index*4);
   }
}
FLASH_Lock(FLASH_MemType_Program);
}</p>

freeelectron 发表于 2019-2-14 09:28:06

只要flash能编程(芯片开放出来了),就可以实现bootloader

tgw860910 发表于 2019-2-14 09:38:43

8k flash 还要做IAP,不太够吧
IAP + APP 不能大于你选用的芯片的最大FLASH,一般来说IAP部分至少都要2K左右,你要分配好flash的地址才行

tgw860910 发表于 2019-2-14 09:43:19

#define USER_APP_START_ADD   ((u32)0xA000)//用户APP起始地址,这是40K

#define USER_APP_START_ADD   ((u32)0x1000)//用户APP起始地址,这是4K

qiangtech 发表于 2019-2-14 11:00:35

从0X8000开始,先是BOOTLOADER,后面就可以跟APP了。两个加起来不能超过FLASH大小。注意一下最小偏移量。

toofree 发表于 2019-2-14 11:01:26

1、具体占多少空间,还是生成一个bin文件看一下吧,因为生成的目标程序很可能是不连续的。而你要想bootloader的话,IAP和APP的两段空间必须是独立的。
2、flash从0x8000地址开始,0x8000到0x80FF段存复位和中断向量表。具体0x008000写了6位数,跟对齐没有关系,只是说6位数足够表示stm8的全部地址空间了,也可以写成8位数,但是在多也没有任何意义了。

xinshuwei 发表于 2019-2-14 11:12:49

先从flash0x8000写BootLoader 然后再跟app程序,楼上说的最小的单元说的是最小块擦除大小,清除数据时候注意 。
所以整体分割应该是 BootLoader +app+data ;
BootLoader用于通讯、升级数据、程序跳转等
data区存储升级数据:lol

legenderw 发表于 2019-2-14 13:43:43

收了,不错,学习学习!
页: [1]
查看完整版本: stm8怎么实现bootloader,尤其是地址问题