[灵动微电子 MM32BIN560CN MM32SPIN0280]读懂电机MCU之串口DMA

在 MM32SPIN560C 微控制器中,串口(UART)的 DMA 传输可大幅减轻 CPU 负担,实现数据的“自动收发”。结合《MM32SPIN560C 用户手册(中文版)》中 UART 和 DMA 相关章节,以下从“原理匹配”“配置步骤”“关键注意事项”三方面,详解串口打印(UART 发送)如何使用 DMA。

一、先明确:UART 与 DMA 的硬件关联

根据手册内容,UART 模块支持通过 DMA 实现数据发送(TX)和接收(RX),核心关联规则如下:

  1. DMA 通道映射
    UART 的 DMA 请求需映射到指定 DMA 通道,具体映射关系可通过 SYSCFG_CFGR 寄存器(系统控制器配置寄存器)调整。以常用的 UART1 为例:
    • UART1_TX(发送)默认映射到 DMA 通道 2,若配置 SYSCFG_CFGR.UART1_TX_DMA_RMP = 1,可重映射到 DMA 通道 4;
    • UART1_RX(接收)默认映射到 DMA 通道 3,若配置 SYSCFG_CFGR.UART1_RX_DMA_RMP = 1,可重映射到 DMA 通道 5(参考手册“11.5.1 DMA 请求映像”章节)。
  2. DMA 传输方向
    串口打印为“存储器到外设”方向——DMA 从指定的 RAM 缓冲区中读取数据,自动发送到 UART 的发送数据寄存器(UART_TDR),无需 CPU 逐字节写入。

二、串口打印(UART_TX)用 DMA 的详细配置步骤

以“UART1 结合 DMA 通道 2 实现串口打印”为例,结合手册寄存器配置逻辑,步骤如下:

第一步:使能核心外设时钟

需先为 UART、DMA、SYSCFG(用于 DMA 通道重映射,可选)使能时钟,确保模块正常工作:

  1. 使能 UART1 时钟
    配置 RCC_APB2ENR(APB2 外设时钟使能寄存器)的 UART1 位为 1(手册“5.3.8 RCC_APB2ENR”章节),UART1 挂载于 APB2 总线,时钟频率最高支持 96MHz。
  2. 使能 DMA 时钟
    配置 RCC_AHBENR(AHB 外设时钟使能寄存器)的 DMA 位为 1(手册“5.3.7 RCC_AHBENR”章节),DMA 挂载于 AHB 总线,需确保 AHB 时钟正常。
  3. (可选)使能 SYSCFG 时钟
    若需调整 UART1 与 DMA 的通道映射(如重映射到通道 4),需配置 RCC_APB2ENRSYSCFG 位为 1(手册“5.3.8 RCC_APB2ENR”章节),后续通过 SYSCFG_CFGR 寄存器修改映射关系。

第二步:配置 UART 基本参数(波特率、数据格式)

串口打印需先确定 UART 通信参数,确保与上位机(如电脑串口助手)匹配:

  1. 配置波特率
    通过 UART_BRR(波特率寄存器)和 UART_FRA(分数波特率寄存器)设置波特率。例如,若 APB2 时钟为 48MHz,需配置 9600bps 波特率,可计算 UART_BRR = 48000000 / (16 * 9600) = 312(即 0x138),UART_FRA 配置为 0(手册“23.7.10 UART_BRR”章节)。
  2. 配置数据格式
    通过 UART_CCR(通用控制寄存器)设置:数据位(默认 8 位)、停止位(默认 1 位)、校验位(无校验则配置 UART_CCR.PCE = 0)(手册“23.7.9 UART_CCR”章节)。
  3. 使能 UART 发送功能
    配置 UART_GCR(全局控制寄存器)的 TE 位为 1(使能发送),UE 位为 1(使能 UART 模块)(手册“23.7.8 UART_GCR”章节)。

第三步:配置 DMA 通道(以 DMA 通道 2 为例)

