c - STM32F103 Timer2不中断

标签 c arm embedded stm32 iar

背景

我对 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/

相关文章:

c - 为什么如果我使用 cin,这段代码在 C++ 中工作正常,但当我在 C 中使用 scanf 时却失败了?

将缓冲区中的数据从每个元素 16 位压缩到 12 位

我可以在不使用堆的情况下编写 C 应用程序吗?

embedded - 令人沮丧的 FreeRTOS xQueueCreate() 限制

c++ - x86_64 和 ARM 上的原子 CAS 操作是否始终使用 std::memory_order_seq_cst?

c - 如何为 Zynq 7000 ARM 开发板编写 SPI 驱动程序?

Python 在数组列表中搜索字符串

c - 运行时实体和加载时实体

c - 使用终端而不是 Xcode 运行 C 脚本

docker - 从 Ubuntu amd64 到 arm7l : exec user process caused "exec format error" 进行交叉编译