STM32F1 Bootloader(IAP)原理及实现

STM32F1(CORTEX-M3) 支持中断向量重定向,也就是可以重新设置中断向量在FLASH中的地址,这个功能使IAP实现变得非常完美。

1.BOOT程序放在flash开始处
   如下图,实现Bootloader的程序(BOOT)放到Flash开始地址(物理)处0x8000000,这也是芯片复位后开始执行的地址,上电时BOOT程序先执行。

 

2.主要功能程序
 
  从UART读取数据后写入flash这里不说明,可使用ST库函数轻松实现,以下为如何实现向用户程序的跳转:

  #define MAIN_USER_FLASH_BEGIN 0x8003000 //用户程序存储地址,前12K字节用于bootloader

  typedef void (*RESET_FUNCTION )(void); //复位函数模型
 
  //从BOOT程序跳转到用户程序
  void ExecApp(void)
  {
   uint32_t jump_addr=*((__IO uint32_t *)(MAIN_USER_FLASH_BEGIN+4));
    RESET_FUNCTION Reset=(RESET_FUNCTION)jump_addr;

   // ....

   __set_MSP(*(__IO uint32_t*)MAIN_USER_FLASH_BEGIN);
   Reset();
}

3.用户程序(APP)
  如下图,用户程序的应定位到boot程序指定的用户程序开始地址处(示例中为0x8003000)


 

用户程序得到执行后首先需要做的就是将中断向量 重新映射到用户程序的开始处,这样产生中断时程序不会跳到BOOT程序的中断。

代码如下:

int main(void)
{
  //重新映射中断向量,(STM32F1支持中断向量在flash中的重新映射)
  NVIC_SetVectorTable(0x08000000,0x00003000);

 //...

}


示例源代码:

下载

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值