【ST NUCLEO-U5A5ZJ-Q开发板测评】PWM+PGDMA实现PWM不同频率输出
<div class='showpostmsg'><p><a href="https://bbs.eeworld.com.cn/thread-1271633-1-1.html#pid3299375">STM32Cube配置STM32U5Axxx芯片不生成GPDMA1初始化代码 - stm32/stm8 - 电子工程世界-论坛 (eeworld.com.cn)</a></p><p>应管管大大的吩咐,特地用PWM+GPDMA来实现PWM波形的输出。</p>
<p>【实验环境】</p>
<p>STM32CubeIDE1.14.0</p>
<p>【实现步骤】</p>
<p>1、用STM32CubeIDE新建基于NUCLEO-U5A5ZJ-Q开发板的工程。</p>
<p>2、打开TIM1+CH1通道来实现PWM输出:</p>
<p> </p>
<p>2、配置GPDMA,需要选择12通道以上,要不然会出现断言错误。</p>
<p> 3、配置PWM1输出参数,使用两个频率分别对应TIM寄存器组的值如下:ARR/ RCR/ CCR1</p>
<p>定义两个数组:</p>
<p>uint32_t pulse1 = {1000, 2, 500} ;</p>
<p>uint32_t pulse2 = {5000, 1, 2500} ;</p>
<p>即输出2个pulse1的脉冲后,再输出1个pulse2脉冲,这样交替输出。</p>
<p>4、配置GPDMA,使用GPDMA 通道12的 linked list模式,并配置为循环模式:</p>
<p> 5、Linked List 配置中,创建一个list queue,并添加两个list node,选择GPDMA来执行 此list queue,同样配置为循环模式,指定循环起始节点为TN1,如下图。</p>
<p> 6、Linked List 节点配置中,使用TIM1 update事件来产生DMA请求,指定DMA目的地 址为TIMx_DMAR寄存器,源地址为pulse1数组地址。TN2只需将pulse1修改为pulse2 即可。</p>
<p> </p>
<p> </p>
<p>7、在CubeMX生成代码后,添加以下代码,将TIM与DMA通道绑定,并配置 TIMx_DCR寄存器:</p>
<pre>
<code>MX_TQ1_Config();
if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel12, &TQ1) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(&htim1, hdma, 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);</code></pre>
<p>测试结果如下图,可以看到两个频率的PWM波形交替输出,且脉冲个数也符合需求:</p>
<p> 附工程文件:</p>
<div></div>
<p>搜索的教程为:<a href="https://shequ.stmicroelectronics.cn/thread-638925-1-1.html">TIM DMA burst 输出变频 PWM 波形 (stmicroelectronics.cn)</a></p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>@<a href="https://bbs.eeworld.com.cn/home.php?mod=space&uid=536508" target="_blank">okhxyyo</a> 已经完成管管大大的交给的任务,希望给他有用@<a href="https://home.eeworld.com.cn/space-uid-393146.html" target="_blank">bigbat</a></p>
<p>GPDMA还是PGDMA?就是DMA功能吧 </p>
<p> 我再看了一下,他的命名还是GPDMA。</p>
<p>引用ST的解释是:<font face="Tahoma"><font style="overflow-wrap:break-word; color:#333333; font-size:14px; font-style:normal; font-variant-ligatures:normal; font-weight:400; text-align:start; white-space:normal; background-color:#ffffff; text-decoration-thickness:initial; text-decoration-style:initial; text-decoration-color:initial"><font size="3"><font style="overflow-wrap:break-word"><font color="#000000"><font style="overflow-wrap:break-word">GPDMA是一个系统外围设备,并</font></font></font></font></font></font><font face="Tahoma"><font style="overflow-wrap:break-word; color:#333333; font-size:14px; font-style:normal; font-variant-ligatures:normal; font-weight:400; text-align:start; white-space:normal; background-color:#ffffff; text-decoration-thickness:initial; text-decoration-style:initial; text-decoration-color:initial"><font size="3"><font style="overflow-wrap:break-word"><font color="#000000"><font style="overflow-wrap:break-word">且是AHB总线上的一个双端口主服务器。它用于通过链表在外设和/或内存之间传输数据。所有的GPDMA可编程传输在系统级别上</font></font></font></font></font></font><font face="Tahoma"><font style="overflow-wrap:break-word; color:#333333; font-size:14px; font-style:normal; font-variant-ligatures:normal; font-weight:400; text-align:start; white-space:normal; background-color:#ffffff; text-decoration-thickness:initial; text-decoration-style:initial; text-decoration-color:initial"><font size="3"><font style="overflow-wrap:break-word"><font color="#000000"><font style="overflow-wrap:break-word">提供了更高的性能,并卸载执行这些数据传输任务的CPU。</font></font></font></font></font></font></p>
<p><font color="#000000" face="Tahoma" size="3">当然也是DMA的意思 。</font></p>
秦天qintian0303 发表于 2024-2-6 09:00
GPDMA还是PGDMA?就是DMA功能吧
<p>GPDMA现在称为通用DMA,LPDMA是低电压供电的DMA,设备中带L的都是可以在省电模式下使用的</p>
<p>我做了一晚上的实验,你的.IOC文件可以输出代码,我只要修改一下通道就不可以了,请教一下</p>
<p>linked list模式和Standard Request模式有什么区别。只要选择Standard Request模式就不会生成代码,按理说标准模式应该没有错误啊。</p>
<p> </p>
<p>我已经搞清楚了linked list模式和Standard Request模式的区别了,可以参考下面的链接文章</p>
<p><a href="https://community.st.com/t5/stm32-mcus/how-to-configure-the-gpdma/ta-p/49412" target="_blank">如何配置GPDMA</a></p>
bigbat 发表于 2024-2-6 10:50
我已经搞清楚了linked list模式和Standard Request模式的区别了,可以参考下面的链接文章
如何配置GPDMA ...
<p>我前面在用599时拆腾了好久,调试了一晚上才找到问题。</p>
bigbat 发表于 2024-2-6 10:13
我做了一晚上的实验,你的.IOC文件可以输出代码,我只要修改一下通道就不可以了,请教一下
linked list ...
<p>他需要配置这个链表才能正常使用吧,我也是照抄,没有去深入。</p>
<p>非常感谢分享</p>
kevin----- 发表于 2024-2-24 18:17
非常感谢分享
<p>感谢大佬的关注,论坛有很多的新开发板的试用机会,多来参与一下,期待您的作品。。。</p>
lugl4313820 发表于 2024-2-6 09:05
我再看了一下,他的命名还是GPDMA。
引用ST的解释是:GPDMA是一个系统外围设备,并且是AHB总线上 ...
<p>赞</p>
页:
[1]