STM32 TIM DMA burst 输出变频 PWM 波形

news2024/10/13 6:18:26

1. 问题背景

客户需要 MCU 输出一组变频的 PWM 波形来控制外围器件,并且不同频率脉冲的个数也不同。STM32U5 芯片拥有 TIM1/TIM8 高级定时器,还有通用定时器TIM2/TIM3/TIM4/TIM5 以及 TIM15/TIM16/TIM17。TIM 模块中,可通过修改 ARR 寄存器的值来修改 PWM 的频率。如果使用 TIM1/TIM8 或者 TIM15/TIM16/TIM17,则可以通过修改 RCR 与 CCR 寄存器,来控制脉冲个数及占空比。由于要同时修改多个 TIM 寄存器,需要使用 TIM 的 DMA burst 功能来实现此需求。

2. TIM DMA burst

STM32 片内部分 TIMER 在产生单个定时器事件情况下可以基于特定硬件机制触发多个 DMA 请求,这样产生多个连续的 DMA 传输来实现对多个 TIMER 寄存器的批量访问。

这就是所谓的 TIM DMA burst 功能,这里有两个专用寄存器:

  • TIMx_DCR :
  • DBSS : 触发 DMA burst 的事件源
  • DBL : DMA burst 传输个数
  • DBA : DMA burst 传输的 TIM 寄存器基地址索引
  • TIMx_DMAR :
  • TIM DMA Burst 时,DMA 访问此寄存器

3. 产生 PWM

本文使用 TIM1 来产生 PWM,在 U575 NECLEO 板上测试,MCU 主频为 100MHz。
使用两个频率分别对应 TIM 寄存器组的值如下:ARR/ RCR/ CCR1

uint32_t pulse1[3] = {1000, 2, 500} ;
uint32_t pulse2[3] = {5000, 1, 2500} ;

即输出 3 个 pulse1 的脉冲后,再输出 2 个 pulse2 脉冲,这样交替输出。

3.1. TIM 与 GPDMA 配置

3.1.1. TIM1 配置

TIM1 配置如下,使能寄存器预装载功能。

图1.TIM1 配置
在这里插入图片描述

3.1.2. GPDMA 配置

使用 GPDMA 通道 12 的 linked list 模式,并配置为循环模式:

图2.GPDMA 配置
在这里插入图片描述
Linked List 配置中,创建一个 list queue,并添加两个 list node,选择 GPDMA 来执行此 list queue,同样配置为循环模式,指定循环起始节点为 TN1,如下图。

图3.Linked List 配置
在这里插入图片描述
Linked List 节点配置中,使用 TIM1 update 事件来产生 DMA 请求,指定 DMA 目的地址为 TIMx_DMAR 寄存器,源地址为 pulse1 数组地址。TN2 只需将 pulse1 修改为 pulse2即可。

图4.Linked List Node 配置
在这里插入图片描述

3.1.3. TIMx_DCR 寄存器配置

在 CubeMX 生成代码后,添加以下代码,将 TIM 与 DMA 通道绑定,并配置TIMx_DCR 寄存器:

MX_TQ1_Config();
 /* Link created queue to DMA channel #######################################*/
 if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel12, &TQ1) != HAL_OK)
 {
 	Error_Handler();
 }
 
 __HAL_LINKDMA(&htim1, hdma[TIM_DMA_ID_CC1], handle_GPDMA1_Channel12);
 __HAL_TIM_ENABLE_DMA(&htim1, TIM_DMA_UPDATE);
 HAL_DMAEx_List_Start_IT(&handle_GPDMA1_Channel12);
 
 // update 事件触发 DMA burst
// 3 个 DMA transfer,分别修改 ARR/ RCR/ CCR1 寄存器
 // TIM 寄存器作为基地址的索引,ARR 寄存器索引为 11
 htim1.Instance->DCR = (1<<16) | ((3-1)<<8) | (11<<0);
 HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

3.1.4. 测试结果

测试结果如下图,可以看到两个频率的 PWM 波形交替输出,且脉冲个数也符合需求:

图5.PWM 波形输出
在这里插入图片描述

3.2. TIM 无 RCR 寄存器情况

3.2.1. TIM2/TIM3/TIM4/TIM5 无 RCR 寄存器

当使用的 TIM 无 RCR 寄存器时,上述方式无法配置每个频率的 PWM 脉冲个数。而在U5 系列上,GPDMA 的 12-15 通道具有 2D 寻址能力,同时也有 repeat 功能。利用repeat 特性同样可以实现上述需求,下面以 TIM2 为例。

