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
即使您使用裸机,您可能仍然希望使用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 版本的情况有所不同。
| 归档时间: |
|
| 查看次数: |
3324 次 |
| 最近记录: |