STM32 bootload 升级

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);

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180510G22EK600?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

同媒体快讯

扫码关注腾讯云开发者

领取腾讯云代金券