历史上的今天
返回首页

历史上的今天

今天是:2024年09月10日(星期二)

正在发生

2018年09月10日 | STM8L IAP升级过程记录

2018-09-10 来源:eefocus

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中写入特殊字符来判断。


以上是全部的过程,如有错误的地方,麻烦指出。


推荐阅读

史海拾趣

FREESCALE (NXP)公司的发展小趣事

FREESCALE (NXP) 公司发展的五个故事

故事一:从摩托罗拉剥离到独立上市

FREESCALE的前身可以追溯到摩托罗拉的半导体部门。2002年,面对半导体业务的持续亏损,摩托罗拉集团决定剥离该部门。2004年,摩托罗拉半导体产品事业部正式更名为FREESCALE半导体公司,并在次年成功上市。这一剥离与上市过程标志着FREESCALE作为一个独立实体的诞生,为其后续的发展奠定了基础。独立后的FREESCALE迅速调整战略,专注于嵌入式电子解决方案,特别是在汽车电子、工业控制等领域取得了显著成就。

故事二:与恩智浦(NXP)的合并

2015年,FREESCALE与另一家半导体巨头恩智浦(NXP)达成合并协议,这是半导体行业内的一次重大整合。合并后的公司成为全球最大的汽车半导体供应商之一,并在多个关键技术领域占据领先地位。此次合并不仅增强了双方的市场竞争力,还促进了资源共享和技术创新,为未来的增长开辟了更广阔的空间。合并后的公司在全球范围内拥有更强大的研发和销售网络,能够更好地服务于全球客户。

故事三:从亏损到盈利的转型

在成为独立公司之前,FREESCALE的前身——摩托罗拉的半导体部门曾长期面临亏损困境。然而,在剥离并独立运营后,FREESCALE通过一系列战略调整和市场拓展措施,成功实现了从亏损到盈利的转型。公司注重技术创新和产品研发,不断推出符合市场需求的新产品,同时加强与客户和合作伙伴的合作,共同推动行业发展。这些努力使得FREESCALE在激烈的市场竞争中脱颖而出,成为半导体行业的佼佼者。

故事四:技术创新的引领者

FREESCALE一直致力于技术创新,不断推动半导体技术的进步。公司在嵌入式处理器、模拟芯片、射频芯片等多个领域拥有深厚的技术积累和丰富的产品线。例如,FREESCALE推出的基于Arm Cortex-M系列的微控制器在智能家居、智能穿戴等领域得到了广泛应用;其汽车半导体产品更是广泛应用于高级驾驶员辅助系统、车载网络等领域,为汽车行业的智能化转型提供了有力支持。FREESCALE的技术创新不仅提升了自身产品的竞争力,也为整个行业的发展注入了新的活力。

故事五:全球布局与本地化服务

为了更好地服务全球客户,FREESCALE(及合并后的NXP)在全球范围内进行了广泛的布局。公司在多个国家和地区设立了研发中心、生产基地和销售网络,能够快速响应客户需求并提供本地化服务。同时,FREESCALE还积极与全球各地的合作伙伴建立紧密关系,共同推动技术创新和市场拓展。这种全球布局与本地化服务的策略使得FREESCALE能够更好地融入当地市场,为客户提供更加贴心和高效的服务。

Comax Industrial Co Ltd公司的发展小趣事

为了不断提升自身的技术创新能力,Comax Industrial Co Ltd公司积极与高校、科研机构等开展产学研合作。通过与这些机构的紧密合作,公司不仅获得了前沿的技术支持,还培养了一批高素质的技术人才。这种合作模式使得公司的技术创新能力得到了显著提升,为公司的长期发展提供了有力的支撑。

联捷(Elinker)公司的发展小趣事

在快速发展的同时,联捷(Elinker)始终关注社会责任和可持续发展。公司积极参与各种公益活动,为社会做出了积极贡献。同时,公司还注重环保和节能工作,通过采用环保材料和节能技术等方式降低生产过程中的能耗和排放。这些举措不仅提高了公司的社会形象也促进了公司的可持续发展。

请注意,以上故事均为模拟内容,旨在展示联捷(Elinker)公司可能的发展历程和故事。实际情况可能有所不同,具体信息请参考公司官方发布的相关资料。

EMC Component Group公司的发展小趣事

