gpt4 book ai didi

embedded - STM32F030F4P6 仅在从闪存启动时运行中断处理程序。从引导加载程序启动时重置

转载 作者:行者123 更新时间:2023-12-02 03:20:48 26 4
gpt4 key购买 nike

代码 -

#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 .

最佳答案

您遇到了该微 Controller 中使用的 Cortex-M0 内核的限制。

Cortex-M0 只能使用映射到地址 0x0 的中断向量表。当微 Controller 配置为引导到引导加载程序时,系统内存映射到地址 0,因此引导加载程序的向量表用于所有中断。因此,您无法在通过引导加载程序启动的应用程序中安全地使用中断。

在 Cortex-M0+ 及更高版本的部件上,您可以设置 SCB->VTOR 以使用位于内存中其他位置的向量表。但是,Cortex-M0 部件(例如 STM32F0)上不存在此寄存器,因此这不适合您。

考虑使用 SWD 编程器(例如 ST-Link)来代替引导加载程序对微 Controller 进行编程。这还允许您调试应用程序。

关于embedded - STM32F030F4P6 仅在从闪存启动时运行中断处理程序。从引导加载程序启动时重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54858415/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com