所以我STM32F103C8T6用C语言编写了一个微控制器程序,使用RTC(实时时钟)和显示模块.
RTC和显示都工作正常,但是当我尝试从RTC中断处理程序内部更新显示时,它不起作用.
当我从内部向显示器写东西时main(),它工作得很好.
中断处理程序也可以工作,所以我认为问题在写入显示的函数中.
此功能使用小延迟来与显示控制器进行通信.
我以前使用SysTick过来生成这样的延迟:
void delay(uint32_t n){
uint32_t start = systick_count;
while (systick_count - start < n);
return;
}
Run Code Online (Sandbox Code Playgroud)
但不知何故,在RTC的中断处理程序中,它不起作用.所以我用这个替换了我的延迟函数,而不是使用SysTick:
for (; i>0; i--) {
for (int j = 0; j < 72; ++j) {
__asm__ __volatile__("nop\n\t":::"memory");
}
}
Run Code Online (Sandbox Code Playgroud)
现在一切正常.
我试图理解,为什么SysTick显然在RTC中断处理程序内不起作用.
我想这可能是由中断优先级引起的,但根据数据表,默认情况下,SysTick Interrupt优先级高于RTC中断优先级.
也许有人可以解释,为什么会这样?
编辑1:好的,所以我已经阅读了更多关于中断优先级的内容,似乎我需要正确配置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); …Run Code Online (Sandbox Code Playgroud)