stm32 NVIC_EnableIRQ() 裸机等效吗?

bli*_*ppy 3 interrupt bare-metal stm32

我正在使用蓝色药丸,并试图找出中断。我有一个中断处理程序:

void __attribute__ ((interrupt ("TIM4_IRQHandler"))) myhandler()
{
    puts("hi");
    TIM4->EGR |= TIM_EGR_UG; // send an update even to reset timer and apply settings
    TIM4->SR &= ~0x01; // clear UIF
    TIM4->DIER |= 0x01; // UIE
}
Run Code Online (Sandbox Code Playgroud)

我设置了定时器:

    RCC_APB1ENR |= RCC_APB1ENR_TIM4EN;
    TIM4->PSC=7999;
    TIM4->ARR=1000;
    TIM4->EGR |= TIM_EGR_UG; // send an update even to reset timer and apply settings
    TIM4->EGR |= (TIM_EGR_TG | TIM_EGR_UG);
    TIM4->DIER |= 0x01; // UIE enable interrupt
    TIM4->CR1 |= TIM_CR1_CEN;
   
Run Code Online (Sandbox Code Playgroud)

我的计时器似乎没有启动。但我认为我并没有真正启用它。我有没有??

我在很多示例代码命令中看到,例如:

NVIC_EnableIRQ(USART1_IRQn);
Run Code Online (Sandbox Code Playgroud)

NVIC_EnableIRQ() 到底发生了什么?

我用谷歌搜索过,但找不到与我的功能类似的实际裸机代码。

我似乎错过了关键的一步。

更新2020-09-23感谢本问题的回答者。技巧是在 NVIC_ISER 寄存器中设置中断号位。正如我在下面指出的,STM32F101xx 参考手册中似乎没有提到这一点,所以我可能永远无法自己弄清楚这一点;并不是说我有阅读数据表的真正技能。

不管怎样,哦,高兴,我成功地中断了工作!您可以在此处查看代码:https://github.com/blippy/rpi/tree/master/stm32/bare/04-timer-interrupt

Cod*_*odo 5

即使您使用裸机,您可能仍然希望使用CMSIS头文件,它提供非常基本的 ARM Cortex 元素的声明和内联版本,例如NVIC_EnableIRQ.

NVIC_EnableIRQ您可以在https://github.com/ARM-software/CMSIS_5/blob/develop/CMSIS/Core/Include/core_cm3.h#L1508找到

它的定义为:


#define NVIC_EnableIRQ __NVIC_EnableIRQ

__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)
{
  if ((int32_t)(IRQn) >= 0)
  {
    __COMPILER_BARRIER();
    NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
    __COMPILER_BARRIER();
  }
}
Run Code Online (Sandbox Code Playgroud)

如果你愿意,可以忽略__COMPILER_BARRIER()。以前的版本没有使用它。

该定义适用于 Cortex M-3 芯片。其他 Cortex 版本的情况有所不同。