小编Mar*_*cel的帖子

STM32μC:SysTick延迟在中断处理程序中不起作用

所以我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)

c microcontroller stm32 stm32f1

1
推荐指数
1
解决办法
782
查看次数

标签 统计

c ×1

microcontroller ×1

stm32 ×1

stm32f1 ×1