[应用相关] boot bootloader基于stm32

[复制链接]
2359|2
 楼主| xiaoqizi 发表于 2024-9-7 13:29 | 显示全部楼层 |阅读模式
实验平台使用的是STM32F103RCT6核心板。
使用的是HAL库,keil开发环境。

实验效果:上电先运行 bootloader ,LED D4(pc2) 闪烁 10 次后进入 APP,仅供学习参考。

一、bootloader 部分

1、打开CUBEMX,选择F103RCT6,配置外部时钟,如图

3336066dbe451b5535.png

2、配置串口如图

7019366dbe456dfdc3.png

3、配置io口如图(PC2 为LED D4的io口)

7016566dbe45d79589.png

3460666dbe46638305.png

4、时钟配置,如图

4590666dbe46e27f65.png

5、工程保存位置选择、生成代码

8617066dbe47356828.png

1668466dbe47868967.png

然后点击生成代码

78066dbe47d4e0cf.png

6、在 main.c 中编写代码

如图

4645866dbe481d5857.png

2662666dbe48b5b992.png

(还不会用printf的朋友可以看上一篇文章,很简单 直接复制过来即可)

typedef void (*jump_func)(void);        //函数指针

jump_func myAppEntry;

uint32_t appxaddr = 0x8008000;

//初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
void sys_msr_msp(uint32_t addr)
{
    __set_MSP(addr);    /* 设置栈顶地址 */
}
/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_USART1_UART_Init();

        printf("ST bootloader\n");
        //应用程序地址
        myAppEntry = (jump_func)*(volatile uint32_t *)(appxaddr + 4);
       
  uint8_t i = 0;

  while (1)
  {

        printf("ST bootloader\n");
        HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);
        HAL_Delay(300);
        HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_RESET);
        HAL_Delay(300);
       
          if(i++ >= 10)
          {

        //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
                sys_msr_msp(*(volatile uint32_t *)appxaddr);
                  
                myAppEntry();
          }
          
  }

}

这里说明一下,我们一共烧录两个程序,第一个程序是 bootloader ,烧录的地址和大小设置如图:

4587466dbe49550897.png

第二个程序是APP的程序,烧录的地址和大小设置如图:

4136466dbe49b8fbdc.png

这里其实可以看出来 appxaddr 为什么是0x8008000这个值了,0x8000000+0x8000表示APP的起始地址。

由于要烧录两个程序,所以烧录的时候不能全片擦除,设置如下:

点击

9565466dbe4a1037a5.png

5495566dbe4a58d02e.png

2111566dbe4aa4a31c.png

这样我们的 bootloader 就制作完成了。

二、APP 的制作

我们直接做一个 LED D4(PC2)  、LED D5(PC3) 一起闪烁的效果区分 bootloader 。

只配置两个io口和串口即可

7551066dbe4afaa8b8.png

外部时钟选择和时钟的配置和bootloader一样即可,这里就不再赘述了,直接生成代码。

生成代码后

1、为了确保中断功能的正常使用,需要修改中断向量表,如图

5193166dbe4b5408b6.png

2、修改代码下载地址,避免将bootloader 的程序擦掉

6953866dbe4ba0b1a2.png

3、同样选择部分擦除,避免烧录时全片擦除,将bootloader 擦掉了

2374266dbe4bf8c31e.png

到这里就可以下载测试了。

7637466dbe4c4a3e0f.png

总结:

1、烧录两个程序 :一个bootloader 一个 APP

2、两个程序的烧录位置要区分开

6326166dbe4cb21963.png

3、烧录时不能全片擦除 避免擦掉 bootloader
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_56420043/article/details/141818027

sfd123 发表于 2024-9-8 13:25 | 显示全部楼层
flash要分开 我能理解,RAM为啥 要分开?
AdaMaYun 发表于 2024-9-9 17:35 | 显示全部楼层
这个确实是比较不错,区分不同的地址进行程序下载
您需要登录后才可以回帖 登录 | 注册

本版积分规则

130

主题

4344

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部