STM32CubeMX HAL库串口+DMA+IDLE空闲中断不定长度数据接收和发送 📅 发布时间:2026/7/11 22:50:45 👁️ 浏览次数: 1. STM32发送接收方式在 STM32 中。USART 发送接收有三种基本方式轮询、中断和 DMA。轮询方式为堵塞模式使用超时管理机制。轮训方式它每次接收一个字节在规定时间内接收固定长度的数据。在对于某些数据不固定长度接收的数据轮询的方式有时候不够灵活。中断方式使用中断的方式如每一个字节都中断一次当时比较消耗系统资源。特别是HAL库中从中断到回调函数运行了不少的程序频繁的中断很可能造成数据溢出。为了避免这个问题我们使用指定接收一定长度的数据再调用回调函数这会让我们可以接收大数据但是这种情况则造成了要求每次的包是固定长度。DMA方式为了解决以上一些问题最常用的办法是使用空闲中断即在串口空闲的时候触发一次中断通知内核本次运输完成了。数据传输过程为了尽量不占用CPU的处理数据时间所以就使用DMA接收串口的数据。2. 空闲中断空闲中断介绍空闲中断是接受数据后出现一个byte的高电平(空闲)状态就会触发空闲中断。并不是空闲就会一直中断准确的说应该是上升沿停止位后一个byte如果一直是低电平是不会触发空闲中断的会触发break中断。所以为了减少误进入串口空闲中断串口RX的IO管脚一定设置成Pull-up上拉模式串口空闲中断只是接收的数据时触发发送时不触发。空闲中断使用串口空闲中断的判定是当串口开始接收数据后检测到1字节数据的时间内没有数据发生则认为串口空闲了进入相应的串口中断。在中断内清除空闲中断标志位和调用串口回调函数在回调函数内处理读取判断处理接收的一帧数据。3. DMA半满和完成中断DMA的半满Half Transfer中断和满Transfer Complete中断是用于处理DMA传输过程中的半满和满的事件的中断。半满中断:半满中断是当DMA传输的一半数据已经传输完成时触发的中断。这个中断可以用来通知CPU表示已经传输了一部分数据可以进行相关的处理操作。满中断满中断是当整个DMA传输完成时触发的中断。这个中断用来通知CPU表示整个数据传输已经完成可以进行后续的处理。通过使用半满和满中断可以及时获得DMA传输的状态并根据需要进行相应的处理以实现高效的数据传输和处理。DMA半满中断的理解DMA设置成传输到一半有个中断这样缓存数组如果设成100那么存满50个就会有个中断这样的好处就是相当于有两个箩筐一个用来接收采集的萝卜另一个倒萝卜两个箩筐轮流使用但是这样有个问题就是两个箩筐要配合倒萝卜的速度要跟得上采萝卜的速度也就是说到萝卜的速度要采萝卜的速度main.c int main(void) { /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_TIM3_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ printf(Uart1 init is ok); __HAL_UART_ENABLE_IT(huart1, UART_IT_IDLE); //使能串UART1 IDLE(空闲)中断 HAL_UART_Receive_DMA(huart1, RX1_Buf, DMA_BUF_SIZE); //设置DMA传输将uart1的数据搬运到RX1_Buf中 /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } usart.h /* USER CODE BEGIN Private defines */ #define DMA_BUF_SIZE 256 extern uint8_t RX1_Offset ; // 计算偏移量 , 用来计算接收数据长度的 extern uint8_t RX1_Buf[]; // 接收数据存放的数组 /* USER CODE END Private defines */ usart.c /* USER CODE BEGIN 0 */ #include stdio.h uint8_t RX1_Offset 0 ; // 计算偏移量 , 用来计算接收数据长度的 uint8_t RX1_Buf[DMA_BUF_SIZE]; // 接收数据存放的数组 /* USER CODE END 0 */ stm32f1xx_it.c /* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN PFP */ void USER_UART_IRQHandler(UART_HandleTypeDef *huart); /* USER CODE END PFP */ /** * brief This function handles USART1 global interrupt. */ void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(huart1); /* USER CODE BEGIN USART1_IRQn 1 */ USER_UART_IRQHandler(huart1); /* USER CODE END USART1_IRQn 1 */ } /* USER CODE BEGIN 1 */ // DMA 接收到一半的中断 void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart) { if(huart-Instance USART1) { uint8_t Length DMA_BUF_SIZE/2 - RX1_Offset ; //printf(HLength%d\n,Length); HAL_UART_Transmit(huart,RX1_BufRX1_Offset,Length,HAL_MAX_DELAY); RX1_Offset Length; } } // DMA传输完成中断 , 就是接收满了的时候 触发中断 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart-Instance USART1) { uint8_t Length DMA_BUF_SIZE - RX1_Offset ; HAL_UART_Transmit(huart,RX1_BufRX1_Offset,Length,HAL_MAX_DELAY); //printf(CLength%d\n,Length); RX1_Offset 0 ; // 清空dma 位置基准值 } } // 用户自定义的函数 处理串口空闲中断 void USER_UART_IRQHandler(UART_HandleTypeDef *huart) { if(huart-Instance USART1) //判断是否是串口1 { if(__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) ! RESET ) //判断是否是空闲中断 { __HAL_UART_CLEAR_IDLEFLAG(huart); //清除空闲中断标志否则会一直不断进入中断 //计算接收到的数据长度 : BUFFER_SIZE - __HAL_DMA_GET_COUNTER(hdma_usart1_rx) uint8_t Length DMA_BUF_SIZE - __HAL_DMA_GET_COUNTER(hdma_usart1_rx) - RX1_Offset; HAL_UART_Transmit(huart,RX1_BufRX1_Offset,Length,HAL_MAX_DELAY); RX1_Offset Length; //printf(ILength%d\n,Length); } } } /* USER CODE END 1 */
MetaTube插件元数据服务适配指南:API通信故障排除与开源插件维护实践 MetaTube插件元数据服务适配指南:API通信故障排除与开源插件维护实践 【免费下载链接】jellyfin-plugin-metatube MetaTube Plugin for Jellyfin/Emby 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-metatube MetaTube插件作为Jellyfin/Emby… 2026/7/11 19:40:36
OpenClaw是什么?看完这篇,你也可以去“养龙虾” OpenClaw是什么?看完这篇,你也可以去“养龙虾” 如果你最近刷朋友圈、逛科技圈,总看到有人说“养龙虾”“装龙虾”,千万别误会这是啥新型水产养殖!这只爆火全网的“红色龙虾”,其实是当下最火的AI新玩法——… 2026/7/11 14:45:35
使用 Burp Suite 修改內容是網頁安全測試的基礎技能 學習。Burp Suite 就像是一個「中間人」,能攔截瀏覽器與伺服器之間的通訊,讓你在數據發送出去前進行修改。 以下是使用 Burp Suite 修改內容的核心步驟與文章範例:如何使用 Burp Suite 修改請求 (Request)設定代理:確保瀏覽器流量… 2026/7/11 16:01:58
H3C IRF 堆叠配置实战:2台交换机环形拓扑搭建与 MAD 防脑裂配置 H3C IRF 堆叠配置实战:2台交换机环形拓扑搭建与 MAD 防脑裂配置在企业级网络架构中,设备堆叠技术已成为提升网络可靠性和简化管理的关键手段。H3C的IRF(Intelligent Resilient Framework)技术通过将多台物理交换机虚拟化为单一逻辑… 2026/7/12 6:43:30
如何彻底告别网盘下载限速?八大网盘直链解析完整指南 如何彻底告别网盘下载限速?八大网盘直链解析完整指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云… 2026/7/12 6:41:29
OpenMetadata 1.2 集成 Apache Doris 实战:4步完成自定义数据源开发与测试 OpenMetadata 1.2 深度集成 Apache Doris 全流程开发指南为什么需要自定义数据源集成?在数据驱动的业务环境中,元数据管理平台的价值日益凸显。OpenMetadata 作为新一代元数据管理框架,其核心优势在于能够统一管理各类数据源的元信息… 2026/7/12 6:41:29
Node.js 版本管理器对比:nvm 0.39.3 vs fnm 1.35.1 在 WSL2 下的安装速度与切换效率实测 Node.js 版本管理器深度评测:nvm 0.39.3 与 fnm 1.35.1 在 WSL2 下的性能对决1. 工具选型背景与测试环境搭建对于需要频繁切换 Node.js 版本的开发者而言,版本管理器的选择直接影响开发效率。WSL2 作为 Windows 下的 Linux 子系统,其独特的文… 2026/7/12 6:39:29
导师都惊呆了!8个AI论文写作工具,半天搞定万字论文! 在2026年这个节点,教育部严抓学术规范,自动降AIGC率,知网查重率成了每位硕博生、高校教师的卡点。 其实,AI论文写作早就不再是简单的文字堆砌,它已进化到能帮你深度分析数据、对标学术范式的地步。如果你还在为AI写毕业… 2026/7/12 6:39:29
A3910与PIC24FV32KA304组合的嵌入式电机控制方案 1. 项目概述:A3910与PIC24FV32KA304的黄金组合在嵌入式控制领域,电机驱动与微控制器的搭配就像赛车引擎与ECU的关系——前者提供动力,后者精准控制。A3910作为Allegro MicroSystems推出的全桥电机驱动芯片,与Microchip的PIC24FV32… 2026/7/12 6:35:27
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14