gpt4 book ai didi

c - STM32 µC : SysTick delay doesn't work inside interrupt handler

转载 作者:太空宇宙 更新时间:2023-11-04 00:57:58 24 4
gpt4 key购买 nike

<分区>

所以我用 C 语言为 STM32F103C8T6 微 Controller 编写了一个程序,使用了 RTC(实时时钟)和一个显示模块。

RTC 和显示器都工作正常,但是当我尝试从 RTC 中断处理程序内部更新显示器时,它不起作用。

当我从 main() 中向显示器写入内容时,它工作正常。

中断处理程序也能正常工作,所以我认为问题出在写入显示器的函数中。

此函数使用小延迟来对与显示 Controller 的通信进行位爆炸。

我以前使用 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 中断优先级。

也许有人可以解释,为什么会这样?

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 中断处理程序中起作用。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com