使用Xmodem-1k协议通过串口升级的BootLoader
硬件使用江科大stm32套件,写一个采用Xmodem-1k协议通过串口升级的bootloader,并预留W25Q接口用于后续的远程升级
功能概述
要实现Xmodem-1k协议通过串口升级的bootloader,需实现以下部分
实现flash分区、操作及状态管理,即实现对flash的boot和app分区,flash的读写和状态管理
实现串口中断接收状态切换,即实现升级命令到接收升级包的状态切换
实现Xmodem-k协议完成升级包的校验与接收
实现接收完升级包后进行新程序位置的跳转执行
升级流程
升级流程主函数如下
上电进行优先级划分与串口初始化
重置IAP状态,即初始化接收模式,清空数据缓冲计数,清除内部Flash擦除标志
做W25Q初始化,并根据是否初始化成功选择升级或直接跳转应用,即升级依赖W25Q初始化(用于后续远程升级)
进入升级流程,根据主机发送开始升级标志进入Xmodem-1k下载模式
接收升级包校验完成后,跳转app地址,执行新程序
Flash分区、操作及状态管理
Flash的分区划分
c8t6的Falsh为64KB,一页为1KB,即64页。这里使用前16页作为boot占用,后48页用于app使用。
实现对于Flash的操作与状态管理
Flash_Erase_Page_Manage
管理Flash页擦除标志,避免重复擦除同一页
维护一个静态数据用于记录每一页是否进行擦除
Get_Flash_PageNumber
通过传入的地址判断其在那一页,通过地址偏移量和Flash页大小得到页数
STMFLASH_Write
将数据写入到内部Flash(需擦除相关页),writeAddr写入的起始地址(word对齐),pBuffer指向写入的内容,numToWrite需要写入的word数量(word即4字节)
通过写入地址和需写入的word数量,得到写入结束地址
通过Get_Flash_PageNumber得到起始和结束的Flash页码
得到每一页的起始地址,对页进行擦除,首先解锁Flash
Flash擦除完成后进行按word写,写完成后对Flash进行上锁
STMFLASH_ReadWord
从Flash中读取一个word,即根据传入的地址,读取32位数据
STM32FLASH_Read
从Flash读取任意长度字节数据,addr即起始地址,buf接收缓冲区,len要读取的字节数
通过len判断要读取多少个word,使用STMFLASH_ReadWord从地址读取,并写入到buf中
IAP_Write_AppBin
将升级固件写入到app区域,appAddr目标写入地址,appBuf指向固件数据,appSize固件总字节数
将需要写入的字节组成word
创建一个全局静态缓冲区,将word写入其中,每次缓冲区满的时候,进行一次STMFLASH_Write
最后将不足一个缓冲区的数组写入Flash
串口数据接收与状态切换
实现上电启动时,当串口接收到发送的download字符串时,切换文件下载模式,根据Xmodem-1K协议头判断是否出错
实现Xmodem-k协议完成升级包的校验与接收
即IAP的核心,对接受的数据进行接收、校验与跳转(涉及到Xmode-1k协议相关内容,参考上一篇Xmodem-1k内容)
这里定义Xmodem-1k的相关标志,以及核心的com_iap全局结构体
Iap_Up_Init
初始化IAP状态,即初始化接收模式,清空数据缓冲计数,清除内部Flash擦除标志
Check_Iap_Up_Data
上电判断是否需要进行本地下载升级包
上电一段时间内轮询recvfileMod标志,判断是否进入升级路程,若轮询结束未收到升级标志,则直接跳转app地址执行
recvfileMod为1则进入本地Xmodem-1k升级路程,向上位机打印输出升级提醒,并进入down_load_file,根据返回值判断跳转
down_load_file
实现接收校验并写入Flash逻辑
根据Xmodem-1k协议,给平台发送C,提示平台开始发送升级包,接收到Xmodem-1k的XM_STX数据头,则开始接收
根据Xmodem-k协议,在start_recv进行接收
start_recv
完成升级包的接收、校验与写入
若数据包头为XM_STX,则正常接收,对收到的数据包进行长度、标志头、CRC、包id和包序进行校验
校验通过,则清空数据缓冲计数,用于下一包接收,并将接收到的数据包使用IAP_Write_AppBin写入到Flash中
写入Flash后,在进行一次crc校验,即对写入的数据计算crc,并再次读取写入的数据包,计算crc。二者进行校验
成功则向平台发送XM_ACK,并更新包id和下一次写入Flash位置,失败则关闭中断并复位
平台根据Xmodem-1k发送XM_EOT,即升级包发生接收完毕,此时返回应答,并跳转Boot_Jump
实现接收完升级包后进行新程序位置的跳转执行
Boot_Jump
从指定地址读取MSP和Reset_Handler,设置向量偏移表、MSP并跳转执行应用程序
接收完升级包后,读出栈顶指针和复位向量。
设置中断向量表,设置主堆栈指针
跳转新地址执行程序
至此,采用Xmodem-1k协议通过串口升级的bootloader编写完毕。
浙公网安备 33010602011771号