STM32串口DMA通讯+源码+原理图+说明。 很多时候,单片机需要进行多机通讯,但是如果使用...

STM32串口DMA通讯+源码+原理图+说明。 很多时候,单片机需要进行多机通讯,但是如果使用以往的串口通讯,势必会占用CPU时间,影响单片机的实时性,如果才用.DMA的方式就行数据通讯,就可以很好的保证了实时性。

搞嵌入式的人都知道,串口这玩意儿就像吃饭喝水一样基础。不过当系统里挂了好几个设备要互相通讯的时候,传统的轮询方式能把CPU累成狗。最近在搞STM32的温控项目,三个下位机实时传数据,传统中断方式直接把主频72MHz的F103搞出了卡顿,这时候就得上DMA大法了。

先甩个原理图镇楼(用Fritzing简单画个示意):

[UART1TX→485芯片→总线][UART1RX←总线][DMA1Channel4配置成串口发送][DMA1Channel5负责接收]

关键代码咱们直接上干货。先看DMA初始化部分,这里用HAL库实现:

// DMA发送配置 hdma_usart1_tx.Instance = DMA1_Channel4; hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE; hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma_usart1_tx.Init.Mode = DMA_NORMAL; // 单次传输 HAL_DMA_Init(&hdma_usart1_tx); // 串口DMA接收配置 __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); // 启用空闲中断 HAL_UART_Receive_DMA(&huart1, rx_buffer, BUFFER_SIZE);

这段配置有几个骚操作:首先用内存地址自增实现连续发送,然后开启串口空闲中断来判定一帧数据接收完成。注意接收用的是循环模式,发送用单次模式——这可不是随便选的,发送完成需要重新装填数据,接收则需要持续监听。

