串口DMA STOP模式下唤醒故障问题

问题背景
最近开发低功耗产品,工作模式为唤醒情况下正常工作,没什么特别的,没有外部唤醒的时候,mcu进入stop模式,间隔rtc唤醒(2s一次),或者外部中断唤醒,串口为其中的一种唤醒方式。
问题:
正常工作模式下,串口收发数据帧一直运行几个小时都没问题,但是在低功耗进入stop模式之后,通讯唤醒,主机通讯,会出现无法通讯的情况,过了几秒又恢复正常,一般5s以内,偶尔较长时间,为何?
目前只是解决了问题,但是出现问题的原因还没有找到,有经验的小伙伴可以一起探讨交流下!!!
问题分析
正常工作模式下既然长时间工作一直不出问题,应用层的数据通讯解析逻辑肯定是没问题的,可以放过了。
重点就放在了跟串口底层相关的部分,因为在进stop模式之前会把所有的外设处理一下,串口、dma都会关掉,唤醒之后重新使能,问题可能出在了这里,但是分析完之后也没有发现有什么异常。
既然可能是串口底层出了问题,咱们重点来抓一下串口底层的一些现象,这里hal库做了很多的回调函数,前面4个是正常的传输回调函数,后面几个是异常回调,既然现在是出现了问题,不妨来监测一下看看:
void hal_uart_txhalfcpltcallback(uart_handletypedef *huart);void hal_uart_txcpltcallback(uart_handletypedef *huart);void hal_uart_rxhalfcpltcallback(uart_handletypedef *huart);void hal_uart_rxcpltcallback(uart_handletypedef *huart);void hal_uart_errorcallback(uart_handletypedef *huart);void hal_uart_abortcpltcallback(uart_handletypedef *huart);void hal_uart_aborttransmitcpltcallback(uart_handletypedef *huart);void hal_uart_abortreceivecpltcallback(uart_handletypedef *huart); 使用这个,别问为啥,想瞎猫碰死耗子~~~:
void hal_uart_errorcallback(uart_handletypedef *huart);
/**  * @brief  uart error callback.  * @param  huart uart handle.  * @retval none  */__weak void hal_uart_errorcallback(uart_handletypedef * 这个在hal库中本身是个“弱函数”,什么是“弱函数”,大家动动小手自己百度下了哈,用户可以自己实现一样的名字的函数,供系统回调,打印个提示信息看看:
void hal_uart_errorcallback(uart_handletypedef *huart)
{  if(huart->instance == usart3)  {    log_e(comm error!!!);  }} 测试下看看,会不会出错,从打印的信息来看,瞎猫确实碰到死耗子了..果然有错误,既然有错误了,就继续究根刨底下去:
调用这个回调函数的地方还挺多,那究竟跟哪一个啊?
翻一翻,加上我们是用dma出现的问题,找找跟dma相关的,dma传输错误会调用这个回调,这个dma错误在串口中断中有调用,这样好像就都联系起来了:
能够进来这个dma错误回调的条件是下面这个,发生以下通讯错误的时候,会进一步处理:
/** @defgroup uart_error_definition   uart error definition
  * @{  */#define  hal_uart_error_none             (0x00000000u)    /*!< no error*/#define  hal_uart_error_pe               (0x00000001u)    /*!< parity error            */#define  hal_uart_error_ne               (0x00000002u)    /*!< noise error             */#define  hal_uart_error_fe               (0x00000004u)    /*!< frame error             */#define  hal_uart_error_ore              (0x00000008u)    /*!< overrun error           */#define  hal_uart_error_dma              (0x00000010u)    /*!< dma transfer error      */#define  hal_uart_error_rto              (0x00000020u)    /*!< receiver timeout error  */ 接下来检测下发生的错误,每一个错误都打印出来:
有时候也会出现噪声错误
错误对应的是,帧错误,噪声错误:
#define  hal_uart_error_fe               (0x00000004u)    /*!< frame error             */#define  hal_uart_error_ne               (0x00000002u)    /*!instance == usart3)  {      log_e(comm error!!!);      __hal_uart_clear_flag(&m_suartxhandle,uart_clear_fef);//清除帧错误标志     __hal_uart_clear_flag(&m_suartxhandle,usart_icr_necf);//清除噪声错误标志      bsw_euart_initvariables();      hal_uart_receive_dma(&m_suartxhandle,m_uart_dmarx_frame.rec_buffer,dma_rec_data_len);      bsw_uart_recevicecfg(enable);                           //接收配置    }} 目前仅仅是问题得到了解决,但是为什么出现这个问题还在研究中,有知道的小伙伴吗?可以交流下!!


明星们最喜欢的手机品牌是哪个
浅谈优先编码器的功能(74LS147为例)
ARM9系统在无线发射台智能化监控系统中的应用
家庭异构网络融合:IEEE 1905.1a标准架构详述
电气防火措施及电气防火限流式保护器在棉纺织厂的应用
串口DMA STOP模式下唤醒故障问题
住房和城乡建设部总结各地经验做法
工控机在激光切割控制系统中的应用
电磁波无线通信技术是什么
人工智能技术将助力语言沟通的无障碍
未来将实现实现智能选鞋系统?
Oculus将虚拟现实用于许多慈善活动
智能家居行业如何全域获客?全网8大平台87个私域引流入口揭秘
华为mate60pro参数配置 华为mate60pro支持5g网络吗
关于小间距led显示屏的分析,它的优点是什么
禾赛发布512线超高清超远距激光雷达AT512
解暑小妙招,华为FreeBuds 4带你“静”享“轻”凉夏日
为大家简单介绍一下测量电容好坏的方法
荷兰推出首个机器人餐厅
气候雄心峰会上中国承诺问世,新能源概念股走俏