在前面配置基础上,使能 DMA 通道的 2D 功能,并添加 2D 寻址配置:

图6.GPDMA 通道 2D 功能
在这里插入图片描述
图7.GPDMA 通道 2D 寻址配置
在这里插入图片描述

3.2.2. 配置 TIM2

配置 TIM2 CH1 输出 PWM,使用 PA5 引脚:

图8.TIM2 配置
在这里插入图片描述

3.2.3. 修改代码

在 CubeMX 生成代码后,修改 pulse1/pulse2 的值,将 TIM2 与 DMA 通道绑定,并配置 TIMx_DCR 寄存器,这样也可实现两个频率,不同脉冲个数 PWM 交替输出的需求。

uint32_t pulse1[3] = {1000, 0, 500};
uint32_t pulse2[3] = {5000, 0, 2500};
MX_TQ1_Config();
 /* Link created queue to DMA channel #######################################*/
 if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel12, &TQ1) != HAL_OK)
 {
 	Error_Handler();
 }
 
 __HAL_LINKDMA(&htim2, hdma[TIM_DMA_ID_CC1], handle_GPDMA1_Channel12);
 __HAL_TIM_ENABLE_DMA(&htim2, TIM_DMA_UPDATE);
 HAL_DMAEx_List_Start_IT(&handle_GPDMA1_Channel12);
 
 // update 事件触发 DMA burst
// 3 个 DMA transfer,分别修改 ARR/ CCR1 寄存器,RCR 寄存器值被忽略
 // TIM 寄存器作为基地址的索引,ARR 寄存器索引为 11
 htim2.Instance->DCR = (1<<16) | ((3-1)<<8) | (11<<0);
 HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);

4. 小结

使用 TIM DMA burst 功能,结合 STM32U5 的 GPDMA Linked list 模式及 2D 寻址特性,能灵活的输出 PWM 波形满足客户需求。

文档中所用到的工具及版本

1,STM32CubeMX 6.6.1
2,IAR 9.20.2


本文档参考ST官方的《【应用笔记】LAT1202+TIM+DMA+burst+输出变频+PWM+波形》文档。

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

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

相关文章

OWASP API 安全风险,有哪些安全措施

随着互联网的快速发展&#xff0c;Web应用已成为人们日常生活和工作中不可或缺的一部分。然而&#xff0c;Web应用的安全问题也日益凸显&#xff0c;给企业和个人带来了极大的风险。 对于一些安全行业的用户来说&#xff0c;不少都听过关于OWASP这个词&#xff0c;很多用户想要…

redis---位图Bitmap和位域 Bitfield

位图是字符串类型的拓展&#xff0c;可以使用一个string类型来模拟一个Bit数组。数组的下标就是偏移量&#xff0c;值只有0和1&#xff0c;也支持一些位运算&#xff0c;比如与或非&#xff0c;异或等等&#xff0c;它们的应用场景非常广泛比如可以用来记录用户的签到情况&…

【Java核心能力】饿了么一面:Redis 面试连环炮

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

flink1.18源码本地调试环境

01 源码本地调试环境搭建 1. 从github拉取源码创建本地项⽬ https://github.com/apache/flink.git 可以拉取github上官⽅代码 https://github.com/apache/flink.git GitHub - apache/flink: Apache Flink 2. 配置编译环境 ctrlaltshifts &#xff08;或菜单&#xff09;打…

zabbix 7.0 新增功能亮点(一)——T参数

概要&#xff1a; T参数是zabbix7.0新增的一项功能&#xff0c;它支持对配置文件进行可用性验证&#xff0c;即zabbix程序(server/proxy/agent等)修改配置文件后&#xff0c;支持-T或–test-config参数验证配置参数可用性。 T参数主要包含以下三个方面的应用场景&#xff1a; …

SQL语句生成器,支持MSSQL/MYSQL/SQLITE/ACCESS/EXCEL

经过7个月的艰苦开发&#xff0c;SQL语句生成器终于和各位见面了&#xff0c;因为工程量浩大&#xff0c;一度做到崩溃&#xff0c;差点烂尾&#xff0c;好在经过N次激烈思想斗争后还是坚持了下来累累累累累累累 本软件能够自动生成SQL语句及对应的易语言代码&#xff0c;还有相…

如何在Java中,使用jackson实现json缩进美化

导入的maven依赖 <!--json--> <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.10.0</version> </dependency>示例代码 json要是String类型 public…

HarmonyOS NEXT应用开发之MVVM模式

