STM32F030F4P6 仅在从闪存启动时运行中断处理程序。从引导加载程序启动时重置
Posted
技术标签:
【中文标题】STM32F030F4P6 仅在从闪存启动时运行中断处理程序。从引导加载程序启动时重置【英文标题】:STM32F030F4P6 runs interrupt handler only when booting from flash. Resets when booting from bootloader 【发布时间】:2019-07-18 09:32:04 【问题描述】:代码 -
#include<stm32f030x6.h>
void _delay_ms(unsigned int del)
//Delay with systick
void sys_init()
//Set Clock to 6 * 8MHz crystal
void TIM14_IRQHandler(void)
//If UEV was generated, toggle PA4 (Connected to LED)
if(TIM14->SR & TIM_SR_UIF)
GPIOA->BSRR = (GPIOA->ODR & GPIO_ODR_4)?(GPIO_BSRR_BR_4):(GPIO_BSRR_BS_4);
TIM14->SR &= ~TIM_SR_UIF;
int main(void)
sys_init();
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
RCC->APB1ENR |= RCC_APB1ENR_TIM14EN;
GPIOA->MODER = 0b1 << GPIO_MODER_MODER4_Pos;
//GPIOA->AFR[0] = 4 << GPIO_AFRL_AFRL4_Pos;
//Init timer
TIM14->ARR = 731;
TIM14->PSC = 0xffff;
TIM14->DIER |= TIM_DIER_UIE;
TIM14->CR1 |= TIM_CR1_CEN;
NVIC_EnableIRQ(TIM14_IRQn);
NVIC_SetPriority(TIM14_IRQn, 0);
while(1);
正如问题中提到的,当我直接从闪存启动(BOOT0 连接到 GND)时,这段代码工作得很好,但在使用引导加载程序时它不起作用。一旦引发中断,芯片就会重置并再次返回引导加载程序。我该如何解决这个问题? 我应该提一下,我使用了自定义的 linker script 和经过大量修改的 boot.s。
【问题讨论】:
【参考方案1】:您遇到了此微控制器中使用的 Cortex-M0 内核的限制。
Cortex-M0 只能使用映射在地址 0x0 的中断向量表。当微控制器配置为引导至引导加载程序时,系统内存映射到地址 0,因此引导加载程序的向量表用于所有中断。因此,您无法在通过引导加载程序启动的应用程序中安全地使用中断。
在 Cortex-M0+ 及更高版本上,您可以设置 SCB->VTOR
以使用位于内存中其他位置的向量表。但是,该寄存器在 Cortex-M0 部件(如 STM32F0)上不存在,因此不适合您。
考虑使用 ST-Link 等 SWD 编程器代替引导加载程序对微控制器进行编程。这也将允许您调试您的应用程序。
【讨论】:
感谢您的回答。我知道你不能偏移向量表,但不知道你不能执行中断,因为你可以在引导加载程序模式下很好地运行重置处理程序(使用 stm32flash -g 0) 我没有具体调查,但我怀疑这实际上并没有作为中断发生。 STM32 引导加载程序协议没有“reset into flash”命令。它确实有一个“跳转到地址”命令,但地址是随命令提供的;stm32flash
可能正在从二进制文件中读取重置向量。
虽然向量表必须从地址 0 开始,但 MCU 可以将内部 RAM 映射到那里,因此应用程序可以将向量表复制到 RAM 的开头,并将 SYSCFG
中的映射更改为MCU 使用新的向量表。【参考方案2】:
根据duskwuffs cmets 的说法,由于您指向boot.s 和linker.script 的链接可以正常工作,我假设您的向量表仍然是引导加载程序中的那个,并且您的应用程序中断只是跳转到那里。如果您的引导加载程序没有在该向量表上映射 ISR,那么它可能只会发出复位(由于非法地址/指令而导致的陷阱/异常)。您也许可以使用通用向量表间接跳转到 RAM 提供的向量表,并在启动代码中被您的应用程序覆盖。
【讨论】:
以上是关于STM32F030F4P6 仅在从闪存启动时运行中断处理程序。从引导加载程序启动时重置的主要内容,如果未能解决你的问题,请参考以下文章
使用STM32F030F4P6的SPI协议和NRF24L01模块进行通讯 实现无线数据的收发