做过很多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。
一.硬件
我使用的原子mini开发板,芯片为stm32f103rct6,带spi驱动的sd卡槽。
二.软件(寄存器编码,为的是减少bootloader的代码占用空间)
sd卡使用的是spi驱动。spi1_init()初始化,spi1_readwritebyte读写。
sd卡驱动和fatfs文件系统。读sd卡、写sd卡、初始化sd卡等等,都是写好的驱动程序,直接可以用。这里也是用到了fatfs文件系统,需要移植两个文件。这里不多说。
芯片flash的操作。由于升级app程序片需要用到flash的操作,所以flash的擦除,写入不能少。
app程序跳入。当flash里面写入了更新后的程序,需要跳转到flash的起始地址,所以有一个函数需要。
应用部分:首先选择一个起始地址,是需要刷写程序的起始地址。只要大于bootloader程序的总长度,并且app程序的长度不能超过(芯片大小 - bootloader程序大小)即可。
然后flash中选取一个地址作为标志位,用于判断是否需要更新程序。
最后就是读取sd卡里的文件,把读取的写入到对应的flash里面,完成跳转。
main函数,先检测0x08002ffe这个地址的标志位,如果是0x02,说明有应用app程序,不需要进行升级,所以直接iap_load_app(flash_app_addr)跳转到app的起始地址,开始运行程序,boot程序就到这里结束。
如果不是0x02,说明是新的芯片,或者是没有进行过升级的。就开始进行boot程序的升级流程sd_update()。
这里是打开sd卡、挂载的一些操作。如果成功进行到下面。
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程序中运行了。
谷歌今年会发三款亲儿子手机?或全面屏设计?安卓原生粉丝有福了
指令如何执行
优联智能灯控系统升级:NB-IoT将引领智慧照明新风潮
怎样改进双位压差控制电路
华为P10再爆负面新闻:内存芯片以次充好,手机好坏全看运气?
基于使用STM32F103RCT6的芯片制作SD卡Bootloader
赛芯微:XB3303A 二合一单节锂电池保护芯片,匹配5V1A的移动电源输出
多媒体技术运用及主要特点
航空插头一般用在什么地方
晶圆和芯片级应用的边缘耦合效率
智能网联汽车信息安全实训平台-IVI的WiFi攻击实验
虚拟现实+医疗不断融合,中国虚拟现实市场潜力十足
魅族Flyme8系统截图曝光 有望在今年第四季度正式发布
Pydub音乐文件格式转换功能介绍
如何通过精益可视化工业电子看板实现信息化管理
温度记录仪在家用烤箱自动生产线测试中的应用
《中国移动2016年终端质量报告》 权威披露透露什么?
大数据怎样提高工作的质量和效率
基于碳化棉纤维的高性能柔性压力传感器
汽车电子产业链已决定以原有玩家为主的状况