应用通过状态去渲染更新UI是程序设计中相对复杂&#xff0c;但又十分重要的&#xff0c;往往决定了应用程序的性能。程序的状态数据通常包含了数组、对象&#xff0c;或者是嵌套对象组合而成。在这些情况下&#xff0c;ArkUI采取MVVM Model View ViewModel模式&#xff0c;其…

Linux TUN设备实现Tunnel性能分析

一、TUN/TAP设备原理&#xff1a; Linux的TUN/TAP设备是一种可以使得应用层与TCP/IP协议栈交互的驱动模块&#xff0c;通常用于组建虚拟局域网中的点对点隧道&#xff08;Tunnel&#xff09;&#xff0c;可以工作于2层&#xff08;TAP设备&#xff09;和3层&#xff08;TUN设备…

下载与安装Latex(windows简洁板)

总共要安装两个软件&#xff1a;TeX Live与TeX Studio 下载与安装TeX Live 下载 下载地址&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/Images/ 点击&#xff1a; texlive2024.iso 文件很大&#xff0c;可能会慢点 2. 安装 下载好了iso文件&…

redis事务(redis features)

redis支持事务&#xff0c;也就是可以在一次请求中执行多个命令。redis中的事务主要是通过MULTI和EXEC这两个命令来实现的。 MULTI命令用来开启一个事务&#xff0c;事务开启之后&#xff0c;所有的命令就都会被放入到一个队列中&#xff0c;最后通过一个EXEC命令来执行事务中…

【项目新功能开发篇】开发编码

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

C++ //练习 11.9 定义一个map,将单词与一个行号的list关联,list中保存的是单词所出现的行号。

C Primer&#xff08;第5版&#xff09; 练习 11.9 练习 11.9 定义一个map&#xff0c;将单词与一个行号的list关联&#xff0c;list中保存的是单词所出现的行号。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /***********…

c++20协程详解(三)

前言 前面两节我们已经能够实现一个可用的协程框架了。但我们一定还想更深入的了解协程&#xff0c;于是我们就想尝试下能不能co_await一个协程。下面会涉及到部分模板编程的知识&#xff0c;主要包括&#xff08;模板偏特化&#xff0c;模板参数列表传值&#xff0c;模板函数…

Bat初級

目录 一、編碼發展史 二、Bat運行順序 1、Bat是從上到下逐句運行的。 三、一些Bat元素 1、和echo off 2、注釋 3、pause 4、errorlevel 5、title 6、COLOR 7、GOTO label 和 :label 8、FIND 9、START 目录 一、編碼發展史 二、Bat運行順序 1、Bat是從上到下逐句運行的。 三…

三维VR虚拟展馆打破传统展览的时间与空间限制

探索绿色未来&#xff0c;见证生态转型——这是长江经济带在国家发展蓝图中的承诺。如今&#xff0c;通过线上长江经济带发展阶段性成效展厅&#xff0c;这一承诺正以创新的互动体验呈现给公众&#xff0c;彰显了环境保护与经济增长的和谐统一。 深圳VR公司华锐视点精心策划的长…

学术前沿|通研院提出首个“对称现实”框架,探索智能时代人机共生新范式

人类正在迈入智能时代&#xff0c;其中一个显著特征是大量智能体的涌现。无论生物人、数字人和机器人&#xff0c;都是智能体的不同具身形式。为实现多种智能体在跨虚实空间的共存协作&#xff0c;探索人机共生的新范式&#xff0c;北京通用人工智能研究院&#xff08;简称通研…

Jenkins详细教程(下载安装、构建部署到Linux)

目录 第一章、快速了解Jenkins1.1&#xff09;Jenkins中一些概念介绍1.2&#xff09;Jenkins和maven用途上的区别1.3&#xff09;为什么使用Jenkins 第二章、Winodws下载安装Jenkins2.1&#xff09;安装之前的准备2.2&#xff09;Windows中Jenkins下载安装教程2.3&#xff09;J…

百度行驶证C++离线SDK V1.1 C#接入

百度行驶证C离线SDK V1.1 C#接入 目录 说明 效果 项目 代码 下载 说明 自己根据SDK封装了动态库&#xff0c;然后C#调用。 SDK包结构 效果 项目 代码 using Newtonsoft.Json; using System; using System.Drawing; using System.Runtime.InteropServices; using System…

【Android、 kotlin】kotlin学习笔记

基本语法 fun main(){val a2var b "Hello"println("$ (a - 1} $b Kotlin!")} Variables 只赋值一次用val read-only variables with val 赋值多次用var mutable variables with var Standard output printin() and print() functions String templ…