当前位置: 首页 > news >正文

STM32H743开发周记问题汇总(串口通讯集中)

溢出错误

出现的串口接收过程中,中断接收在溢出后无法进入,需要重点考虑溢出问题,以下是溢出恢复代码

波特率115200      优先级0-1  高于定时器     初步诊断是数据流导致的接收溢出问题

/*** @brief  检查并清除UART溢出错误(带状态验证)* @param  huart: UART句柄指针* @retval HAL_OK: 成功清除 | HAL_ERROR: 无溢出或清除失败*/
HAL_StatusTypeDef UART_CheckAndClearOverrun(UART_HandleTypeDef *huart) 
{// 1. 检查ORE标志是否存在if(!__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE)) {return HAL_ERROR; // 无溢出错误}// 2. 原子操作保护uint32_t primask = __get_PRIMASK();__disable_irq();// 3. 清除流程(严格顺序)volatile uint8_t tmp = huart->Instance->RDR; // 必须读取DR__HAL_UART_CLEAR_OREFLAG(huart);           // 官方推荐清除方式__HAL_UART_FLUSH_DRREGISTER(huart);        // 确保FIFO清空// 4. 验证是否清除成功HAL_StatusTypeDef status = __HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) ? HAL_ERROR : HAL_OK;// 5. 重启接收中断(可选)if(status == HAL_OK) {__HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);}// 6. 恢复中断状态if(!(primask & 1)) __enable_irq();return status;
}	

问题查找方式

溯源方式:DEBUG查找判断是否执行

    // 1. 检查ORE标志是否存在if(!__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE)) {return HAL_ERROR; // 无溢出错误}

重点,不要加在串口接收中断函数中,不会触发,采用定时器一段时间检查一次即可

读串口对应的CR1可以确认接收中断有没有使能,2D代表对应的位使能,0D则不使能说明被意外关闭了。

对应的STATE则用来进一步辅助判断,因为中断和ISR会有延迟的情况发生,不可单独依靠这两个去判断。

发送阻塞卡死

另外一种出现的发送卡死在以下函数中的问题:

HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
{/* Wait until flag is set */while((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status){/* Check for the Timeout */if(Timeout != HAL_MAX_DELAY){if((Timeout == 0U) || ((HAL_GetTick()-Tickstart) > Timeout)){/* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE));CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);huart->gState = HAL_UART_STATE_READY;huart->RxState = HAL_UART_STATE_READY;/* Process Unlocked */__HAL_UNLOCK(huart);return HAL_TIMEOUT;}}}return HAL_OK;
}

溯源发生在两种情况下,第一种是中断优先级过低,被打断导致;第二种则是错误的在其他地方,人为的去操作串口的STATE位的状态,导致的串口状态混乱,所以请务必遵守HAL库默认的状态机情况,不要杂乱的修改导致状态混乱的情况发生。

		// 在初始化末尾添加(HAL_UART_Init之后)__HAL_UART_DISABLE_IT(huart, UART_IT_TXE | UART_IT_TC);  // 明确禁用发送中断huart->Instance->CR1 &= ~(USART_CR1_TXEIE | USART_CR1_TCIE);  // 寄存器级禁用

串口发送中断被禁用的情况下请不要调用对应的清理串口发送中断的HAL库函数,一定几率造成堵死。

HAL_GetTick计数失效导致的问题

请确保HAL_GetTick函数未失效,不管是使用WDT硬件计数器还是滴答定时器,在使用滴答定时器的时候请注意滴答定时器的中断优先级问题导致的一系列问题。

缓冲器资源冲突问题

环形缓冲区在读取和写入的时候,特别针对主函数一边读涉及到删除,中断写入的情况下,需要注意资源冲突问题,在写或者读的时候,进行保护。

http://www.xdnf.cn/news/1294309.html

相关文章:

  • golang语言和JAVA对比
  • 一条n8n工作流
  • SVN提交服务器拒绝访问的问题
  • Linux 桌面到工作站的“性能炼金术”——开发者效率的 6 个隐形瓶颈与破解方案
  • 服务器硬件电路设计之 I2C 问答(五):I2C 总线数据传输方向如何确定、信号线上的串联电阻有什么作用?
  • 【MCP开发】Nodejs+Typescript+pnpm+Studio搭建Mcp服务
  • 从零到一:TCP 回声服务器与客户端的完整实现与原理详解
  • 基于UniApp的智能在线客服系统前端设计与实现
  • 人工智能入门①:AI基础知识(上)
  • 18.10 SQuAD数据集实战:5步高效获取与预处理,BERT微调避坑指南
  • InnoDB如何解决脏读、不可重复读和幻读的?
  • 公司项目用户密码加密方案推荐(兼顾安全、可靠与通用性)
  • HiSmartPerf使用WIFI方式连接Android机显示当前设备0.0.0.0无法ping通!设备和电脑连接同一网络,将设备保持亮屏重新尝试
  • antdv Modal的简单使用
  • Hive 创建事务表的方法
  • 18. parseInt 的参数有几个
  • 开源工具can-utils的使用
  • Docker 在 Linux 中的额外资源占用分析
  • 云计算-实战 OpenStack 私有云运维:服务部署、安全加固、性能优化、从服务部署到性能调优(含数据库、内核、组件优化)全流程
  • OpenCV常见问题汇总
  • Java JDK8环境配置
  • 基于Java的Markdown转Word工具(标题、段落、表格、Echarts图等)
  • 药房智能盘库系统:基于CV与时间序列预测的库存革命
  • 《算法导论》第 22 章 - 基本的图算法
  • Kubernetes-03:Service
  • Notepad++插件开发实战
  • Mac安装ant
  • [系统架构设计师]系统架构基础知识(一)
  • Flutter权限管理三步曲:检查、申请、处理全攻略
  • 三、非线性规划