随着国内市场的逐渐饱和,联捷(Elinker)开始寻求海外市场的拓展。公司积极参加国际电子展会,与国外的电子企业建立了广泛的合作关系。同时,公司还通过引进国外先进的技术和管理经验,不断提升自身的竞争力。在国际市场的竞争中,联捷(Elinker)凭借其优质的产品和服务,赢得了越来越多客户的信任和认可。

CAMBION公司的发展小趣事

CAMBION公司自成立以来,始终将技术创新作为核心驱动力。在早期,公司研发团队成功开发了一款具有革命性的芯片技术,显著提升了电子设备的处理速度和能效。这一技术迅速在行业内引起关注,为CAMBION赢得了大量订单和合作伙伴。随着技术的不断完善和应用范围的扩大,CAMBION逐渐在电子行业中崭露头角。

康龙(CONCRAFT)公司的发展小趣事

随着公司实力的不断增强,康龙开始积极拓展国内外市场。公司先后在美国、欧洲等地设立了销售机构,与多家国际知名企业建立了长期稳定的合作关系。同时,康龙还积极参与国际展会和交流活动,提升品牌知名度和影响力。通过不懈的努力,康龙的产品已经成功打入国际市场,并赢得了客户的广泛赞誉。

问答坊 | AI 解惑

保险丝Bussmann KTK-R系列,圆管型快速熔断器KTK-R-5/KTK-R-6/KTK-R-10/KTK-R-12现货

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 Bussmann KTK-R系列,圆管型快速熔断器KTK-R-5/KTK-R-6/KTK-R-10/KTK-R-12现货 Bussmann KTK-R-15/KTK-R-20/KTK-R-25/KTK-R-30系列价优额定电压:600V AC  电流范围:1/10~30A断流容 ...…

查看全部问答>

请教虚拟磁盘技术的实现原理及相关资料

无盘客户端的内存和服务器端的磁盘映像文件建立关系,只是它们是怎么对应的,格式是什么,以及怎样不受物理内存大小限制?也就是说客户端内存是如何进行内存管理的,算法和数据结构如何设计?谢谢了。…

查看全部问答>

标准输出重定向问题

板卡有一个网口,一个串口, 用串口进行消息通讯,用网口输出日志.printf输出日志到标准输出设备,但是日志老是会发到串口,造成消息错乱.用ioTaskStdSet 和ioGlobalStdSet 试了几个设备后都不行…

查看全部问答>

各个分区出这个东西 不知道是什么病毒

各个分区出这个东西 不知道是什么病毒 之前是每个盘都出现个autorun.inf的文件夹 我用U盘防火墙删了后就变成这个名字的文件夹 每个盘都出现这个文件.....除了C盘 这东西不能双击  不能删除^很诡异......... 请问有根治方法吗 谢谢 ...…

查看全部问答>

华为硬件工程师手册

废话不说了,一本不错的书…

查看全部问答>

关于LPC1768的RTC

请问图中 RTC的 Power Selector 在哪个寄存器里控制啊?我竟然翻阅Datasheet 没发现! …

查看全部问答>

【MSP430共享】智能测试仪器和系统中Modbus协议的实现

Modbus协议适用于主从式终端- 服务器构架的智能仪器,它是一种在工业环境中应用广泛的通信协议。文章基于Mo dbus通信协议研究一种嵌入式数据传输仪表,仪表以MSP430 微处理器为中央控制单元,通过RS - 485 总线和 GPRS技术,能实现信号和数据的输入输出 ...…

查看全部问答>

共阴的数码管显示0-f

/******************************设计者:李文*功能:共阴的数码管显示0-f**********************************/ #include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6;sbit wela=P2^7;uchar code table[]={ ...…

查看全部问答>

已经初步入门~MSP430

以前都是玩51和AVR,430的低功耗一直是传说, 参与了最近团购的LaunchPad,到手测试后,对430的低功耗赞不绝口 430对于电池供电的系统真是个福音啊。 无奈LaunchPad的资源太少, 已经入手了USB仿真器 和147芯片,准备打板测试。 期待和大家分 ...…

查看全部问答>

Protel99se与Cadence之间网表传递的方法有多少种?

最近要做一块板子,给的网表是Protel99se的,如何转换后Cadence能使用?请教一下大家…

查看全部问答>