Flash基础入门之关于自制 STM8 Bootloader
小标 2019-01-24 来源 : 阅读 1077 评论 0

摘要:本文主要向大家介绍了Flash基础入门之关于自制 STM8 Bootloader,通过具体的内容向大家展现,希望对大家学习Flash基础入门有所帮助。

本文主要向大家介绍了Flash基础入门之关于自制 STM8 Bootloader,通过具体的内容向大家展现,希望对大家学习Flash基础入门有所帮助。

由于本人项目需要,要做STM8L052R8的bootloader,用于远程程序升级功能,为了安全考虑,不使用ST自带的bootloader,而是自制bootloader。
基本的功能是这样的,首先程序运行在一个V1.0的版本上,且带了BOOT,当程序收到一条命令后,程序跑入死循环,等待硬件看门狗复位;程序复位后进入bootload区,等待第二条命令的接收,接收到正确的数据帧后,bootloader开始擦除FLASH,并接收数据包,直到最后一个数据包接收完毕,通过指示灯以2HZ的频率闪烁,指示升级完成。          第一步:boot区程序设计,首先修改link文件,         

    define region NearFuncCode = [from 0x8000 to 0xAFFF];
          define region FarFuncCode = [from 0x8000 to 0xAFFF];
          define region HugeFuncCode = [from 0x8000 to 0xAFFF];
          place at start of NearFuncCode  { block INTVEC };

         以上是link文件部分,可以看出flash地址为0x8000开始,结束于0x17FFF; 长度为64kB,中断向量地址为0x8000,这样,知道了这个我们就可以修改BOOT程序的link和主程序的link了,这里我把BOOTLOAD区划分为8K,应用区为48K设置link文件如下,这样把boot区和APP区分开,互不干扰,你也可以根据需要调整他们的大小。

          program:
          define region NearFuncCode = [from 0xB000 to 0xFFFF];
          define region FarFuncCode = [from 0xB000 to 0xFFFF]| [from 0x10000 to 0x17FFF];
          define region HugeFuncCode = [from 0xB000 to 0x17FFF];
          place at start of NearFuncCode  { block INTVEC };
         bootload:
          define region NearFuncCode = [from 0x8000 to 0xAFFF];
          define region FarFuncCode =    [from 0x8000 to 0xAFFF];
          define region HugeFuncCode = [from 0x8000 to 0xAFFF];
          place at start of NearFuncCode  { block INTVEC };

 
         像STM32这样的芯片中断向量地址可以任意定,所有boot区和APP区都可以使用中断,且互不干扰,但是STM8的中断向量表固定在0X8000地址,不能修改,所以BOOT区不能开中断,否则会和APP区的中断打架,但是APP区的一但开启中断后就会跳转到0x8000地址,这样就跳到了BOOT区,因此需要使用跳转指令将中断跳回到APP区,

__root const long reintvec[]@".intvec"=
{ 0x82008080,0x8200b004,0x8200b008,0x8200b00c, //当应用程序地址不是0xB000时则要相应改掉除第一个
        0x8200b010,0x8200b014,0x8200b018,0x8200b01c, //0x82008080以外的数值
        0x8200b020,0x8200b024,0x8200b028,0x8200b02c,
        0x8200b030,0x8200b034,0x8200b038,0x8200b03c,
        0x8200b040,0x8200b044,0x8200b048,0x8200b04c,
        0x8200b050,0x8200b054,0x8200b058,0x8200b05c,
        0x8200b060,0x8200b064,0x8200b068,0x8200b06c,
        0x8200b070,0x8200b074,0x8200b078,0x8200b07c,
}; 

 
 这里大概的含义就是重定义STM8的中断,STM8中断向量重定义,至于这里为什么这样写,请网上自己去看,我也不是很清楚。              第二步:芯片上电后,从bootload start 跳转到 program start          当我们上电时,我们往往不需要用到bootload ,但是程序起来就先跑到ROM的起始地址,因此需要做一个跳转从bootload start 跳转到 program start。设计如下

asm("LDW X,  SP ");
asm("LD  A,  $FF");
asm("LD  XL, A ");
asm("LDW SP, X ");
asm("JPF $B000");

 
        这里我们用B000,表示上电以后BOOT区没有接收到升级请求则直接跳转到APP区,0XB000是我的APP的起始地址,你可以根据自己的要求定义。        第三步:在线擦写flash         

 void Boot_EraseChip(void)
{
  U16 usCnt;
  /* Define flash programming Time*/
  FLASH_SetProgrammingTime(FLASH_ProgramTime_Standard);
  Boot_UnLock();
  /*擦除FLASH*/
  LED_ALARM_H();
  LED_RUN_L();
  for(usCnt = USER_FLASE_ALL_OF_BLOCK;usCnt >0;usCnt-- )
  {
    HD_Clear_WDT();


    FLASH_EraseBlock(USER_FLASH_START_BLOCK+(usCnt-1), FLASH_MemType_Program);
    /* Wait until End of high voltage flag is set*/
    while (FLASH_GetFlagStatus(FLASH_FLAG_HVOFF) == RESET)
    {}
  }
  LED_ALARM_L();
  LED_RUN_H();
  Boot_Lock();
}

 
 这个函数里面我的BOOT程序一旦接收到升级命令后,先将FLASH擦除,这里用到了一个库函数,STM8 的lib 库里面有stm8l15x_flash.h stm8l15x_flash.c 这个文件里面有一段注释,如下所示,意思是要使用flash的擦写,必须要在stm8l15x.h里面定义

#define RAM_EXECUTION  (1)  ,flash 擦写的函数都是定义在ram地址中的,所以在这些函数前都有个in_ram
  * To enable execution from RAM you can either uncomment the following define
  * in the stm8l15x.h file or define it in your toolchain compiler preprocessor
  * - #define RAM_EXECUTION  (1) 

 
并且由于 stm8的库对不同芯片处理不同,还需要定义你使用的芯片型号,这里我用的芯片是 STM8L052,因此使用的宏为 :

#define STM8L05X_HD_VL

 
这样就可以调用擦写函数去升级APP程序了,其他的工做就是在BOOT 区进行数据的收发等待,数据校验等工做了,没什么特别的东西。不管用什么芯片,只要是FLASH是分块的,都可以做boot,去加载APP。

以上就介绍了Flash的相关知识,希望对Flash有兴趣的朋友有所帮助。了解更多内容,请关注职坐标常用软件Flash频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程