你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验之谈】基于STM32F103SD卡Bootloader离线升级的经验分享

[复制链接]
STMCU小助手 发布时间:2022-12-10 23:00

做过很多Bootloader升级的产品,感觉Bootloader还是很有意思的。通过芯片的一段程序,去更新剩余的程序。从而达到更新产品软件的作用。芯片自带的Bootloader是通过芯片厂家的协议,通过烧录器把程序更新到Flash里面。而我们自己为什么还要部分的空间再写一个Bootloader呢?因为我们想通过我们自己的方式,升级芯片里的软件。

    传输方式那就太多了,基本有的通信方式理论上都可以进行传输升级,包括CAN、SPI、IIC、USART等等。做过汽车上面的CAN升级、USART升级、SD卡升级、OTA升级。其中CAN和USART升级都是在线升级,SD卡可以称之为离线升级。就是不用PC端,在线下插入SD卡,就可完成升级。(CAN和USART如果有硬件升级的设备,也可以做成离线升级)。

    讲一下SD卡的升级,使用离线升级,设备端需要有SD卡槽,升级的时候,将升级的文件放入SD卡中,再插入卡槽完成升级。(SD卡使用的SPI驱动,原理上其实也可以称为SPI升级。。。)

    这里使用STM32F103RCT6的芯片制作SD卡Bootloader。


, |) `- G# m" U# J: ^

一.硬件

    我使用的原子mini开发板,芯片为STM32F103RCT6,带SPI驱动的SD卡槽。

+ ^  h7 }, s& k2 M  q! l5 j

二.软件(寄存器编码,为的是减少Bootloader的代码占用空间)

1. SD卡使用的是SPI驱动。SPI1_Init()初始化,SPI1_ReadWriteByte读写。


- @8 O' L5 Q5 n4 i

8 K' j8 w1 G$ |2 G; {) d

2. SD卡驱动和FATFS文件系统。读SD卡、写SD卡、初始化SD卡等等,都是写好的驱动程序,直接可以用。这里也是用到了FATFS文件系统,需要移植两个文件。这里不多说。

6 ^% @, R% }% y: C+ o# b) {" {

. o- K0 D7 o- ^


; b8 @! t, N3 j3 Y

3. 芯片Flash的操作。由于升级APP程序片需要用到Flash的操作,所以Flash的擦除,写入不能少。

' z, j/ k" n1 |" l% M! P( [4 {+ c


: Q# K( @7 w: y/ R

4. APP程序跳入。当Flash里面写入了更新后的程序,需要跳转到Flash的起始地址,所以有一个函数需要。

' s: c2 N7 ^+ [6 i6 D' r8 y

" _4 b$ k  B: {0 ?

5. 应用部分:

  首先选择一个起始地址,是需要刷写程序的起始地址。只要大于Bootloader程序的总长度,并且APP程序的长度不能超过(芯片大小 - Bootloader程序大小)即可。

  然后Flash中选取一个地址作为标志位,用于判断是否需要更新程序。

  最后就是读取SD卡里的文件,把读取的写入到对应的Flash里面,完成跳转。


% T' E6 _0 ^+ O. _( u8 t) s! P
. _" v! |( ~& f

5 G% T) {* A# ^

    Main函数,先检测0x08002FFE这个地址的标志位,如果是0x02,说明有应用APP程序,不需要进行升级,所以直接iap_load_app(FLASH_APP_ADDR)跳转到APP的起始地址,开始运行程序,BOOT程序就到这里结束。

如果不是0x02,说明是新的芯片,或者是没有进行过升级的。就开始进行BOOT程序的升级流程SD_Update()。


( l2 q7 D8 ~; k' O( O/ \& S/ Y' b% G


' @) @# A* o% P" Z! K

  这里是打开SD卡、挂载的一些操作。如果成功进行到下面。

2 o: E0 B* Q" D8 |' ]! {$ }
4 L1 l" i0 l( m& h7 r


. B5 G5 F; V- ^8 p& }# h0 A) _2 ?7 N) r

    f_read读取SD卡中的文件&file,并赋值到buffer数组中,STMFLASH_ErasePage擦除一片FLash区域,STMFLASH_WriteHalfWord进行写入。写入完成后PageOffest += STM_PAGE_SIZE,记录写入的片数,继续读SD卡的文件(注意,这里不是一次性全部读完,每次读取STM_PAGE_SIZE的大小,再写入),擦除写入。。。直到(res || br = 0),没有可读的,break,退出while(1)循环。擦除标志位的地址STMFLASH_ErasePage(0x08002FFE),并写入0xFF02,*(vu16*)(u16)(0x08000000 + 0x2FFE)=0xFF02(下次上电后读到这个0x02的标志位说明已经有APP程序了,直接跳转到APP地址就好了)。

  最后iap_load_app(FLASH_APP_ADDR),SD卡的Bootloader流程结束,进入到APP程序中运行了。

---------------------- H# {' I2 i* {
作者:小叶三千


$ r' @0 }" A; {1 f9 c
赞 收藏 评论0 发布时间:2022-12-10 23:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版