STM32 Bootload跳转到主程序,主程序运行异常问题分析

主程序中有一个变量,该变量是一个结构体类型

typedef struct at_cmd_s
{
  const uint8_t   type;                
  const char *    cmd;                  
  const uint8_t   len;                       
}at_cmd_t;

static at_cmd_t cmd_ati     = {1, "ATI",3};     

程序运行后,在主程序串口初始化完成后立即打印cmd_ati.type值,发现该值不是1了,将uint8_t改成uint32_t后,打印数值正常,但是这个不是根本原因,通过调试发现,在bootload跳转前关闭全局中断,在主程序SCB->VTOR = FLASH_APP_START_ADDR设置中断向量后在打开全局中断,打印该值正常了,因为打印在程序初始化阶段,没有数组越界问题,最终发现bootload中的SysTick_Handler一直在运行,跳转到主程序了,中断向量还没有改,中断服务函数将bootload中uwTick的内存地址数据进行的加加,所以bootload跳转到主程序前一定要关闭所有中断,程序初始化运行完后,在开启中断

__weak void HAL_IncTick(void)
{
  uwTick += (uint32_t)uwTickFreq;
}

你可能感兴趣的:(stm32,单片机,嵌入式硬件)