DMA 配置需明确“传输源地址、目标地址、传输数量、传输方向”等核心参数,对应手册“11.7 DMA 寄存器”章节:

  1. 配置 DMA 通道 2 基本参数
    • 选择通道:确保 DMA 通道 2 映射到 UART1_TX(默认映射,无需修改 SYSCFG_CFGR);
    • 配置 DMA_CCR2(DMA 通道 2 配置寄存器):
      • DIR = 1:传输方向为“存储器到外设”(符合串口发送需求);
      • MINC = 1:存储器地址递增(发送缓冲区数据连续读取);
      • PINC = 0:外设地址固定(UART_TDR 地址不变);
      • MSIZE = 00:存储器数据宽度为 8 位(串口数据为字节格式);
      • PSIZE = 00:外设数据宽度为 8 位(UART_TDR 接收 8 位数据);
      • TEIE = 0HTIE = 0TCIE = 1:仅使能“传输完成中断”(可选,用于判断打印结束);
      • EN = 0:暂不使能通道,待参数配置完成后使能。
  2. 配置 DMA 传输地址与数量
    • DMA_CPAR2(外设地址寄存器):写入 UART1_TDR 的地址(手册“23.7.2 UART_TDR”章节,地址为 0x40013800);
    • DMA_CMAR2(存储器地址寄存器):写入 RAM 中发送缓冲区的首地址(如 uint8_t tx_buf[] = "Hello DMA!",则地址为 (uint32_t)tx_buf);
    • DMA_CNDTR2(传输数量寄存器):写入发送数据的长度(如字符串长度为 10,则配置为 10)。

第四步:使能 DMA 与 UART 的 DMA 发送功能

  1. 使能 UART 的 DMA 发送请求
    配置 UART_IER(中断使能寄存器)的 TX_DMA_EN 位为 1(手册“23.7.6 UART_IER”章节),允许 UART 向 DMA 发送“发送请求”。
  2. 使能 DMA 通道 2
    配置 DMA_CCR2.EN = 1,DMA 开始工作——自动从 tx_buf 读取数据,发送到 UART_TDR,直至 DMA_CNDTR2 递减至 0(传输完成)。

第五步:(可选)处理 DMA 传输完成中断

若需在打印结束后执行后续操作(如发送下一段数据),可配置 DMA 传输完成中断:

  1. 使能 NVIC 中的 DMA 中断
    在 NVIC 控制器中,使能 DMA 通道 2 的中断(中断号可参考手册“10.3.2 中断向量表”),设置中断优先级。
  2. 编写中断服务函数
    DMA_ISR.TCIF2 = 1(通道 2 传输完成标志)时,清除标志(配置 DMA_IFCR.CTCIF2 = 1),并执行后续逻辑(如重新配置 DMA_CNDTR2 发送新数据)(手册“11.7.1 DMA_ISR”章节)。

三、关键注意事项(避坑指南)

  1. 地址对齐要求
    DMA 传输中,存储器地址和外设地址需与数据宽度对齐。例如,若数据宽度为 8 位(字节),地址无特殊要求;若为 16 位(半字),地址需为 2 的倍数(手册“11.6.4 可编程的数据传输宽度”章节)。串口打印为字节传输,无需额外处理对齐。
  2. DMA 通道映射唯一性
    每个 DMA 通道同一时间只能对应一个外设请求。若 DMA 通道 2 已用于 UART1_TX,不可再同时映射到其他外设(如 SPI1_RX)(手册“11.5.1 DMA 请求映像”章节)。
  3. UART 发送缓冲区空判断
    虽然 DMA 自动发送,但需确保 UART 发送缓冲区(UART_TDR)空闲时启动 DMA 传输。可通过读取 UART_CSR.TXE 位(发送缓冲区空)为 1 时,再使能 DMA 通道(手册“23.7.4 UART_CSR”章节)。
  4. 中断标志清除
    DMA 传输完成后,需通过 DMA_IFCR 寄存器清除中断标志(而非直接写 DMA_ISR),否则中断会持续触发(手册“11.7.2 DMA_IFCR”章节)。

四、总结

MM32SPIN560C 串口打印用 DMA 的核心逻辑是“UART 触发 DMA 请求,DMA 自动完成数据搬运”,配置时需遵循“时钟使能→UART 参数配置→DMA 通道配置→使能传输”的流程,且严格参考手册中寄存器的位定义(如 DMA_CCRx 的方向、地址递增配置,UART_GCR 的发送使能)。通过 DMA 传输,CPU 无需等待串口发送完成,可专注于其他任务,大幅提升系统效率。

