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

HPM6750串口DMA实战:手把手教你配置UART收发,告别CPU轮询

HPM6750串口DMA实战:从零构建高效UART通信框架

在嵌入式系统开发中,UART通信是最基础也最常用的外设接口之一。传统轮询方式会大量占用CPU资源,而DMA技术则能实现数据自动搬运,让CPU从繁重的IO操作中解放出来。本文将基于HPM6750微控制器,带你从硬件配置到软件实现,完整构建一个DMA驱动的UART通信系统。

1. 硬件基础与开发环境搭建

HPM6750是国产高性能RISC-V微控制器,其DMA控制器支持多达32个独立通道,配合DMAMUX可实现灵活的外设映射。在开始编码前,我们需要确认硬件连接和开发环境:

  • 硬件准备清单

    • HPM6750开发板(如先楫HPM6750EVK)
    • USB转串口调试工具(推荐FT232芯片方案)
    • 杜邦线若干(连接UART_TX/UART_RX)
    • 示波器(可选,用于信号质量检测)
  • 开发环境配置

    # 安装工具链(以Ubuntu为例) sudo apt install gcc-riscv64-unknown-elf # 克隆SDK仓库 git clone https://github.com/hpmicro/hpm_sdk

注意:确保串口线交叉连接(TX-RX,RX-TX),波特率误差控制在2%以内。硬件流控制信号(RTS/CTS)若未使用需做上拉处理。

2. DMA-UART系统架构解析

HPM6750的DMA系统采用多层总线架构,通过AHB总线矩阵实现并行数据传输。其UART外设内置128字节FIFO,与DMA配合时可显著减少中断触发频率。

关键寄存器映射

寄存器组基地址偏移功能描述
UART_THR0x00发送保持寄存器
UART_RBR0x00接收缓冲寄存器
DMA_SARx0x40通道x源地址寄存器
DMA_DARx0x48通道x目标地址寄存器
DMAMUX_CHCFGx0x100通道x多路复用配置寄存器

数据传输路径示意图:

[内存缓冲区] ←DMA→ [DMAMUX] ←→ [UART_FIFO] ←→ [物理引脚]

3. 核心功能实现步骤

3.1 DMA通道初始化

首先配置DMA控制器基础参数,建议将发送和接收分配到不同通道以避免冲突:

