问题原因:
Bootloader引导用户下载完程序需要跳转到APP的地址去执行用户程序,但是在M0系列的芯片不支持SCB->VTOR的使用;
解决方案:
memcpy((void*)0x20000000, (void*)0x08004000, VECTOR_SIZE);//将向量表复制到RAM中,起始地址0x20000000,长度VECTOR_SIZE
SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);//重定向向量表到RAN中
通过将向量表重映射到RAM中解决该问题;
1.根据startup_stm32f030xc.s中的向量表可以计算出大小;
每一个DCD都代表一个中断向量(所谓中断向量,说得明白点,其实就是某个中断服务程序的入口地址)
DCD USART1_IRQHandler ; USART1
这里的“USART1_IRQHandler"其实就是UART1中断服务程序USART1_IRQHandler这个函数,同时,它也代表这个函数的入口地址。
以上代码即定义了这样一张表,这张表包括45个元素,每个元素是一个长度为4字节的地址。除了第一个地址是SP(堆栈指针)外,其它的地址都是某个中断服务程序的入口地址。
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD WWDG_IRQHandler ; Window Watchdog
DCD 0 ; Reserved
DCD RTC_IRQHandler ; RTC through EXTI Line
DCD FLASH_IRQHandler ; FLASH
DCD RCC_IRQHandler ; RCC
DCD EXTI0_1_IRQHandler ; EXTI Line 0 and 1
DCD EXTI2_3_IRQHandler ; EXTI Line 2 and 3
DCD EXTI4_15_IRQHandler ; EXTI Line 4 to 15
DCD 0 ; Reserved
DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
DCD DMA1_Channel2_3_IRQHandler ; DMA1 Channel 2 and Channel 3
DCD DMA1_Channel4_5_IRQHandler ; DMA1 Channel 4 and Channel 5
DCD ADC1_IRQHandler ; ADC1
DCD TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger and Commutation
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD 0 ; Reserved
DCD TIM3_IRQHandler ; TIM3
DCD TIM6_IRQHandler ; TIM6
DCD TIM7_IRQHandler ; TIM7
DCD TIM14_IRQHandler ; TIM14
DCD TIM15_IRQHandler ; TIM15
DCD TIM16_IRQHandler ; TIM16
DCD TIM17_IRQHandler ; TIM17
DCD I2C1_IRQHandler ; I2C1
DCD I2C2_IRQHandler ; I2C2
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD USART3_6_IRQHandler ; USART3, USART4, USART5, USART6
2.重映射向量表到RAM;
SYSCFG->CFGR1 |= 0x03;//重定向向量表到RAM中
__HAL_SYSCFG_REMAPMEMORY_SRAM();
3.修改APP工程中的RAM;
2024年4月22日:
问题描述:
在Bootloader中引导完APP固件下载后,跳转到APP后设备卡死;
解决方案:
Debug查看RAM,发现向量表已经成功复制,转而分析APP,通过LED闪烁确认APP是否开始运行,发现初始化中只要开启了中断LED灯就不再闪烁,确认问题为中断引起的,在网上查找资料,最终解决问题;
解决STM32进行IAP升级跳转至APP后无法进中断问题_bootloader跳转到app不进中断-CSDN博客
在mian函数的起始加一句:
__enable_irq();
Bootloader引导程序跳转前会关闭中断,进入APP后需要开启中断;