STM8L IAP升级
芯片:STM8LXXX
通讯方式:SPI
IDE: IAR for STM8
工作需求,需要实现基于SPI通信的IAP升级,百度了一些资料,爬过了一些坑,现在测试升级ok,因此写篇笔记记录一下整个过程,以下便是整个过程,纯属个人记录,难免有不到的地方,如有错误,麻烦指出。
一、介绍
1) IAP简介
所谓的IAP即应用程序中编程(In-application programming),即可以在产品出厂后,更新程序。既然可以更新程序,那么就要有程序负责这部分功能,这个程序就叫做BootLoader,而被更新的程序就叫做Application.
2)官方BooLoader
如果只是想使用这个功能,而不用自己编写BootLoader,ST官方已经内置了Bootloader,参考文档《AN2659.pdf》中:点击下载
根据上面的文档,可以了解,ST官方已经在STM8中内置了Bootloader,然后参考文档《UM0560.pdf》,点击下载,可以查看自己要使用的MCU是否支持内置的Bootloader,还有支持什么通信方式。
我使用的这颗MCU官方的Bootloader只支持USART方式通信,而我们的项目需求是使用SPI方式通信,因此需要自己开发Bootloader。
如果使用官方的Bootloader,则《UM0560.pdf》文档里面有详细的升级协议,可以根据协议进行对接。
3)自己编写BootLoader注意点
如果自己编写Bootloader,则需要注意几个方面:
1.中断向量表的重定向
参考文档《STM8L IAP 应用程序中编程指导.pdf》中的说明,点击下载,如下图
可以看到,当Application中发生中断的时候,会跳转到0x8000地址处,因此在Bootloader中需要将中断进行重定向,使之能够跳转到Application中的中断向量表中去。
2.Bootloader与Application的大小以及数据的写入
这个要根据自己的项目实际情况来确定大小以及区块位置,下面将会详细说明。
3.程序跳转
程序跳转可以分为Bootloader跳转到Application, Application跳转到Bootloader.下面将会详细说明。
二、功能实现
根据上面的说明,自己编写BootLoader需要实现以下几个方面:中断向量表、分区大小、数据写入、程序跳转
1)中断向量表
中断向量表的重定向,需要根据自己的Bootloader大小进行设置,例如,大小为4KB,则Bootloader地址范围为0x8000 ~ 0x8FFF,则可以中断向量表可以重定向如下:
/* interrupt vetor redirected app addres is 0x9000
* bld size is 4kb
*/
__root const long reintvec[]@".intvec"=
{
0x82008080,0x82009004,0x82009008,0x8200900c,
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,
};
如果大小为5KB,则Bootloader地址范围为0x8000 ~ 0x93FF,则可以中断向量表可以重定向如下:
/* interrupt vetor redirected app addres is 0x9400
* bld size is 5kb
*/
__root const long reintvec[]@".intvec"=
{
0x82008080,0x82009404,0x82009408,0x8200940c,
0x82009410,0x82009414,0x82009418,0x8200941c,
0x82009420,0x82009424,0x82009428,0x8200942c,
0x82009430,0x82009434,0x82009438,0x8200943c,
0x82009440,0x82009444,0x82009448,0x8200944c,
0x82009450,0x82009454,0x82009458,0x8200945c,
0x82009460,0x82009464,0x82009468,0x8200946c,
0x82009470,0x82009474,0x82009478,0x8200947c,
};
2)分区设置
如果确定自己的BooLoader大小,然后就可以设置对应的icf文件已经flash的大小。
例如,现在使用的MCU flash地址空间为 0x8000 ~ 0xBFFF, 并且确定Bootloader的大小为5KB,则Bootloader地址为 0x8000 ~ 0x93FFF, Application地址为0x94000 ~ 0xBFFF.
首先需要找到对应MCU的icf文件,具体路径为C:\Program Files\IAR Systems\Embedded Workbench 8.0_2\stm8\config 这个要根据你自己的IAR软件安装位置来确定。
找到对应的MCU icf文件后,创建Bootloader和Application两份工程,然后将每一份工程的icf中,根据自己的分区的大小进行修改:
Bootloader修改如下:
Application中修改如下:
修改完毕后,还需要将此文件载入工程,直接在IAR中点击创建的过程,右键options —> Linker —> Configuration, 选择自己修改好的icf文件然后载入,如下:
3)数据写入
数据的写入,根据MCU的datasheeet有几种写入方式,因为是大数据写入,所以采用了块写入的方式,即每次直接写入一个块,每个块128Bytes则需要计算写入块的位置。
(0xbfff - 0x8000) / 128 = 128block 可知一共有128个块
而Application的地址范围为 0x9400 ~ 0xbfff, 则Application的起始位置是(0x9400 - 0x8000) / 128 = 40 block
也就是,Bootloader的位置为block0 ~ block 39, Application的位置为block40 ~ block127
数据的写入和擦除使用的是IN_RAM方式,代码如下:
/*
Block programming, also called standard block programming: The block is automatically erased before being programmed.
Fast block programming: No previous erase operation is performed.
Block erase
*/
IN_RAM(void bld_flash_write_block(uint16_t BlockNum,FLASH_MemType_TypeDef FLASH_MemType,uint8_t *Buffer))
//void Write_Flash_Block(uint16_t BlockNum,FLASH_MemType_TypeDef FLASH_MemType,uint8_t *Buffer)
{
FLASH_Unlock(FLASH_MemType);
//FLASH_EraseBlock(BlockNum,FLASH_MemType);
FLASH_ProgramBlock(BlockNum, FLASH_MemType,FLASH_ProgramMode_Fast,Buffer);
FLASH_WaitForLastOperation(FLASH_MemType);
FLASH_Lock(FLASH_MemType);
}
IN_RAM(void bld_flash_erase_block(FLASH_MemType_TypeDef FLASH_MemType))
{
uint8_t i = 0;
FLASH_Unlock(FLASH_MemType);
for (i = FLASH_START_BLOCK; i <= FLASH_END_BLOCK; i++)
{
FLASH_EraseBlock(i, FLASH_MemType);
FLASH_WaitForLastOperation(FLASH_MemType);
}
FLASH_Lock(FLASH_MemType);
}
代码中写入的时候采用的是FLASH_ProgramMode_Fast方式,即直接写入,FLASH_ProgramMode_Standard模式则是写入前先自动擦除,速度较慢。可以根据自己的需求进行选择。
4)程序跳转
Bootloadre — > Application
跳转直接采用汇编的方式,这里不再说明
void bld_goto_app()
{
asm("LDW X, SP");
asm("LD A, $FF");
asm("LD XL, A");
asm("LDW SP, X");
asm("JPF $9400");
}
Application —> Bootloader
当需要升级的时候,需要进入到Bootloader状态,此时可以通过一些方法,例如外部电源reset、看门狗超时复位、或者直接采用汇编的方式跳转,如下:
void app_goto_bld()
{
asm("LDW X, SP");
asm("LD A, $FF");
asm("LD XL, A");
asm("LDW SP, X");
asm("JPF $8000");
}
不过,在使用这种方式之前,最好要 enableInterrupts();,否则会有一些有趣的事情发生。。。
5)BootLoader如何确定要升级?
这个各有各的方法,目前简单采用向EEPROM中写入特殊字符来判断。
以上是全部的过程,如有错误的地方,麻烦指出。
上一篇:STM8S105 SPI 初始化
下一篇:关于STM8S使用硬件SPI收发问题
推荐阅读
史海拾趣
面对数字化浪潮的冲击,Hitachi Metals积极拥抱变革,致力于数字化转型。公司推出了全球级别的物联网平台Lumada,该平台能够为客户提供从企业扩建、价值核查到设备和系统管理的全方位解决方案。Lumada平台的成功应用不仅提升了日立金属自身的运营效率和管理水平,还为客户带来了显著的价值增长。通过Lumada平台,日立金属与全球范围内的合作伙伴建立了更加紧密的联系,共同推动电子行业的数字化转型进程。
自1956年成立以来,Hitachi Metals便逐步在电子材料领域建立了坚实的基础。公司早期便专注于研发和生产用于电子设备的核心部件,如磁性材料。随着电子行业的蓬勃发展,日立金属迅速抓住了市场机遇,推出了高性能的Nd-Fe-B系列烧结磁石和高性能铁氧体烧结磁石,这些材料广泛应用于计算机、半导体集成电路器件及平板显示屏等高科技产品中。凭借其卓越的产品质量和稳定的市场供应,Hitachi Metals在电子材料市场上赢得了广泛的认可。
为了提升在电子材料领域的竞争力,Freeport Resources积极寻求国际合作,与多家国际知名电子材料生产商和研究机构建立了战略伙伴关系。通过技术引进和联合研发,公司成功掌握了先进的电子材料提纯和加工技术,大幅提高了产品的质量和性能。同时,国际合作也帮助Freeport Resources打开了国际市场,其产品远销全球多个国家和地区,进一步巩固了其在电子材料市场的地位。
随着业务的不断发展,Dowosemi公司开始积极拓展海外市场。他们通过参加国际展会、与海外客户建立合作关系等方式,将产品推向全球。在海外市场拓展的过程中,Dowosemi公司也遇到了不少挑战,但他们凭借优质的产品和服务,成功克服了这些困难。如今,Dowosemi公司的产品已经遍布全球多个国家和地区,为公司的发展注入了新的活力。
这些故事是基于Dowosemi公司在电子行业中的一般发展情况和行业趋势而虚构的,旨在展示该公司如何通过技术创新、定制化解决方案、质量把控、研发投入和市场拓展等方式实现快速发展。
进入21世纪,电子行业迎来了快速发展的黄金时期。为了适应市场需求的变化,Cableform Inc不断加大研发投入,致力于技术创新。公司成功开发出了一系列具有自主知识产权的电磁控制产品,涵盖了从直流电机控制到高精度磁铁控制等多个领域。这些技术创新不仅提升了公司的核心竞争力,也为客户提供了更加高效、可靠的解决方案。
Helium公司成立于2013年,由Shawn Fanning、Amir Haleem和Sean Carey共同创立。在创立初期,Helium专注于物联网无线网络技术的研究,但并未迅速获得市场关注。这一时期,电子行业正处于创新与转型阶段,物联网作为新兴领域展现出巨大潜力。Helium团队预见到了物联网的发展趋势,但由于缺乏明确的商业模式,其网络发展并未大规模铺开。然而,这段时期的积累为Helium后续的技术突破和市场拓展奠定了坚实基础。
测试WDK环境时出现这样的错误 出现这样的错误 errors in directory f:\\wdk\\wdkstudy\\first Do not assign include. 有人知道是为什么吗?… 查看全部问答∨ |
我刚下了个proteus 7.4 破解版的,安装完后就是运行不了一运行就是什么电脑上找不到isis的lxk文件的?哪位大侠给小弟指点指点吧!!!!… 查看全部问答∨ |
【连载】【ALIENTEK MiniSTM32 开发板】STM32不完全手册--窗口看门狗实验(实验六) ALIENTEK开发板购买地址:http://shop62103354.taobao.com/ [ 本帖最后由 正点原子 于 2010-8-30 09:36 编辑 ]… 查看全部问答∨ |
|
最近一个月多月,工作上的事情繁多,没能够及时的完成前期参与的论坛活动,深感抱歉!先开个帖子,我慢慢的补吧 本来打算做成这样的。 总体设计框图 实现的功能 1. 完成A/D转换,FFT变换 ...… 查看全部问答∨ |
两块闲置Altera DE2开发板+一块Terasic LTM 4.3寸触摸屏 本帖最后由 ddllxxrr 于 2016-1-7 16:48 编辑 筒子们好,目前手里有闲置的两块Altera DE2开发板,九成新,只做过一个project后闲置了一年,想以1500/块价格转让。 另外,还有一块Terasic LTM 4.3寸触摸屏,同样只做过一个project,如果需要的话50 ...… 查看全部问答∨ |