背景
我对 STM32 系列相对缺乏经验,所以我确信这很简单,我在某处缺少设置。
我正在尝试将计时器设置为简单地中断更新事件,这应该是在计数器在 TIM2->ARR
值处滚动时。
- 我目前正在定时器中断内设置一个断点,它根本不会触发
- 我尝试过使用其他定时器模块
- 计数器正在计数(我可以通过调试器观察到)
- 根据以下代码正确加载寄存器
- 计数器翻转时设置
TIM2->SR UIF
(更新中断标志)
代码
void TIM_init(void){
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
TIM2->PSC = 1000;
TIM2->ARR = 1000;
TIM2->DIER = TIM_DIER_UIE;
TIM2->EGR = TIM_EGR_UG;
NVIC_EnableIRQ(TIM2_IRQn);
DBGMCU->CR |= DBGMCU_CR_DBG_TIM2_STOP;
TIM2->CR1 |= TIM_CR1_CEN;
}
void TIM2_IRQHandler(void){
TIM2->SR &= ~TIM_SR_UIF; // clear the interrupt flag
}
我也试过如下设置优先级分组,结果相同:
void TIM_init(void){
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
TIM2->PSC = 10;
TIM2->ARR = 1000;
TIM2->DIER = TIM_DIER_UIE;
TIM2->EGR = TIM_EGR_UG;
// Enable the Timer2 Interrupts
uint32_t priorityGroup, priority;
priorityGroup = NVIC_GetPriorityGrouping();
priority = NVIC_EncodePriority(priorityGroup, 3, 6);
NVIC_SetPriority(TIM2_IRQn, priority);
NVIC_EnableIRQ(TIM2_IRQn);
DBGMCU->CR |= DBGMCU_CR_DBG_TIM2_STOP;
TIM2->CR1 = TIM_CR1_CEN;
}
该项目还包含一个汇编文件startup_stm32f10x.s
。该文件的摘录:
__vector_table
DCD sfe(CSTACK)
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler.....
继续,包括 TIM2_IRQHandler
。这向我表明那里有一个 vector 表。
最佳答案
这可能不是一个确切的解决方案,而是更多的建议,直到有人为您提供更好的解决方案。
Case 1:如果你的任务只需要像中断这样的几个驱动程序初始化,并且你有足够的时间,那么你可以明显地阅读整个初始化章节,对于你的案例中断章节。请注意以下几点。
- 章节中的小脚注。
- 异常参见时钟相关章节
- 异常(exception)情况见电源相关章节
在某些情况下,数据表会在时钟和电源章节中写入与初始化相关的信息,这偶尔会导致所需的驱动程序无法运行。
情况 2:如果您需要在有限的时间内完成多项初始化和大量开发工作,那么这里有另一种方法。
在我使用不同类型的 µc 的过程中,我发现最好将较低级别的初始化留给制造商,至少在开始阶段。如今,大多数制造商都可以选择在线或使用某种软件创建空白骨架项目。对于您的情况,它是 STM32Cube initialization code generator .
优点是您可以选择您的 µc 和相关驱动程序,它们将创建一个包含所有初始化的完整框架项目,有时还会用示例代码填充它以供您开始。它减少了开发人员通过较低级别的初始化并直接进行开发的工作量。你也可以看看他们的代码,了解驱动是如何初始化的,并做相应的修改。密切关注其初始化代码中的注释以供理解或随附的任何框架文档。
关于c - STM32F103 Timer2不中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48707220/