news 2026/6/12 20:59:57

HPM6750串口DMA实战:手把手教你配置UART收发,释放CPU性能

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HPM6750串口DMA实战:手把手教你配置UART收发,释放CPU性能

HPM6750串口DMA实战:从原理到性能优化的完整指南

在嵌入式系统开发中,串口通信是最基础也最常用的外设接口之一。当系统需要处理大量串口数据时,传统的轮询或中断方式往往会成为性能瓶颈。HPM6750作为一款高性能微控制器,其内置的DMA控制器能够显著提升串口通信效率。本文将深入探讨如何利用DMA实现UART数据的高效收发,通过实战代码演示配置过程,并分析性能优化的关键技巧。

1. DMA技术原理与UART通信优化

DMA(直接内存访问)是一种允许外设与内存之间直接传输数据的技术,无需CPU参与每个字节的搬运过程。在115200波特率的串口通信中,每个字节间隔约86μs,传统中断方式会导致CPU频繁上下文切换,而DMA可以将这些开销降低90%以上。

HPM6750的DMA控制器具有以下核心特性:

  • 支持多达16个独立通道
  • 每个通道可配置优先级
  • 支持内存到外设、外设到内存、内存到内存三种传输模式
  • 传输完成可触发中断通知CPU

UART结合DMA的优势对比表

传输方式CPU占用率吞吐量延迟适用场景
轮询100%简单调试
中断30-50%中等速率
DMA<5%高速稳定

2. HPM SDK中的DMA配置关键步骤

2.1 硬件初始化与引脚配置

首先需要确保UART外设时钟和引脚已正确初始化。以下是基于HPM SDK的初始化代码示例:

/* 板级初始化 */ board_init(); printf("UART DMA 演示程序\n"); /* 初始化UART引脚 */ board_init_uart(TEST_UART); /* UART基础配置 */ uart_config_t config = {0}; uart_default_config(TEST_UART, &config); config.fifo_enable = true; // 启用FIFO缓冲 config.dma_enable = true; // 启用DMA功能 config.src_freq_in_hz = clock_get_frequency(TEST_UART_CLK_NAME); config.tx_fifo_level = uart_tx_fifo_trg_not_full; config.rx_fifo_level = uart_rx_fifo_trg_not_empty; /* 初始化UART */ hpm_stat_t stat = uart_init(TEST_UART, &config); if (stat != status_success) { printf("UART初始化失败\n"); while(1); }

2.2 DMA通道与DMAMux配置

HPM6750使用DMAMux将DMA请求路由到特定通道,这是配置中最容易出错的环节之一:

/* 启用DMA中断 */ intc_m_enable_irq_with_priority(TEST_UART_DMA_IRQ, 1); /* 配置RX通道DMAMux */ dmamux_config(TEST_UART_DMAMUX_CONTROLLER, TEST_UART_RX_DMAMUX_CHN, TEST_UART_RX_DMA_REQ, true); /* 配置TX通道DMAMux */ dmamux_config(TEST_UART_DMAMUX_CONTROLLER, TEST_UART_TX_DMAMUX_CHN, TEST_UART_TX_DMA_REQ, true);

注意:DMAMux通道号与DMA控制器通道号的映射关系由宏DMA_SOC_CHN_TO_DMAMUX_CHN定义,务必查阅手册确认

3. DMA传输实战:发送与接收实现

3.1 发送数据DMA配置

发送数据的核心是配置DMA将内存中的数据搬运到UART的发送寄存器:

