背景
我对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
. 这向我表明那里有一个向量表 .
1 回答
它可能不是一个确切的解决方案,但更多的建议,直到有人为您提供更好的解决方案 .
Case 1 :如果您的任务只需要很少的驱动程序初始化,如中断,并且您有足够的时间,那么您可以明确阅读整个初始化章节,为您的案例中断章节 . 请注意以下几点 .
本章中的小脚注 .
请参阅有关异常时钟的章节
请参阅与Power for exception相关的章节
在某些情况下,数据表会在时钟和电源章节中写入初始化相关信息,这有时会导致所需的驱动程序无法运行 .
Case 2 :如果您需要在有限的时间内进行多次初始化和大量开发,那么这里是另一种方法 .
在我使用不同类型的μc工作期间,我发现最好是为制造商留下较低级别的初始化,至少在开始阶段 . 现在,大多数制造商都可以选择在线创建空白骨架项目或使用某种软件 . 对于你的情况,它是STM32Cube initialization code generator .
您可以选择μc和相关驱动程序,它们将创建一个包含所有初始化的完整骨架项目,有时会填充示例代码以供您启动 . 它减少了开发人员通过较低级别初始化并直接进行开发的工作量 . 您还可以查看其代码,以了解驱动程序的初始化方式并进行相关修改 . 密切关注其初始化代码中的注释,以便了解它或随附的任何框架文档 .