void dma_init(DMA_Type *dma_ptr) { // 使能DMA控制器时钟 clock_add_to_group(clock_dma, 0); // 复位所有通道 dma_reset(dma_ptr); // 配置优先级仲裁模式 dma_set_priority_arbitration_mode(dma_ptr, dma_priority_fixed); }

3.2 UART-DMA联动配置

UART需要特别关注FIFO触发阈值设置,这对DMA效率有直接影响:

void uart_dma_config(UART_Type *uart_ptr) { uart_config_t config; uart_default_config(uart_ptr, &config); // 关键参数设置 config.baudrate = 115200; config.fifo_enable = true; config.dma_enable = true; config.tx_fifo_level = uart_tx_fifo_trg_gt_half; config.rx_fifo_level = uart_rx_fifo_trg_gt_quarter; uart_init(uart_ptr, &config); }

3.3 数据传输实战代码

发送和接收需要分别配置DMA描述符,以下是典型实现:

// 发送数据函数 hpm_stat_t uart_send_dma(uint8_t *buf, uint32_t len) { dma_transfer_config_t xfer; xfer.src = core_local_mem_to_sys_address(0, (uint32_t)buf); xfer.dst = (uint32_t)&uart_ptr->THR; xfer.size = len; xfer.src_width = DMA_TRANSFER_WIDTH_WORD; xfer.dst_width = DMA_TRANSFER_WIDTH_BYTE; return dma_setup_transfer(TEST_UART_DMA_CONTROLLER, TEST_UART_TX_DMA_CHN, &xfer, true); } // 接收数据函数(环形缓冲区实现) hpm_stat_t uart_receive_dma_cyclic(uint8_t *buf, uint32_t len) { dma_handshake_config_t config; dma_default_handshake_config(dma_ptr, &config); config.ch_index = TEST_UART_RX_DMA_CHN; config.dst = (uint32_t)buf; config.dst_fixed = false; config.src = (uint32_t)&uart_ptr->RBR; config.src_fixed = true; config.size_in_byte = len; config.enable_cyclic = true; // 关键:启用循环模式 return dma_setup_handshake(dma_ptr, &config, true); }

4. 性能优化与问题排查

4.1 CPU占用率对比测试

通过SysTick定时器测量不同模式下的CPU负载:

传输模式1KB数据传输时间CPU占用率
轮询模式8.7ms98%
中断模式9.2ms45%
DMA模式9.0ms<5%

实测数据:115200bps波特率下,DMA可将CPU负载从98%降至3%以下

4.2 常见问题解决方案

问题1:数据传输不完整

  • 检查DMAMUX通道映射是否正确
  • 确认DMA和UART时钟使能
  • 验证缓冲区地址是否在DMA可访问区域

问题2:偶发数据错位

  • 调整FIFO触发阈值
  • 在DMA ISR中添加错误状态检查:
void dma_isr(void) { uint32_t status = dma_get_irq_status(dma_ptr); if(status & DMA_ERROR_FLAG) { // 错误处理逻辑 } ... }

问题3:高波特率下丢包

  • 降低DMA突发传输长度
  • 使用示波器检查信号完整性
  • 考虑启用UART硬件流控

5. 进阶应用:双缓冲技术实现

对于高速数据流,可采用双缓冲方案避免数据覆盖:

// 双缓冲结构体定义 typedef struct { uint8_t *active_buf; // 当前活动缓冲区 uint8_t *standby_buf; // 备用缓冲区 uint32_t buf_size; } double_buffer_t; // 缓冲区切换逻辑 void swap_buffer(double_buffer_t *dbuf) { uint8_t *temp = dbuf->active_buf; dbuf->active_buf = dbuf->standby_buf; dbuf->standby_buf = temp; // 重新配置DMA目标地址 dma_update_dest_address(dma_ptr, ch, (uint32_t)dbuf->active_buf); }

实际项目中,我在处理115200bps以上的GPS数据解析时发现,采用256字节双缓冲配合DMA循环模式,可确保数据零丢失的同时将CPU占用控制在2%以下。

http://www.gsyq.cn/news/1509673.html

相关文章:

  • 2026 广州高口碑黄金回收门店大全|正规门店地址与服务优势盘点 - 奢侈品回收评测
  • 大理同城黄金回收服务 本地三大黄金回收门店全解析 - 润富黄金回收
  • 2026年好用的去水印工具有哪些?靠谱去水印工具推荐
  • Maple Mono字体完全指南:打造极致编程体验的开源等宽字体解决方案
  • 如何快速部署AnythingLLM:私有AI知识库的完整指南
  • 2026年食品车间空气消毒机深度测评:如何为你的食品生产车间匹配最佳方案? - 资讯速览
  • 618护发素攻略:护发素哪个牌子好?看这份护发素推荐 - 速递信息
  • 2026宜春6家优质猫犬舍实测推荐!老城买宠不踩坑,新手直接抄作业 - 同城宠物优选基地
  • 2026团餐软件深度测评:拆解五大系统,谁真正解决了“毛利实时可见”? - 速递信息
  • Nacos五层数据模型:从Namespace到Instance详解
  • RAG效果怎么量化?检索准确率+回答忠实度+RAGAS四维指标实战
  • 郑州卖黄金别乱找!这家高价回收无套路 - 开心测评
  • 3个智能方法彻底解决百度网盘提取码获取难题
  • Fluent后处理:从色谱设置到高效数据洞察
  • 舟山市本地2026年最新黄金回收靠谱门店TOP5排行榜+白银回收+铂金回收+彩金回收及联系方式+地址+电话+诚信店铺推荐 - 亦辰小黄鸭
  • PyQt5+MySQL实现的学生信息管理系统完整可运行工程
  • 银河系中心分子气体与恒星形成效率研究
  • 如何彻底告别Spotify广告?这个桌面增强版给你纯净音乐体验
  • League Akari:5个智能功能彻底改变你的英雄联盟游戏体验
  • STM32F4扫地机器人主控全套开发资料:驱动代码+原理图+运动控制逻辑说明
  • RTSP流媒体服务器扛不住了?从硬件到软件的5个调优技巧(附Nginx-rtmp-module配置)
  • 2026年最新铜陵市口碑首选;黄金回收铂金回收白银回收彩金回收实力权威靠谱门店TOP5推荐及咨询方式 - 前途无量YY
  • 11. WireShark通过HTTP来抓三次握手包
  • 如何快速解密网易云音乐NCM格式:3步实现音乐自由播放
  • 2026年6月南京办公室工装装修5家团队客观测评选型指南 - 小艾信息发布
  • 12. UDP协议概述
  • 中兴光猫工厂模式一键解锁:zteOnu工具深度解析与实战指南
  • 2026 吉安厨卫屋面地下室漏水瓷砖空鼓测评:吉修匠 99.8 分五星榜首 - 吉修匠
  • 菏泽市中级经济师工商管理/人力资源管理:适配人群、岗位匹配与备考全攻略 - 众智商学院课程中心
  • 【Seatable API实战】Python操作避坑指南:从零到一玩转表格数据