STM32 TIM DMA burst 输出变频 PWM 波形

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+波形》文档。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OSPF中配置静态路由负载分担实验简述

OSPF中配置静态路由负载分担 实验简述 在静态路由负载分担中&#xff0c;多个路由器被配置为共享负载的目标&#xff0c;以实现流量的均衡分配。 到达目的地有N条相同度量值的路径&#xff0c;默认值60&#xff0c;N条路由是等价路由&#xff0c;数据报文在N条链路上轮流发送。…

docker------docker入门

&#x1f388;个人主页&#xff1a;靓仔很忙i &#x1f4bb;B 站主页&#xff1a;&#x1f449;B站&#x1f448; &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;Linux &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#…

php运行python脚本失败怎么解决

假设有文件&#xff1a;php_test.php python_test.py 在php文件中运行Python&#xff1a; exec("python python_test.py", $array, $ret); 如果运行Python出错并不能保存在数组array中&#xff0c;因此应该把标准错误重定向到文件中&#xff0c;以上代码改写如下&a…

国外媒体推广软文宣发:促进海外宣发新风尚,迈向国际舞台

大舍传媒http://www.dashemeijie.com 序言 伴随全球经济一体化发展趋向&#xff0c;越来越多的中国企业希望在国际舞台上表现自己的总体水平。而国外媒体软文发稿作为一种全新的海外宣传方式&#xff0c;正逐渐成为促进海外宣发新风尚的主要常用工具。接下来我们就探讨国外媒…

记 log4j-over-slf4j.jar AND bound slf4j-log4j12.jar jar包冲突问题

报错信息如下 SLF4J: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path, preempting StackOverflowError. SLF4J: See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details. Exception in thread “main” java.lan…

WPS二次开发专题:如何获取应用签名SHA256值

作者持续关注WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 在申请WPS SDK授权版时候需要开发者提供应用包名和签…

uni-app开发微信小程序使用BLE低功耗蓝牙正确步骤

文章目录 前言连接逻辑建议 参考资料&#xff1a;https://www.hc01.com/downloads 前言 微信小程序通过蓝牙连接设备&#xff0c;所以需要使用到BLE连接。 思路&#xff1a; 小程序连接BLE的步骤已经知道设备的BLE名称、服务id、特征值ID。需要根据蓝牙模块提供商的说明书去…

Pycharm+Neo4j红楼梦人物关系图谱

欢迎来到我的主页~【蜡笔小新..】 本篇收录于专栏【Python】 如果对你有帮助&#xff0c;希望点赞收藏加关注啦~ 目录 前言 neo4j基础知识 Pycharm及代码实现 py2neo 数据集获取 代码介绍 前言 Python实验课时&#xff0c;老师提到用知识图谱构建红楼梦的人物关系图&…

实战webSocket压测(二)jmeter配置webSocket连接

背景 我们可以通过Jmeter添加插件实现webSocket脚本编写。WebSocket的插件较多&#xff0c;我选择以WebSocket Samplers by Peter Doornbosch为例来进行配置。 步骤1、WebSocket Samplers插件安装 下载地址&#xff1a;JMeter WebSocket Samplers&#xff0c;建议下载最新版本…

如何在pgAdmin中用替换的值更新jsonb列?(二)

上一篇提到怎么替换jsonb&#xff0c;链接如下&#xff1a; 如何在pgAdmin中用替换的值更新jsonb列&#xff1f;-CSDN博客 那么当jsonb嵌套jsonb应该怎么替换呢&#xff1f;像这样&#xff0c;类型依然是jsonb&#xff0c;只不过嵌套一层&#xff0c;JsonData&#xff1a;&qu…

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 代码块 /***********…

九河云:在AWS上实现跨region VPC互联

如何跨region实现不同VPC之间的对等链接&#xff1f;九河云为您介绍AWS跨region连接方案。 说明&#xff1a;VPC-A位于弗吉尼亚region&#xff0c;VPC-B位于俄勒冈region 本文将在同一账户的弗吉尼亚和俄勒冈VPC中各启用一台EC2&#xff08;本文已提前创建好VPC、EC2等资源&am…

hive的使用(本地数据上传到idea)

1.首先第一步是先启动hive&#xff0c;hive的启动指令如下 nohup hiveserver2 & 2.然后我们进入idea中 这里我们使用的是idea里的Apache Hive的插件&#xff0c;进行配置&#xff0c;等我们跟moba连接好后&#xff0c;就可以进行数据的导入了。 hive的sql和mysql里的sql语…

WPS二次开发系列:以自动播放模式打开PPT文档

在前面文章中 WPS SDK打开文档并实现保存回传 介绍了如何使用WPS SDK打开文档&#xff0c;那么我们是否能够实现在打开WPS 文档的时候能够传递一些参数来控制打开文档的行为呢&#xff0c;经过研究WPS SDK相关文档和API&#xff0c;最终实现了 以自动播放方式打开PPT文档功能。…

LeetCode-146. LRU 缓存【设计 哈希表 链表 双向链表】

LeetCode-146. LRU 缓存【设计 哈希表 链表 双向链表】 题目描述&#xff1a;解题思路一&#xff1a;双向链表&#xff0c;函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。一张图&#xff1a;知识点__slots__ 解题思路二&#xff1a;0解题思路三&#xff1a;0 题目描述&am…

【Web】2024红明谷CTF初赛个人wp(2/4)

目录 ezphp playground 时间原因只打了2个小时&#xff0c;出了2道&#xff0c;简单记录一下 ezphp 参考文章 PHP filter chains: file read from error-based oracle https://github.com/synacktiv/php_filter_chains_oracle_exploit 用上面的脚本爆出部分源码&#xff…

uniapp开发app使用谷歌地图(ios跟安卓)

前提条件&#xff1a; 谷歌地图需要翻墙&#xff0c;否则无法加载 谷歌地图说明 文档地址&#xff1a;概览 | Maps JavaScript API | Google for Developers 设置地图语言 <script asyncsrc"https://maps.googleapis.com/maps/api/js?keyYOUR_API_KEY&lang…

HarmonyOS NEXT应用开发之ForEach:循环渲染

ForEach接口基于数组类型数据来进行循环渲染&#xff0c;需要与容器组件配合使用&#xff0c;且接口返回的组件应当是允许包含在ForEach父容器组件中的子组件。例如&#xff0c;ListItem组件要求ForEach的父容器组件必须为 List组件 。 说明&#xff1a; 从API version 9开始&a…

vue3+echarts:echarts地图打点显示的样式

colorStops是打点的颜色和呼吸灯、label为show是打点是否显示数据、rich里cnNum是自定义的过滤模板用来改写显示数据的样式 series: [{type: "effectScatter",coordinateSystem: "geo",rippleEffect: {brushType: "stroke",},showEffectOn: &quo…

外链工具源码版V2

请将zip文件全部解压缩即可访问&#xff01; 源码全部开源&#xff0c;支持上传二级目录访问 #已更新增加大量高质量外链&#xff08;若需要增加修改其他外链请打开txt文件&#xff09; #修复优化页面端 源码下载地址&#xff1a;外链工具源码版V2