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

串口空闲中断使能到串口空闲中断建立需要多长时间

最近在用DMA+串口空闲中断时,发现第一次发送有问题。见下图:

问了很多人,搜索网上,很少有人知道。为什么延时90us,DAM+串口发送就没有问题,原来是空闲中断使用了“HAL_UART_DMAStop(&g_uart1_handle);//停止串口DMA”导致的。

解决办法,就是再使能串口中断前,等待串口空闲中断标志建立,然后清除它。

void usart_init(uint32_t baudrate) { g_uart1_handle.Instance = USART_UX; /* USART1 */ g_uart1_handle.Init.BaudRate = baudrate; /* 波特率 */ g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* 字长为8位数据格式 */ g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* 一个停止位 */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* 无奇偶校验位 */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* 无硬件流控 */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* 收发模式 */ g_uart1_handle.Init.OverSampling = UART_OVERSAMPLING_16; g_uart1_handle.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; g_uart1_handle.Init.ClockPrescaler = UART_PRESCALER_DIV1; g_uart1_handle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; HAL_UART_Init(&g_uart1_handle);/* HAL_UART_Init()会使能UART1 */ HAL_UARTEx_SetTxFifoThreshold(&g_uart1_handle, UART_TXFIFO_THRESHOLD_1_8); HAL_UARTEx_SetRxFifoThreshold(&g_uart1_handle, UART_RXFIFO_THRESHOLD_1_8); HAL_UARTEx_DisableFifoMode(&g_uart1_handle); __HAL_UART_DISABLE_IT(&g_uart1_handle, UART_IT_RXNE); //必须关闭RXNE中断,否则会与IDLE冲突 // __HAL_UART_DISABLE_IT(&g_uart1_handle, UART_IT_IDLE); //不使能空闲中断 __HAL_UART_ENABLE_IT(&g_uart1_handle, UART_IT_IDLE); //使能空闲中断 delay_us(10000000/baudrate); //在使能串口中断前,需要延时,目的是等待串口空闲中断标志建立 //串口一帧数据:起始位1位+8位+停止位1位,8+1+1=10 //串口空闲中断的判定是: //当串口开始接收数据后,检测到1字节数据的时间内没有数据发送,则认为串口空闲了。 __HAL_UART_GET_FLAG(&g_uart1_handle, UART_FLAG_IDLE); //通过读"串口空闲中断标志位",就可以清除这个中断标志位; __HAL_UART_DISABLE_IT(&g_uart1_handle, UART_IT_TXE); //不使能发送缓存为空而产生的中断 __HAL_UART_DISABLE_IT(&g_uart1_handle, UART_IT_TC); //不使能发送完成中断 __HAL_UART_CLEAR_FLAG(&g_uart1_handle, UART_CLEAR_TCF);// 清除发送完成标志 __HAL_UART_ENABLE_IT(&g_uart1_handle, UART_IT_TC); //使能发送完成中断 SCB_CleanInvalidateDCache();// 清理缓存 /* 在使用 DMA(直接内存访问)传输数据时,可能会出现缓存与存储器数据不一致的情况。 调用此函数可以在 DMA 操作前后清理和无效化缓存,确保数据一致性。 */ dma_init_RX(DMA2_Stream1);//初始化DMA串口接收 dma_init_TX(DMA2_Stream7);//初始化DMA串口发送 HAL_UART_DMAStop(&g_uart1_handle);//关闭串口DMA __HAL_DMA_CLEAR_FLAG(&hdma_uart1_tx_handle, DMA_FLAG_TCIF3_7); //清除DMA2_Stream7传输完成标志 HAL_UART_Receive_DMA(&g_uart1_handle, g_rx_buffer, USART_REC_LEN); //数据处理完成后,再调用DMA接收 memset(g_rx_buffer, 0,USART_REC_LEN); //清0 g_usart_rx_sta=0; g_usart_Receive_Complete_Flag=0; g_usart_deal_rx_buf_len=0; g_usart_Send_Complete_Flag=0; HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* 使能USART1中断通道 */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* 抢占优先级3,子优先级3 */ }

通过上面修改,调用usart_init(115200);就可以直接发送数据了,第一次发送就正常了。

10000000/115200=86.80555555555556us
这就是延时90us的原因,80us就不行
串口一帧数据:起始位1位+8位+停止位1位,8+1+1=10
这个问题,网上很少有人知道。

http://www.jsqmd.com/news/977264/

相关文章:

  • IDEA 2026.1全面开放AI生态,Spring开发者如何构建最优AI工具组合?
  • 数据采集卡精度不够?别急着换硬件!一文讲透“两点标定”与ADC校准实战
  • 告别答辩 PPT 内耗,paperxie 智能 PPT 创作,重塑毕业答辩全新体验
  • django-guardian:Django 对象级权限的简洁实现
  • 2026广州全屋定制选购指南:爱格板全屋定制源头工厂哪家好?欧雅尊盘点本地优质全屋定制工厂与源头厂家 - 栗子测评
  • 2026年6月太原精品粤菜商务宴请榜:5家靠谱餐厅推荐排位 - 外贸老黄
  • 【软件推荐】电子公章、印章生成器,免费制作
  • VidGear:Python 视频处理的一站式框架
  • 2026年 IGBT模块、功率模块、可控硅、二极管、整流桥、晶闸管厂家推荐排行榜:高性能与稳定品质之选 - 品牌发掘
  • Bilibili 视频合集时长计算最新脚本
  • 2026 年 6 月 福州小程序开发制作优质榜单 企业选型参考 - 软件测评师
  • 深度解析飞算 JavaAI 智能引导的五大步骤:AI 是如何把一句需求变成工程级 Java 代码的?
  • 革命性微信聊天记录永久保存与智能分析工具:掌握你的数字记忆主权
  • 视觉模型中的坐标漂移
  • 题题-4
  • Redis基础介绍与SpringDataRedis的基础使用
  • 102、日志分析工具:MATLAB与Python脚本
  • 2026年 烟台推拉门十大品牌推荐榜:钛镁合金/极窄边框/完美系统平开门与口袋门厂家实力解析 - 品牌发掘
  • 思维链 ,Anthropic Mythos模型的 Looped Transformer架构解析,claud为什么厉害性能优越的研究
  • C语言容器中数据的高效串行化和解串--下位机的C语言处理(1)
  • 如何高效管理九大网盘下载:JavaScript直链解析工具的完整指南
  • 走进ChatGLM-6B:把轻量级AI对话装进个人电脑的实用指南
  • 看懂参数不被坑|2026新手电钢琴选购指南,全段位机型精准推荐
  • 2026 温州防水补漏服务商口碑测评榜单|全屋渗漏维修机构优选指南 - 宅安选房屋修缮
  • 后湖大道空调维修|后湖大道空调移机|后湖大道空调加氟|后湖大道空调回收 高性价比宅到家快速上门 - 武汉宅到家
  • RTSPtoWeb:如何用纯Go实现零依赖实时视频流转换的革命性架构
  • 103、飞控仿真环境搭建:Gazebo与PX4 SITL
  • 2026年最新的 北美黑胡桃木家具宋式美学家具 知名品牌 排行榜 北美黑胡桃木家具、宋式美学家具品牌推荐 国内 国际 - 奔跑123
  • MPC8245嵌入式Linux内核移植实战:从源码修改到硬件配置全解析
  • 2026年 2,4-二氟硝基苯厂家推荐榜单:高纯度合成工艺与医药中间体应用实力品牌深度解析 - 品牌发掘