麦克斯韦Maxwell 发表于 2024-4-16 13:53:30

关于芯片降频后,过一段死机的疑惑

求助各位大佬,目前我用国民技术N32G452芯片做开发,正常状态下,以72MHZ运行没有问题,为了节约功耗,将其降频至16MHz运行,同时,调用串口,给外部服务器发送和接收数据,在降频状态下,一开始还能正常运行一段时间,但过几天,机器就会莫名奇妙的死机,好几次都这样,但看调试信息,不是硬件错误Hardfault,而是在串口初始化产生问题,请问各位,这是什么问题?

eric2013 发表于 2024-4-17 11:09:26

如果已经锁定是串口问题了,可以16MHz反复初始化串口,批量收发数据测试下,然后逐步优化下这部分的代码实现。

麦克斯韦Maxwell 发表于 2024-4-17 22:37:46

eric2013 发表于 2024-4-17 11:09
如果已经锁定是串口问题了,可以16MHz反复初始化串口,批量收发数据测试下,然后逐步优化下这部分的代码实 ...

好的,谢谢硬汉哥的指导,我试一试这个方法

麦克斯韦Maxwell 发表于 2024-4-20 18:24:54

eric2013 发表于 2024-4-17 11:09
如果已经锁定是串口问题了,可以16MHz反复初始化串口,批量收发数据测试下,然后逐步优化下这部分的代码实 ...

硬汉哥你好,经过排查,发现问题如下:
我们的程序写法是按照例程:
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
            USART_ClearITPendingBit(USART1, USART_IT_RXNE);
但是这种写法,会产生一个问题,假如我的数据是错误帧,即是不满足UART协议的,没办法进入到if里面清除串口中断标志位,导致出现程序不断在串口中断卡死,无法执行 while循环。为了克服这个问题,我们尝试读取其他串口中断标志位,方便清空中断标志,保证不会重复进入中断。但是我们当时读中断标志时,发现没有其他中断位的存在,后来我们网上查阅资料,发现芯片有以下bug,产生过载错误时,ORE会被置1,但只有当USART_IT_ERR中断使能时,才能读到ORE中断。后来我们按照文章的指引,把代码改了后,没有死机情况出现,代码如下,文章链接放到最后,供大家参读。
if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)//注意!不能使用if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)来判断


    {
      USART_ReceiveData(USART1);
    }
if(bRecieveOK)
    {
      if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
            USART_ClearITPendingBit(USART1, USART_IT_RXNE);
      return;//processing receive data,don't receive again
    }
我们也是按照该文章进行改进的:
https://bbs.21ic.com/icview-160999-1-1.html

eric2013 发表于 2024-4-21 00:31:40

麦克斯韦Maxwell 发表于 2024-4-20 18:24
硬汉哥你好,经过排查,发现问题如下:
我们的程序写法是按照例程:
if(USART_GetITStatus(USART1, USA ...
这个地方就显现出HAL库的优势了,他的中断里面把所有情况都整理了一遍。你可以借鉴下HAL库的实现,再完善下。
页: [1]
查看完整版本: 关于芯片降频后,过一段死机的疑惑