电机场景串口波形中的应用:故障监测与状态分析

电机运行时,需通过串口波形监测 “电流波动、转速反馈、控制信号” 等关键参数,排查堵转、过载等故障。“UART+DMA” 的组合能确保波形数据无丢失、低延迟,具体应用如下:

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

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

相关文章

【机器学习】-torch相关知识01

学习代码时遇到的问题,GPT给的答案,如有错误请指出。 问题1 torch.empty nn.init.xavier 问题2 nn.Parameter 是什么? 问题3 self.add_module 问题4 torch.matmul torch.mm 文章目录问题1 torch.empty nn.init.xavier问题2 nn.Parameter 是什…

Hutool DsFactory多数据源切换

一、简单上手&#xff1a;从配置到使用全流程 DsFactory 的核心优势是零侵入配置&#xff0c;支持多种配置方式&#xff0c;不管是 properties 文件还是代码里直接定义&#xff0c;都能快速初始化数据源。先引依赖&#xff08;Maven&#xff09;&#xff1a; <dependency>…

Mysql中事务隔离级别有哪些?

Mysql中事务隔离级别有哪些&#xff1f; 读未提交&#xff1a; 一个事务可以看到另一个事务尚未提交的数据。可能导致脏读。 读已提交&#xff1a; 一个事务只能看到其他事务提交后的数据。避免了脏读&#xff0c;仍可能引发不可重复读。 可重复读&#xff1a; 可以确保一个事务…

el-carousel在新增或者删除el-carousel-item时默认跳到第一页的原因和解决

现象 使用走马灯效果时 当el-carousel-item增加或者减少时&#xff0c;页会跳到第一页 体验很不友好。 原因 当新增或这删除el-carousel-item时&#xff0c;会触发setActiveIndex&#xff08;props.initialindex&#xff09;, setActiveIndex的行为是小于0或者大于最大页会有一…

人工智能学习:机器学习相关面试题(二)

7、有监督学习和无监督学习的区别 有监督学习&#xff1a; 对具有概念标记&#xff08;分类&#xff09;的训练样本进行 学习&#xff0c;以尽可能对训练样本集外的数据进行 标记&#xff08;分类&#xff09;预测。 这里 &#xff0c;所有的标记&#xff08;分类&#xff09…

python如何下载svg图片

# 生成博客文章框架代码 import datetimeblog_content f"""# Python如何下载SVG图片## 引言 SVG&#xff08;可缩放矢量图形&#xff09;作为一种基于XML的矢量图形格式&#xff0c;在Web开发中广泛应用。本文将介绍如何使用Python从网络下载SVG图片&#xff0…

Linux(一) | 初识Linux与目录管理基础命令掌握

个人主页-爱因斯晨 文章专栏-Linux 最近学习人工智能时遇到一个好用的网站分享给大家&#xff1a; 人工智能学习 文章目录个人主页-爱因斯晨文章专栏-Linux一、前言1.为什么学习Linux2.操作系统概述&#xff1a;3.常见的操作系统&#xff1a;二、初识Linux1.诞生2.什么是Linux…

android-studio 安装

下载地址 国内&#xff1a;https://developer.android.google.cn/studio?hlzh-cn 全国&#xff1a;https://developer.android.com/studio 1.设置 ANDROID_HOME 环境变量 ANDROID_HOME D:\zhy\android-studio\sdk 2. 更新 PATH 环境变量 %ANDROID_HOME%\platform-tools %AN…

【重学MySQL】九十三、MySQL字符集与比较规则完全解析

【重学MySQL】九十三、MySQL字符集与比较规则完全解析一、字符集概述1.1 支持的字符集1.2 UTF8与UTF8MB4的区别二、比较规则&#xff08;Collation&#xff09;2.1 比较规则分类2.2 常见比较规则差异三、配置层级与继承关系3.1 配置层级3.2 继承关系四、最佳实践与问题解决4.1 …

基于Kafka的延迟队列

