上篇回顾
上一篇写了flash地址的分配,硬件函数的初始化和简单讲述了程序的升级。
具体连接如下:
基于SMT32的BOOT程序(一)
源码连接:
一种基于STM32单片机的boot升级程序
这章我们来详细讲解升级过程。下一章我们将讲解上位机的编写。
升级步骤
1.上一篇章告诉大家最后定义三条协议用来升级,第一个准备升级命令,由于升级程序bin文件可能会比较大,所有我们需要将文件进行分包传输,建议在升级命令内容中包括上 分包的包数,每包传输的大小以及最后一包的大小,这样方便处理。
2.发送完准备协议以后,开始发送数据内容,协议中最好带上当前包的编号,以便和准备协议中进行对比。如果文件不是很多或者单片机flash比较大,可以直接定义一个大缓存进行存储。如果flash 不够大,那就只能定义一个小缓存存储。
3.当boot程序检测到步骤二已经到了最后一包以后,就知道内容传输完毕。
4.当步骤二用的大缓存,则可以所有的数据接收完成后,直接一次性的写入flash中,写入的flash的首地址为 最初定义的 app入口地址,当步骤二用的小缓存的时候,那么需要才去的方式是 接收到一包数据,进行一次flash 的写入,这时候每次写入的地址注意需要累加,不要写错。
5.当所有的内容写完以后,可以发送一条升级程序的指令,这是进行程序跳转即可。
app程序的配置
第一章中我们已经定义好了app程序的入口地址,如果我们在应用程序中不进行地址配置,那么默认的程序运行地址就是0X8000000,由于我们修改了起始地址,所以app程序的地址我们需要进行偏移,其中两个进行修改的地方:
1.修改起始地址和空间大小
2.在程序中进行偏移,在程序的最开始,加入如下这句代码即可:
NVIC_SetVectorTable(NVIC_VectTab_FLASH, FLASH_SIZE_BOOT); //FLASH_SIZE_BOOT指我们定义的boot大小
3.至此,我们的boot程序完成。