STM32F103 IAP升级----Bootloader+APP(FreeRTOS)

  1. 环境:

STM32F103C8T6,keil5

  1. Flash分配:

Boot地址:0x08000000,大小:16K

App地址:0x08004000, 大小:48K

  1. IAP跳转程序

if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
{
    Serial_PutString("Start program execution......\r\n\n");
    __set_PRIMASK(1);    /*关闭全局中断,APP程序中带有RTOS时,这个很重要*/

    /* 关闭滴答时钟,复位*/
    SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;
    HAL_SuspendTick();        // 挂起滴答定时器
    /* 设置所以时钟默认状态 */
    HAL_RCC_DeInit();

    /* 关闭所有中断,清除中断挂起标志 */
    for (i = 0; i < 8; i++)
    {
        NVIC->ICER[i]=0xFFFFFFFF;
        NVIC->ICPR[i]=0xFFFFFFFF;
    }    
    
    /* execute the new program */
    JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
    
    __set_PSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
    /* Jump to user application */
    JumpToApplication = (pFunction) JumpAddress;
    /* Initialize user application's Stack Pointer */
    __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);    /* 设置主堆栈指针 */
    
    /* 在 RTOS 工程,这条语句很重要,设置为特权级模式,使用 MSP 指针 */
    __set_CONTROL(0);
    
    JumpToApplication();
}
  1. APP程序

APP程序按照正常的用户程序编写,编写完成之后修改中断偏移量,修改keil中地址。

4.1 修改中断偏移量

修改前:

修改后:

4.2修keil中的地址:

修改前:

修改后:

  1. 总结

(1)APP程序在裸机运行的情况下,Bootloader程序在跳转应用程序之前不关闭中断,跳转后应用程序可以正常运行。

(2)APP程序在FreeRTOS运行的情况下,Bootloader程序在跳转应用程序之前必须关闭中断,否则跳转后应用程序会跑飞。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值