实现原理 通过topic区分不同的延迟时长&#xff0c;每个topic对于一个延迟&#xff0c;比如 topic100 仅存储延迟 100ms 的消息&#xff0c;topic1000 仅存储延迟 1s 的消息&#xff0c;依次类推。生产消息时&#xff0c;消息需按延迟时长投递到对应的topic。消费消息时&#x…

LabVIEW转速仪校准系统

LabVIEW 与机器视觉的智能校准系统以工控机为核心&#xff0c;整合标准源、智能相机等硬件&#xff0c;通过软件实现校准流程自动化&#xff0c;支持 500-6000r/min 转速范围校准&#xff0c;覆盖 5 类转速测量仪&#xff0c;校准时间缩短约 70%&#xff0c;满足计量院高效、精…

Synchronized 概述

1. 初识 synchronized 是 Java 中的关键字&#xff0c;是一种 同步锁 &#xff0c;可重入锁&#xff0c;悲观锁。它修饰的对象有以下几种&#xff1a; 具体表现为以下3种形式。 对于普通同步方法&#xff0c;锁是当前实例对象。 对于静态同步方法&#xff0c;锁是当前类的 Clas…

通过Auth.log来查看VPS服务器是否被扫描和暴力破解及解决办法

说明&#xff1a;很多人vps可能出现过被扫的情况&#xff0c;有的还被爆破了&#xff0c;这里提供下查看方法 查看用密码登陆成功的IP地址及次数grep "Accepted password for root" /var/log/auth.log | awk {print $11} | sort | uniq -c | sort -nr | more查看用密…

碰一碰发视频手机版源码开发:支持OEM

**从事开发 20 年&#xff0c;见过不少技术风口起起落落&#xff0c;最近 “碰一碰发视频” 又成了热门话题。不少同行或刚入行的年轻人来问我&#xff0c;手机版源码开发该从哪下手&#xff0c;怕踩坑、怕走弯路。今天就以一个老程序员的视角&#xff0c;把碰一碰发视频手机版…

只出现一次的数字(总结)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、给定一个整数数组nums&#xff0c;除了某个元素只出现一次以外&#xff0c;其余元素均出现两次。找出那个只出现一次的元素二、给你一个整数数组nums&#x…

Cesium 入门教程(十一):Camera相机功能展示

文章目录一&#xff0c;Cesium 实际示例&#xff08;含源代码&#xff09;1&#xff0c;vuecesium&#xff1a; 围绕一个固定点自动左右旋转2&#xff0c;vuecesium&#xff1a; flyto一个具体的实体位置3&#xff0c;vuecesium&#xff1a; flyto一个具体的点位置4&#xff0c…

go语言基本排序算法

package mainimport "fmt"func main() {BubbleSort()SelectSort()InsertSort()MergeSort()QuickSort()HeapSort()ShellSort() }//冒泡排序 func BubbleSort() {str : []int{9, 1, 5, 8, 3, 7, 4, 6, 2}for i : 0; i < len(str)-1; i {flag : falsefor j : len(str…

一步完成CalDAV账户同步,日历服务助力钉钉日历日程集中管理

在信息爆炸节奏飞快的今天&#xff0c;高效的管理时间已经成为我们工作和生活中的核心竞争力&#xff0c;复杂纷繁的日程安排&#xff0c;无处不在的提醒需求以及跨设备同步的困扰&#xff0c;这些问题仿佛都在呼唤着一个更智能、更便捷、更可靠的解决方案。 而华为日历App&am…

企业内部机密视频安全保护|如何防止企业内部机密视频泄露?

在企业数字化进程飞速发展的今天&#xff0c;视频内容已成为承载企业内部培训、战略会议、产品机密和核心技术的关键载体。一次意外的泄露&#xff0c;不仅可能导致知识产权流失&#xff0c;更会让企业声誉和市场竞争力遭受重创。面对无孔不入的安全威胁&#xff0c;企业该如何…

C# Deconstruct | 简化元组与对象的数据提取

官方文档&#xff1a;析构元组和其他类型 - C# | Microsoft Learn 标签&#xff1a;Deconstruct、Tuple、record、模式匹配 PS&#xff1a;record相关内容后续还会继续更新&#x1f504; 模式匹配可以查看我的另一篇&#x1f449;模式匹配 目录1. 概述2. 基本用法2.1 元组解…