打印
[STM8]

STM8L BOOT分享

[复制链接]
2258|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kxing91|  楼主 | 2017-2-17 16:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 kxing91 于 2017-2-17 16:33 编辑

第一步:设置flash地址,我分了三个区,BOOT区(8000-8FFF),APP区(9000-C7FF),COPY区(C800-FFFF)在lnkstm8l052c6.icf文件中修改

define region NearFuncCode = [from 0x9000 to 0xC7FF];
define region FarFuncCode = [from 0x9000 to 0xC7FF];
define region HugeFuncCode = [from 0x9000 to 0xC7FF];

第二步:中断向量表重定向
__root const long reintvec[]@".intvec"=                //中断向量表重定向
{ 0x82008080,0x82009004,0x82009008,0x8200900c, //当应用程序地址不是0x9000时则要相应改掉除第一个0x82008080以外的数值
  0x82009010,0x82009014,0x82009018,0x8200901c,
  0x82009020,0x82009024,0x82009028,0x8200902c,
  0x82009030,0x82009034,0x82009038,0x8200903c,
  0x82009040,0x82009044,0x82009048,0x8200904c,
  0x82009050,0x82009054,0x82009058,0x8200905c,
  0x82009060,0x82009064,0x82009068,0x8200906c,
  0x82009070,0x82009074,0x82009078,0x8200907c,
};

第三步:flash的擦写:
void FLASH_WriteDat_OnePage(u8 *GBuffer, u8 Page)
{
   FLASH_Unlock(FLASH_MemType_Program);
   while (FLASH_GetFlagStatus(FLASH_FLAG_PUL) == RESET);
   FLASH_EraseBlock(Page, FLASH_MemType_Program);
   while (FLASH_GetFlagStatus(FLASH_FLAG_HVOFF) == RESET);
   FLASH_ProgramBlock(Page, FLASH_MemType_Program, FLASH_ProgramMode_Standard, GBuffer);
   while (FLASH_GetFlagStatus(FLASH_FLAG_HVOFF) == RESET);
   FLASH_Lock(FLASH_MemType_Program);   
}


升级流程:收到主机升级指令-->判断是否升级(版本号)-->获取升级包大小-->在APP中将升级包存储到COPY区-->计算判断CRC-->复位进入BOOT-->将COPY区的数据复制到APP区-->跳转。

沙发
wahahaheihei| | 2017-2-17 19:44 | 只看该作者
中断向量里的地址可以自己随便改吗

使用特权

评论回复
板凳
yiyigirl2014| | 2017-2-17 21:06 | 只看该作者
自己定义这些,是不是存储的时候就跟默认的位置不同 、

使用特权

评论回复
地板
huangcunxiake| | 2017-2-18 08:40 | 只看该作者
define region NearFuncCode = [from 0x9000 to 0xC7FF];
define region FarFuncCode = [from 0x9000 to 0xC7FF];
define region HugeFuncCode = [from 0x9000 to 0xC7FF];
我的眼花吗,看着一样

使用特权

评论回复
5
kxing91|  楼主 | 2017-2-18 10:25 | 只看该作者
wahahaheihei 发表于 2017-2-17 19:44
中断向量里的地址可以自己随便改吗

不可以,只是重新定义了一个向量指向8000开始的中断向量表

使用特权

评论回复
6
kxing91|  楼主 | 2017-2-18 10:26 | 只看该作者
yiyigirl2014 发表于 2017-2-17 21:06
自己定义这些,是不是存储的时候就跟默认的位置不同 、

是的,根据APP,BOOT等区域的不同,设置不同的地址范围

使用特权

评论回复
7
kxing91|  楼主 | 2017-2-18 10:27 | 只看该作者
huangcunxiake 发表于 2017-2-18 08:40
define region NearFuncCode = [from 0x9000 to 0xC7FF];
define region FarFuncCode = [from 0x9000 to 0x ...

看仔细一点,宏定义的名称不同

使用特权

评论回复
8
kxing91|  楼主 | 2017-2-18 10:31 | 只看该作者
STM8的中断向量表固定在0X8000地址,不能修改,所以BOOT区不能开中断,否则会干扰APP区的中断,但是APP区的一但开启中断后就会跳转到0x8000地址,这样就跳到了BOOT区,因此需要使用跳转指令将中断跳回到APP区。

使用特权

评论回复
9
kxing91|  楼主 | 2017-2-18 10:37 | 只看该作者
从BOOT 跳转到 APP的指令如下,是汇编的一段代码,前三个不需要修改,只要改最后一个跳转地址就可以。
asm("LDW X,  SP ");
asm("LD  A,  $FF");
asm("LD  XL, A ");
asm("LDW SP, X ");
asm("JPF $9000");  //9000是需要跳转到的APP得地址,我的是0x9000


使用特权

评论回复
10
kxing91|  楼主 | 2017-2-18 11:40 | 只看该作者
- For IAR Compiler:
    1- Use the __ramfunc keyword in the function declaration to specify that it
    can be executed from RAM.
    This is done within the stm8l15x_flash.c file, and it's conditioned by
    RAM_EXECUTION definition.
    2- Uncomment the "#define RAM_EXECUTION  (1)" line in the stm8l15x.h file, or
   define it in IAR compiler preprocessor to enable the access for the
   __ramfunc functions.
对块进行操作必须要注意以上事项

使用特权

评论回复
11
309030| | 2017-2-18 14:42 | 只看该作者
BOOT区不能开中断,否则会干扰APP区的中断

使用特权

评论回复
12
huangcunxiake| | 2017-2-21 19:46 | 只看该作者
没想到如此的复杂抽象,难以理解。

使用特权

评论回复
13
wahahaheihei| | 2017-2-21 20:09 | 只看该作者
kxing91 发表于 2017-2-18 10:25
不可以,只是重新定义了一个向量指向8000开始的中断向量表

也就是说都要定义到这个地址?

使用特权

评论回复
14
juneII| | 2017-3-1 21:47 | 只看该作者
万能的楼主,能否将STM8L完整的bootloader程序共享一下,最近在做这方面的开发,遇到了一些编程方面的问题无法解决,如能共享,万分感激!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

165

主题

309

帖子

0

粉丝