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