所以我用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中断
的优先级高于RTC中断的优先级。
也许有人可以解释一下这是为什么?
编辑1:好的,所以我阅读了更多关于中断优先级的资料,看来我需要正确配置NVIC_IRQChannelPreemptionPriority。我会尽快尝试一下...
关于中断内部的延迟,我知道那不是正确的方法,但我仍然想了解程序的行为方式。
编辑2:我刚刚尝试以以下方式更改了中断优先级:
// 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中断处理程序中工作。
systick_count
是什么?它在哪里增加?它既不是STM32硬件寄存器,也不是C标准。 - too honest for this site