不需求拆机就能对产品进行固件晋级是很多人想要的作用,不只便利并且节约精力和本钱。那么怎么完结这项作业呢?接下来所介绍的Bootloader就能够完结这项作业,经过Bootloader引导程序完结固件的晋级。下面来浅析STM32 Bootloader规划。
规划思维
由Bootloader担任检测SD卡中是否有固件更新所需的BIN文件。假如检测到所需求的BIN文件,则开端仿制文件更新固件。更新完毕后跳转到指定的地址开端履行最新的程序。能够在论坛的ARM版块找到liklon的帖子:两份简略的 Bootloader 程序。链接为:http://forum.eepw.com.cn/thread/238997/1帖子里现已同享了两份简略的STM32 Bootloader程序,一份是使用znFAT进行SD卡上文件操作,第二份是使用FATFS进行文件操作。
常识关键
STM32内部FLASH的开端地址为0X08000000,Bootloader程序文件就从此地址开端写入,寄存APP程序的首地址设置在紧跟Bootloader之后。当程序开端履行时,首要运转的是Bootloader程序,此刻Bootloader检测SD卡中的BIN文件并将其仿制到APP区域使固件得以更新,固件更新完毕后还需求跳转到APP程序开端履行新的程序,完结这最终这一步要了解Cortex-M3的中止向量表:
程序发动后,将首要从“中止向量表”取出复位中止向量履行复位中止程序完结发动,当复位中止程序运转完结后才跳转到main函数。由此可见,在最终一步的规划中需求依据寄存APP程序的开端地址以及中止向量表来设置栈顶地址,并获取复位中止地址跳转到复位中止程序。接下来开端剖析程序规划过程。
Bootloader程序规划
1.确认寄存APP程序的首地址
#define FLASH_APP_ADDR 0x08010000 //应用程序开端地址(寄存在FLASH)上一句代码中是0X08010000能够看出,留给Bootloader程序的存储空间巨细为64K。寄存APP程序的开端地址为0X08010000。
2.Bootloader检测是否有BIN文件
gCheckFat = f_open(&FP_Struct,"/APP/LIKLON.BIN",FA_READ);//判读gCheckFat确认上面的代码是检测是否存在liklon.bin这个文件存在,其间liklon.bin文件便是固件晋级所需求的BIN文件。
3.仿制文件到指定地址
上一步中假如gCheckFat为0则表明存在所需BIN文件,则能够履行这一步。f_read (&FP_Struct,ReadAppBuffer,512,(UINT *)&ReadNum); //读取512个字节将512个字节转换为256个16位的数据寄存在ChangeBuffer数组中,预备写入FLASH。FlashWrite(FLASH_APP_ADDR + i * 512,ChangeBuffer,256); //向指定地址写入读出数据向APP程序区写入512个字节的数据。依照这样读取写入,就能够完结对APP程序区的更新。