• STM32 BootLoader设置


    编写bootloader程序:

    1. 直接复制下面代码到自己程序中。
    1. typedef void (*iapfun)(void); //定义一个函数类型的参数.
    2. iapfun jump2app;
    3. //设置栈顶地址
    4. //addr:栈顶地址
    5. __asm void MSR_MSP(u32 addr)
    6. {
    7. MSR MSP, r0 //set Main Stack value
    8. BX r14
    9. }
    10. //跳转到应用程序段
    11. //appxaddr:用户代码起始地址.
    12. void iap_load_app(u32 appxaddr)
    13. {
    14. delay_ms(500);
    15. if(((*(vu32*)appxaddr)&0x2FF00000)==0x20000000) //检查栈顶地址是否合法.
    16. {
    17. debug("跳转到主程序\r\n");
    18. GPIO_RESET(USB_EN);
    19. delay_ms(500);
    20. jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
    21. /* 关闭全局中断*/
    22. __set_PRIMASK(1);
    23. /* 关闭滴答定时器,复位到默认值*/
    24. SysTick->CTRL = 0;
    25. SysTick->LOAD = 0;
    26. SysTick->VAL = 0;
    27. /* 设置所有时钟到默认状态 */
    28. HAL_RCC_DeInit();
    29. /* 关闭所有中断,清除所有中断挂起标志*/
    30. for(u8 i=0;i<8;i++)
    31. {
    32. NVIC->ICER[i] = 0xFFFFFFFF;
    33. NVIC->ICPR[i] = 0xFFFFFFFF;
    34. }
    35. /*使能全局中断 */
    36. __set_PRIMASK(0);
    37. /* 在RTOS工程,这条很重要,设置为特权模式,使用MSP指针*/
    38. __set_CONTROL(0);
    39. MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
    40. jump2app(); //跳转到APP.
    41. }else
    42. {
    43. debug("栈顶地址不合法\r\n");
    44. }
    45. }

    2 . 编写程序,接收应用程序的BIN文件,通过FLASH WRITE函数写入到目标扇区

    3. 跳转到应用程序

    iap_load_app((u32)0x08005000);	// 跳转到主程序

    计算应用程序的大小:

    • 方法一:

            查看编译输出计算:

    • 方法二:

    输出文件中找到.map文件,文件最后有计算结果

    应用程序

    1. 设置程序存放的起始地址:
      需要计算APP程序大小和bootloader程序大小,根据芯片扇区,合理安排位置。
      如果0x80000000存放bootloader,需要计算出bootloader的大小,然后在后面地址存放应用程序。
      我的bootloader大小是19k多,留出20K的空间。在0x8005000的位置存放该应用程序。
    2. 修改KEIL设置如下,填写起始保存地址,计算出空间大小。

    3. 

    在main函数开始位置添加:

    SCB->VTOR = ((u32)0x08005000);

    4. 设置KEIL中自带的工具,编译工程,生成.bin文件

    设置环境变量:

    KEIL软件输入命令

    fromelf.exe --bin -o  ..\MDK-ARM\$PROJECT$\$PROJECT$.bin   ..\MDK-ARM\$PROJECT$\$PROJECT$.axf

    编译后生成下载所需的bin文件。

  • 相关阅读:
    无涯教程-JavaScript - MATCH函数
    HTML5表单验证
    华为OD:敏感字段加密
    参数化建模 vs. 直接建模【CAD】
    JAVA 单例模式
    ROS三种通信方式之话题通信
    dockerfile制作-pytoch+深度学习环境版
    第P7周—咖啡豆识别(1)
    【Matlab】笔记:matlab Optimization Tool使用一——pattern search
    Spring修炼之旅(4)静态/动态代理模式与AOP
  • 原文地址:https://blog.csdn.net/laocui1/article/details/133822047