数据搬运过程完全不用CPU插手,但总得知道什么时候传完吧?这时候得用传输完成中断:

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART1){ // 这里可以搞个信号量通知任务 tx_complete_flag = 1; } } // 接收完成用空闲中断触发 void USART1_IRQHandler(void) { if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE)){ __HAL_UART_CLEAR_IDLEFLAG(&huart1); HAL_UART_DMAStop(&huart1); // 计算接收到的数据长度 received_len = BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart1.hdmarx); // 唤醒处理线程 osSemaphoreRelease(uart_sem); } HAL_UART_IRQHandler(&huart1); }

这里有个坑爹的地方:DMA传输计数器是递减的,所以实际接收数据长度=缓冲区总长度-当前计数值。之前在这翻过车,数据总是少收最后几个字节,调试半天才发现计数器的问题。

实际应用里还得注意内存对齐,比如下面这个发送函数:

void dma_send(uint8_t *data, uint16_t len) { while(!tx_complete_flag); // 等待上次发送完成 if(len > MAX_LEN) return; // 内存拷贝必须4字节对齐 memcpy(tx_buffer, data, len); SCB_CleanDCache_by_Addr((uint32_t*)tx_buffer, len); HAL_UART_Transmit_DMA(&huart1, tx_buffer, len); tx_complete_flag = 0; }

特别是用到D-Cache的时候,必须手动清理缓存,否则DMA搬运的可能是脏数据。这个坑在STM32H7系列上特别明显,F4系列偶尔也会中招。

实测效果:在115200波特率下连续传输1KB数据,传统中断方式CPU占用率高达35%,换成DMA后直接降到3%以下。要是上到460800波特率,中断方式直接卡成PPT,DMA还能稳如老狗。

最后甩个源码仓库地址(示例用,勿直接访问):

https://github.com/example/stm32uartdma_demo

搞这种多机通讯,记得在总线上加120Ω匹配电阻,不然数据错乱起来连逻辑分析仪都救不了你。下次有机会再唠唠怎么用DMA实现环形缓冲区+协议解析的骚操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1149729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

紧急项目救星:临时GPU租赁3小时搞定AI分类任务

紧急项目救星:临时GPU租赁3小时搞定AI分类任务 引言:当广告创意遇上AI deadline 广告公司最怕什么?不是客户改需求,而是突然接到一个"明天就要"的AI提案。上周我就遇到这样一个真实案例:某4A公司接到汽车品…

芯谷科技—D5534:高性能低噪声运算放大器,开启精准信号处理新时代

一、产品简介D5534 是由绍兴芯谷科技有限公司推出的高性能低噪声运算放大器,专为满足高精度、低失真信号处理需求而设计。它集成了卓越的直流和交流特性,具备极低的噪声、高输出驱动能力、高单位增益带宽和最大输出摆幅带宽、低失真以及高转换速率等优势…

江湖救急!做预测的朋友们肯定遇到过BP神经网络训练卡壳的情况。今天咱们唠唠怎么用遗传算法和粒子群给BP神经网络打鸡血,直接上MATLAB代码边说边练

遗传算法、粒子群算法优化BP神经网络 #预测#机器学习#MATLAB# 我这是关于预测的先看原始BP神经网络的痛点代码: net feedforwardnet([10,5]); % 经典的双隐层结构 net.trainParam.epochs 1000; [net,tr] train(net,input,target); % 标准训练流程 这老兄容易卡在…

从下载到API服务:AutoGLM-Phone-9B本地化部署完整流程

从下载到API服务:AutoGLM-Phone-9B本地化部署完整流程 1. AutoGLM-Phone-9B 模型简介与核心价值 1.1 多模态轻量化模型的技术定位 AutoGLM-Phone-9B 是一款专为移动端和边缘设备优化的多模态大语言模型,融合了视觉理解、语音识别与文本生成三大能力。…

AutoGLM-Phone-9B核心机制全曝光|9B参数下的跨模态融合方案

AutoGLM-Phone-9B核心机制全曝光|9B参数下的跨模态融合方案 1. 多模态模型架构全景解析 AutoGLM-Phone-9B 是一款专为移动端优化的多模态大语言模型,融合视觉、语音与文本处理能力,支持在资源受限设备上高效推理。该模型基于 GLM 架构进行轻…

分类模型效果优化秘诀:云端超参搜索,成本比本地低75%

分类模型效果优化秘诀:云端超参搜索,成本比本地低75% 1. 为什么需要云端超参搜索? 想象你正在参加Kaggle比赛,每次调整模型参数后,都需要用本地显卡训练2小时才能看到效果。这种"训练-等待-调整"的循环就像…

锂电池系统的控制核心就像给手机充电时那个默默守护的管家——BMS(电池管理系统)。今天咱们聊聊它的几个关键技术点,顺带用代码片段看看这些理论如何落地

BMS系统充放电 SOC SOH控制模型: 电池的CCCV 充电控制 电压平衡策略 (包括温度热量影响); 电池冷却系统 仿真 ; 电池参数估计; SOC参数估计、SOH参数估计(卡尔曼滤波); 非常适合电池系统建模原…

揭秘7款免费AI写论文工具:瑞达写作1天搞定带文献综述

引言:90%的学生不知道的论文写作“黑科技”,导师私藏的效率密码 你是否经历过这样的绝望? 导师催论文初稿的前一天,你还在对着空白文档发呆,文献综述堆了几十篇却理不清逻辑,公式输入错了十几次&#xff0…

老铁们今天咱们玩点硬核的,手把手教你们用MATLAB搞时间序列预测。咱不整那些虚的理论,直接上能跑起来的代码,重点解决自回归阶数和隐层节点数这两个头疼问题

时间序列bp自回归神经网络预测matlab程序代码 ,含最佳 自回归阶数和最佳隐层节点数的确定。 代码直接运行即可,数据excel格式。先看数据怎么处理(假设数据存在data.xlsx第一列): raw_data xlsread(data.xlsx); data …

移动端多模态大模型实践|基于AutoGLM-Phone-9B快速部署与验证

移动端多模态大模型实践|基于AutoGLM-Phone-9B快速部署与验证 1. 引言:移动端多模态AI的落地挑战与机遇 随着大语言模型(LLM)技术的迅猛发展,如何在资源受限的移动设备上实现高效、低延迟的多模态推理,已…

伺服技术前沿揭秘:汇川详述CANopen及CIA402协议支持性能技术前沿汇川解析伺服系统...

汇川 伺服 源码 620N 620P 支持EtherC AT Canopen CIA402协议。 位置环 速度环 惯量辩识 转矩观测 摩擦补偿最近在折腾汇川620系列伺服的源码实现,发现他们家这套方案确实藏着不少干货。特别是620N/620P双胞胎兄弟,不仅硬件平台扎实,协议…

轰动开源圈!这个能自主思考的AI Agent项目,让程序员集体破防

这一天终于来了 说实话,做开源项目搬运工这么多年,见过无数AI项目,有花里胡哨的,有吹上天的,但真正让我坐直了身子的项目,真的不多。 今天要说的这个,不一样。 它叫MiroThinker,一个…

MATLAB仿真牵引逆变器IGBT故障模拟系统

matlab仿真逆变器故障模拟 牵引逆变器IGBT故障模拟系统最近在研究牵引逆变器的故障模拟,特别是IGBT的故障。这玩意儿在电力电子里可是个大头,搞不好就炸了。所以,模拟一下故障情况,提前预防,还是挺有必要的。今天就用M…

学霸同款2026 AI论文写作软件TOP9:继续教育必备测评

学霸同款2026 AI论文写作软件TOP9:继续教育必备测评 2026年学术写作工具测评:为继续教育者量身打造的高效指南 在当前知识更新速度不断加快的背景下,继续教育群体对学术写作工具的需求日益增长。无论是撰写论文、报告还是完成课程作业&#x…

西门子S7-1200的MODBUS-RTU轮询实战

S7-1200程序 MODBUS-RTU轮训 程序,采用SCL编写 轮训程序,单个模块可以控制32路485设备。 注释清晰,逻辑清楚。最近在给某水处理项目做PLC程序,现场32台485仪表要接入,直接掏出S7-1200搭了个MODBUS轮询框架。说几个关…

exec 介绍

exec 是 Linux/Unix 系统中一个极其重要但又容易误解的命令。它不是执行新命令,而是用指定命令替换当前进程。📚 exec 的核心概念与传统命令执行的区别# 正常执行命令:创建子进程 $ ls # shell创建子进程运行ls,ls结束返…

9B参数多模态模型落地手机端|AutoGLM-Phone-9B工程化部署关键技术解析

9B参数多模态模型落地手机端|AutoGLM-Phone-9B工程化部署关键技术解析 1. AutoGLM-Phone-9B的核心架构与多模态融合机制 AutoGLM-Phone-9B 是一款专为移动端优化的多模态大语言模型,融合视觉、语音与文本处理能力,在资源受限设备上实现高效…

三菱Q系plc伺服fb程序 伺服用的FB功能块写法,编程方式非常清晰明了,程序都有注释、注释全...

三菱Q系plc伺服fb程序 伺服用的FB功能块写法,编程方式非常清晰明了,程序都有注释、注释全面,用的三菱Q系列plc,本程序为伺服定位控制程序,可借鉴、可做模板,本程序已经设备实际批量应用、稳定生产、成熟可…

从非结构化文本到关键信息抽取|AI智能实体侦测服务全解析

从非结构化文本到关键信息抽取|AI智能实体侦测服务全解析 在当今信息爆炸的时代,海量的非结构化文本(如新闻、社交媒体内容、客服对话等)每天都在产生。如何从中快速提取出有价值的关键信息,成为企业提升效率、构建知…

西门子FB284伺服v90profinet程序,自动排列机实战项目详解,4轴控制,全面解析RF...

西门子FB284伺服v90profinet程序西门子触摸屏程序,新能源行业自动排列机,真实项目,V90 走PN 口控制4轴,自己写的RFID读写FB SCL和西门子运动控制FB块开放,直接复制可用,没有密码,详细注释&…