stm32 bootloader写法

  1. bootloader写法:
    1. 假设app的起始地址:0x08020000,则bootloader的范围是0x0800,0000~0x0801,FFFF。
    2. #define APP_ADDR 0x08020000 // 应用程序首地址定义
      typedef void (*APP_FUNC)(void); // 函数指针类型定义
      /*main函数中调用rum_app,进入app程序,其中app_addr是app程序的flash首地址,也就是0x08020000*/
      void run_app(uint32_t app_addr)
      {
          uint32_t reset_addr = 0;
          APP_FUNC jump2app;
      
          /* 下面的判断语句是说app程序的烧写首地址存放的是SRAM中的栈地址,
      需要判断一下这个站地址是不是在以0x2000,0000为开始地址的SRAM,
      这个地址是stm32的内部RAM首地址。这里意义不大,因为首地址中存放的栈地址,
      是在启动文件中定义,由汇编编译器和链接器生成的不会有错 */
          if (((*(uint32_t *)app_addr) & 0x2FFE0000) == 0x20000000) // 判断是否是在128k的SRAM里面。
          {
              /* 设置栈指针,这是一个内联函数,定义在cmsis_armcc.h中 */          
      	    __set_MSP(*(volatile uint32_t *)app_addr); //把app_addr地址中的内容放到站寄存器中
              /* 获取复位地址 */
              reset_addr = *(uint32_t *)(app_addr + 4); //app程序入口地址是在0x08020004上
              jump2app   = (APP_FUNC)reset_addr;
             __disable_irq();; //hal库中的关所有中断函数
              jump2app();
          }
      }
      
      

    3.  /* Initialize all configured peripherals */
          MX_GPIO_Init();
          MX_USART1_UART_Init();
          /* USER CODE BEGIN 2 */   
          run_app(APP_ADDR);
          /* USER CODE END 2 */
      
          /* Infinite loop */
      
      在main中插入上面的代码run_app(APP_ADDR);就行

  2. app写法:
    1.  /* Configure the system clock */
          SystemClock_Config();
      
          /* USER CODE BEGIN SysInit */
          /*因为在项目启动文件(startup_stm32f401xc.s)中,会先于用户main函数之前,调用中断初始化函数SystemInit(system_stm32f4xx.c文件中),这个函数中有条语句:
      
        /* Configure the Vector Table location -------------------------------------*/
      #if defined(USER_VECT_TAB_ADDRESS)
        SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
      #endif /* USER_VECT_TAB_ADDRESS */
      
      其中:VECT_TAB_BASE_ADDRESS =FLASH_BASE=0x0800,0000
           VECT_TAB_OFFSET = 0
      
      这个中断向量表地址是没有跳转的中断向量表地址,所以需要用到下面的语句更换一下。
      
      */
          SCB ->VTOR = FLASH_BASE | 0x20000;//这里就是app程序的起始地址
      	__enable_irq();  //hal库开所有中断
          /* USER CODE END SysInit */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值