hpm_stat_t uart_tx_trigger_dma(DMA_Type *dma_ptr, uint8_t ch_num, UART_Type *uart_ptr, uint32_t src, uint32_t size) { dma_handshake_config_t config; dma_default_handshake_config(dma_ptr, &config); config.ch_index = ch_num; config.dst = (uint32_t)&uart_ptr->THR; // 目标为UART发送寄存器 config.dst_fixed = true; // 目标地址固定 config.src = src; // 源数据地址 config.src_fixed = false; // 源地址递增 config.data_width = DMA_TRANSFER_WIDTH_BYTE; config.size_in_byte = size; return dma_setup_handshake(dma_ptr, &config, true); }

3.2 接收数据DMA配置

接收配置与发送类似,但方向相反:

hpm_stat_t uart_rx_trigger_dma(DMA_Type *dma_ptr, uint8_t ch_num, UART_Type *uart_ptr, uint32_t dst, uint32_t size) { dma_handshake_config_t config; dma_default_handshake_config(dma_ptr, &config); config.ch_index = ch_num; config.dst = dst; // 目标为接收缓冲区 config.dst_fixed = false; // 目标地址递增 config.src = (uint32_t)&uart_ptr->RBR; // 源为UART接收寄存器 config.src_fixed = true; // 源地址固定 config.data_width = DMA_TRANSFER_WIDTH_BYTE; config.size_in_byte = size; return dma_setup_handshake(dma_ptr, &config, true); }

4. 中断处理与性能优化技巧

4.1 DMA传输完成中断处理

DMA传输完成需要通过中断通知CPU,以下是典型的中断服务例程:

void dma_isr(void) { volatile hpm_stat_t stat_rx_chn, stat_tx_chn; /* 检查RX通道状态 */ stat_rx_chn = dma_check_transfer_status(TEST_UART_DMA_CONTROLLER, TEST_UART_RX_DMA_CHN); if (stat_rx_chn & DMA_CHANNEL_STATUS_TC) { uart_rx_dma_done = true; } /* 检查TX通道状态 */ stat_tx_chn = dma_check_transfer_status(TEST_UART_DMA_CONTROLLER, TEST_UART_TX_DMA_CHN); if (stat_tx_chn & DMA_CHANNEL_STATUS_TC) { uart_tx_dma_done = true; } } /* 声明中断服务例程 */ SDK_DECLARE_EXT_ISR_M(TEST_UART_DMA_IRQ, dma_isr)

4.2 关键性能优化点

在实际项目中,以下技巧可以进一步提升DMA-UART性能:

  1. 双缓冲技术:准备两个缓冲区交替使用,一个在DMA传输时,另一个可供CPU处理数据
  2. 缓存对齐:确保DMA缓冲区地址按32字节对齐,可提升传输效率
  3. 传输块大小:根据UART FIFO大小设置合适的DMA传输块,推荐8-16字节
  4. 优先级配置:为关键DMA通道设置更高优先级
  5. 内存屏障:在DMA操作前后添加内存屏障指令,确保数据一致性

优化前后性能对比

优化措施传输速率提升CPU占用降低
基础DMA配置3x70%
双缓冲1.5x15%
缓存对齐1.2x5%
最优块大小1.3x10%

5. 实战案例:高速数据采集系统设计

假设我们需要设计一个采样率为100ksps的数据采集系统,通过UART以1Mbps速率上传数据。传统中断方式会导致CPU完全被占用,而DMA方案可以实现高效传输:

#define SAMPLE_BUFFER_SIZE 256 /* 双缓冲配置 */ uint8_t sample_buf1[SAMPLE_BUFFER_SIZE] __attribute__((aligned(32))); uint8_t sample_buf2[SAMPLE_BUFFER_SIZE] __attribute__((aligned(32))); volatile uint8_t *current_tx_buf = sample_buf1; volatile bool buf_ready = false; void adc_isr(void) { static uint32_t sample_count = 0; /* 采集数据存入当前非活动缓冲区 */ uint8_t *target_buf = (current_tx_buf == sample_buf1) ? sample_buf2 : sample_buf1; target_buf[sample_count++] = read_adc_value(); if(sample_count >= SAMPLE_BUFFER_SIZE) { current_tx_buf = target_buf; sample_count = 0; buf_ready = true; } } void main(void) { /* 初始化代码... */ while(1) { if(buf_ready) { uart_tx_trigger_dma(TEST_UART_DMA_CONTROLLER, TEST_UART_TX_DMA_CHN, TEST_UART, (uint32_t)current_tx_buf, SAMPLE_BUFFER_SIZE); buf_ready = false; } /* 其他任务处理 */ } }

这个案例展示了如何通过DMA实现数据采集与传输的解耦,使CPU能够并行处理其他任务。在实际测试中,这种设计可以将CPU占用率从100%降低到不足10%,同时保证数据传输的实时性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 20:59:00

工业显示MCU选型与抗干扰设计:S08LG系列实战解析

1. 项目概述&#xff1a;为什么工业显示需要一颗“特制”的MCU&#xff1f;在工业自动化、智能仪表这些领域干了十几年&#xff0c;我经手过不少显示方案。从最初的数码管、段码LCD&#xff0c;到后来的点阵屏、TFT彩屏&#xff0c;技术一直在演进&#xff0c;但有一个核心痛点…

作者头像 李华
网站建设 2026/6/12 20:57:19

华硕路由器终极网络净化指南:AdGuard Home一键安装教程

华硕路由器终极网络净化指南&#xff1a;AdGuard Home一键安装教程 【免费下载链接】Asuswrt-Merlin-AdGuardHome-Installer The Official Installer of AdGuardHome for Asuswrt-Merlin 项目地址: https://gitcode.com/gh_mirrors/as/Asuswrt-Merlin-AdGuardHome-Installer …

作者头像 李华
网站建设 2026/6/12 20:47:07

法考客观题题库大全及答案|题库|资料已整理

法考客观题题库及答案|客观题|资料已整理资料全科都有法考客观题题库及答案 资料 PDFhttps://pan.quark.cn/s/93750a162ca3 【英语真题】1. The report shows that regular practice can improve reading speed. The word "regular" is closest in meaning to&#x…

作者头像 李华
网站建设 2026/6/12 20:40:02

生成式AI的社会影响与风险应对策略

1. 生成式AI的社会技术影响全景分析生成式AI技术正在重塑我们获取信息、创作内容和进行人机交互的基本方式。作为一名长期观察AI技术社会影响的从业者&#xff0c;我注意到这项技术带来的变革远不止于表面效率提升&#xff0c;而是深入到社会结构和个体心理层面的系统性改变。从…

作者头像 李华
网站建设 2026/6/12 20:40:02

MCF5272嵌入式通信处理器:架构解析与工业网关应用实践

1. 项目概述&#xff1a;为什么MCF5272是嵌入式通信的“瑞士军刀”在嵌入式系统开发的江湖里&#xff0c;选型永远是第一道坎。尤其是在2000年前后那个网络化浪潮初起的年代&#xff0c;做一个带联网功能的设备&#xff0c;往往意味着要在主控MCU之外&#xff0c;再挂上一颗以太…

作者头像 李华
网站建设 2026/6/12 20:34:54

Python 爬虫项目:数码产品参数对比爬虫

前言 数码消费市场品类迭代速度快&#xff0c;各大电商平台、数码资讯站点汇聚了海量手机、笔记本、耳机、平板等数码产品信息&#xff0c;涵盖产品基础规格、硬件参数、功能配置、售价区间、用户点评等核心内容。产品参数是消费者选购、行业测评、竞品分析、价格走势研究的关…

作者头像 李华