gpt4 book ai didi

c - 在STM32F407中断处理程序中禁用中断

转载 作者:行者123 更新时间:2023-12-03 02:13:59 24 4
gpt4 key购买 nike

我是新来的,我正在努力解决我的项目问题。我正在尝试通过 UART 将数据从 Raspberry Pi B+ 发送到我的 STM32F407 并实时处理该数据。我的问题是:如何实际同步 main() thred 和 UART 中断处理程序,以免长时间停止我的 UART 中断。从 Raspberry 发送的数据如下所示(其中 n 是数字):nwnx 代码:

void UART4_IRQHandler(void)
{
if(USART_GetITStatus(UART4, USART_IT_RXNE))
{
if(!flag)
{
processing = true;
widthTemp[j] = USART_ReceiveData(UART4);
USART_ClearITPendingBit(UART4, USART_IT_RXNE);

if(widthTemp[j] != 'w')
{
j++;
}
else
{
j = 0;
flaga = true;
processing = false;
//__disable_irq();
NVIC_DisableIRQ(UART4_IRQn);
}
}else if(flag)
{
processing = true;
heightTemp[j] = USART_ReceiveData(UART4);
USART_ClearITPendingBit(UART4, USART_IT_RXNE);

if(heightTemp[j] != 'x')
{
j++;
}
else
{
j++;
heightTemp[j] = '\n';
j = 0;
processing = false;
flag = false;
NVIC_DisableIRQ(UART4_IRQn);
}
}
}
}

现在主要代码:

while (1)
{
if(!NVIC_GetPendingIRQ(UART4_IRQn))
{
//if()
if(flag == true && processing == false)
{
sscanf(heightTemp, "%d", &height );
USART_puts(UART4, heightTemp); // sending back data to raspberry (temporary)
for(i = 0; i< sizeof(widthTemp);i++)
{
heightTemp[i] = '\0';
}
NVIC_EnableIRQ(UART4_IRQn);
}
if(flag == false && processing == false)
{
sscanf(widthTemp, "%d", &width );
USART_puts(UART4, widthTemp); // sending back data to raspberry (temporary)
for(i = 0; i< sizeof(widthTemp);i++)
{
widthTemp[i] = '\0';
}
NVIC_EnableIRQ(UART4_IRQn);
}
}
}

我的问题是,在某些时候,rasbperry 接收的数据开始出现巨大的延迟。

问题: 1. 我可以像在代码中那样禁用中断处理程序中的中断,让我的 main() 知道它可以处理数据吗?如果是,我是否检查此任务的良好注册? 2.是否有更好的方法将缓冲区(widthTemp f.e.)发送到某个变量?也许我不需要像这样使我的代码复杂化。 3. 我可以在代码中使用线程吗?有帮助吗? 4. 这是我的第一篇文章,因此任何有关如何格式化问题的信息、有关代码的建议等都会很好。

最佳答案

一般来说,您的 UART ISR 应该做的只是:

  • 对于接收中断,将 RXD 中的字符放入环形缓冲区
  • 对于传输中断,从环形缓冲区获取字符并将其放入 TXD。在STM32上,如果环形缓冲区为空,则必须显式关闭发送器。
  • 清除中断标志(可选处理错误标志)。

然后你的主线程(或者其他一些线程/任务,如果使用线程调度程序或 RTOS),只需从 Rx 环形缓冲区读取(或写入 Tx 环形缓冲区)。

请注意,在 STM32 上,如果发送器未运行,第一个字符应直接放置在 TXD 中,发送器启动后,后续字符将放置在 Tx 环形缓冲区中。

如果使用 RTOS 或其他操作系统,您可以使用队列或邮箱,而不是实现自己的环形缓冲区。当多个上下文访问控制数据时,需要注意确保一致的缓冲区控制。

请注意,STM32 能够使用 DMA 传输到 UART 操作,这可能提供替代解决方案,特别是在数据速率非常快的情况下,因为 STM32 UART 没有 FIFO,如果不删除每个字符,将会溢出 RXD从 RXD 到接收另一个所花费的时间。

关于c - 在STM32F407中断处理程序中禁用中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34611870/

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