STM32 bootload升级
一、boot升级意义
在传统的硬件设备中,设备功能在出厂后就被固化,普通用户难以改变产品软件功能,而随着技术的升级,绝大多数的单片机已经具备IAP(在应用编程)能力,我们可以通过软件代码实现单片机flash和中断向量表的编程。
而当单片机具备这种能力后,普通用户可以通过有线或者无线的方式对硬件产品进行软件升级,当各位掌握这种升级方式后,我们就可以采用“小步快跑,逐步跌打”的物联网思伟进行软件产品开发,而无需担心自己的软件功能因为有bug而在公司长期测试了。
二、STM32 boot load设计技巧
Boot程序主要有两个功能:1、将接收到的app写入到指定的flash地址;2、将程序运行指正跳转到指定位置;
在boot中不要使用定时器中断,因为使用定时器中断后,单片机的中断向量表已经被初始化后,在后续使用中断向量表时,系统会跳转到原来的中断向量表而导致程序跑飞。若一定要要使用定时器,可以使用查询的方式来进行操作。
在进行运行地址跳转的时候,记得把自己使用的外设关闭掉并把flash写操作禁止掉,否则在跳转后,对应的外设依然会继续工作,而导致你的程序出错。
三、软件核心代码
1.中断跳转
user_app Jump_To_Application;/*跳转函数指针*/
u32 JumpAddress;/*跳转地址*/
#defineIN_FLASH_END0x08010000/*内部flash,flash最大值64kb stm32f103c8 */
#define IN_FLASH_SECTOR 1024 /*内部flash 2k一个扇区,一次要擦除一个扇区单位*/
#define FLASH_WAIT_TIMEOUT 100000
#define ApplicationAddress 0x8006000
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
{
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) ApplicationAddress);
Jump_To_Application();
}
2.Flash编程
void imWrieFlash(void)
{
u32 i;
for( i=0;i
{
if(FLASH_WaitForLastOperation(FLASH_WAIT_TIMEOUT)!=FLASH_TIMEOUT)
{
FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
}
char2long.char_4[3] = FLASH_TMP_BUF[i*4+3];
char2long.char_4[2] = FLASH_TMP_BUF[i*4+2];
char2long.char_4[1] = FLASH_TMP_BUF[i*4+1];
char2long.char_4[0] = FLASH_TMP_BUF[i*4];
FLASH_ProgramWord(IN_FLASH_STAR + flashWriteAdd, char2long.long_1);
flashWriteAdd+= 4;
}
memset(FLASH_TMP_BUF,0,IN_FLASH_SECTOR);
}
3.关闭已配置的外设
TIM_DeInit(TIM2);
DMA_DeInit(DMA1_Channel3);
DMA_DeInit(DMA1_Channel5);
USART_DeInit(USART1);
领取专属 10元无门槛券
私享最新 技术干货