所以我用 C 语言为微控制器编写了一个程序STM32F103C8T6
,使用 RTC(实时时钟)和一个显示模块。
RTC 和显示器都工作正常,但是当我尝试从 RTC 中断处理程序内部更新显示器时,它不起作用。
当我从 中向显示器写入内容时main()
,它工作得很好。
中断处理程序也可以正常工作,所以我认为问题出在写入显示器的函数中。
此函数使用小的延迟来对与显示控制器的通信进行位爆炸。
我以前使用SysTick
来生成这样的延迟:
void delay(uint32_t n){
uint32_t start = systick_count;
while (systick_count - start < n);
return;
}
但不知何故,在 RTC 的中断处理程序内部它不起作用。所以我用这个替换了我的延迟函数,而不是使用 SysTick:
for (; i>0; i--) {
for (int j = 0; j < 72; ++j) {
__asm__ __volatile__("nop\n\t":::"memory");
}
}
现在一切正常。
我试图理解,为什么SysTick
在 RTC 中断处理程序中显然不起作用。
我认为这可能是由中断优先级引起的,但根据数据表,默认情况下SysTick Interrupt
' 的优先级高于 RTC 中断优先级。
也许有人可以解释,为什么会这样?
EDIT1:好的,所以我已经阅读了更多关于中断优先级的内容,看来我需要正确配置 NVIC_IRQChannelPreemptionPriority 。我会尽快尝试这个...
关于中断内部的延迟,我知道这不是正确的做法,但我仍然想了解程序的行为
EDIT2:我只是尝试通过以下方式更改中断优先级:
// set RTC interrupt priority to 15 (lowest)
NVIC_SetPriority(RTC_IRQn, 15);
// set interrupt priority of SysTick to 0 (highest)
NVIC_SetPriority(SysTick_IRQn, 0);
现在 SysTick 延迟在 RTC 中断处理程序中起作用。