0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

通过STM32 UART及DMA修改TIMER占空比示例

茶话MCU 来源:茶话MCU 作者:茶话MCU 2022-11-12 15:33 次阅读

现在有人谈到这样一个需求,他使用STM32F429芯片做开发,其中用到TIM2做3路PWM输出。另外有个上位机跟STM32的UART接口相连,上位机可能不定期地需要通过UART接口给STM32发送新的占空比参数,而且每次都发送3个输出通道的比较参数。如何快捷地实现这个功能呢?要求收到数据后尽快修改3个比较通道的参数。

STM32F429的TIM2是32位定时器,3个通道的CCR寄存器也是32位的。那么上位机每次发3个通道的参数对应12字节的数据。

显然,整体上功能不算复杂。我们可以先通过UART收到12字节数据,稍加整理后手动将数据逐字写到3个CCR寄存器来改变PWM输出。说实在的,这个方案的实现过程还是很清晰的,相信也是很多人的选择。或许有人觉得操作起来稍显琐碎,有没有比这个操作更方便快捷的呢?

既然这样,我们可以调整下做法。因为STM32的高级定时器和大部分通用定时器都支持基于定时器事件的DMABurst传输。即先通过UART收到12字节数据,稍加整理后借助于定时器事件的DMA Burst 传输 一次性地将3个字【12字节】的数据传输到CCR1CCR2CCR3三个寄存器,从而实现3个通道PWM的占空比的调整。实际上就是将上面第一种方案的手动逐个修改变为DMA批量修改。

毫无疑问,这个第2种方案也是可行、挺方便的。但使用该方案就得研究下基于定时器事件的DMABurst传输的内容,数据的修改需借助定时器事件。当然,所用定时器还得支持TIMERBurst DMA传输功能。说实在的,数据修改是变快捷了,但貌似难度提升了、代码方面相比第一种方案变得复杂了。【为何说貌似,毕竟难易因人而异。】那有没有一种更为通用的常规做法来实现上述功能呢?

我们不妨看看第3种方案。因为这里所选芯片STM32F429的DMA是带4字FIFO的,我们可以通过UART按字节接收数据,然后经过FIFO打包成字,再通过DMA直接将数据送到3个输出通道的CCR寄存器。这样操作的话就非常简单快捷,DMA的传输不涉及定时器事件,也不再要求定时器支持基于定时器事件的DMA Burst传输功能,自然也就无须使用者花精力研究这块内容。相比前两种方案,代码方面也更为简单。

那么,我这里就专门选择第3种方案,来简单演示下它的实现过程。

下面我用UART自发自收来模拟来自上位机的修改CCR参数的数据信号

TIM2使用3个通道做PWM输出,参考配置如下:

99e524fc-3c7f-11ed-9e49-dac502259ad0.png

9a0962b8-3c7f-11ed-9e49-dac502259ad0.png

我这里选用USART1外设,开启其TX/RX事件的DMA传输功能。参考配置如下:

9a2bd280-3c7f-11ed-9e49-dac502259ad0.png

9a4f7f28-3c7f-11ed-9e49-dac502259ad0.png

我用32位TxData【3】数组存放待传输的3个CCR值。

uint32_t TxData[]={2000,4000,8000};//3个初始值我随便定的。

使用CubeMx配置完成后,添加相关用户代码。【基于HAL库组织代码】

9a5dbb92-3c7f-11ed-9e49-dac502259ad0.png

上面三行代码的功能一目了然,即开启TIM2定时器3个通道的PWM输出功能。

下面循环体代码,就是修改CCR的值、通过UART 发、收,利用DMA修改3个通道的值,进而调整PWM输出占空比。这样循环进行,我们通过示波器查看输出结果。

9a794af6-3c7f-11ed-9e49-dac502259ad0.png

稍作编译调试,即可通过示波器可以看到预期的结果。下面三副截图代表不同时刻三个通道的输出情况。

9a8e3006-3c7f-11ed-9e49-dac502259ad0.png

9ab2734e-3c7f-11ed-9e49-dac502259ad0.png

9abf7634-3c7f-11ed-9e49-dac502259ad0.png

从上面截图不难看出,3个输出通道的PWM占空比在动态改变。当然,我们也可以通过IDE的寄存器观察窗口查看CCR值的改变,如下图所示:

9bb1662e-3c7f-11ed-9e49-dac502259ad0.png

上面重点针对第3种方案的实现过程做了简单的演示。基本配置、实现代码都是3种方案中最简捷的,也是较为常规的通用做法。其中的关键配置和实现代码我都清晰地贴出来了,以便有需要的人士参考。其实,只要我们对STM32的DMA功能把握得比较好,吃透原理、把握细节,实现起来也不算难。

最后顺便用一个与本文内容相关的小细节提醒来结尾。关于STM32的定时器的各个寄存器在地址空间中的地址安排,其中TIMx_CCR1,TIMx_CCR2, TIMx_CCR3,TIMx_CCR4这几个寄存器的地址总是依次顺序摆放的,了解这点对阅读上面个别函数调用有帮助。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117719
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348738
  • uart
    +关注

    关注

    22

    文章

    1159

    浏览量

    99959

原文标题:通过STM32 UART及DMA修改TIMER占空比示例

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32 TIMER+DMA输出PWM异常案例的问题解析

    有人使用STM32U575的TIMER加上DMA做PWM输出。具体就是利用某TIMER的一个通道的比较事件触发DMA
    的头像 发表于 09-28 09:04 4243次阅读
    <b class='flag-5'>STM32</b> <b class='flag-5'>TIMER+DMA</b>输出PWM异常案例的问题解析

    STM32G4 UART+TIMER+DMA应用示例

    这里使用STM32G4系列Nucleo开发板演示如下需求的实现过程。
    的头像 发表于 11-27 10:42 862次阅读
    <b class='flag-5'>STM32</b>G4 <b class='flag-5'>UART+TIMER+DMA</b>应用<b class='flag-5'>示例</b>

    STM32U5系列TIMER+DMA+DAC应用演示

    有人使用STM32U575芯片的DAC功能。他希望使用TIMER事件触发DMA,并通过DMA传输内存数据到DAC输出寄存器,进而产生相应的D
    的头像 发表于 01-24 09:10 520次阅读
    <b class='flag-5'>STM32</b>U5系列<b class='flag-5'>TIMER+DMA</b>+DAC应用演示

    教你一手 基于STM32Cube库的Timer捕获应用

    STMCU官网更新了一则实战经验文件,重点介绍利用STM32CubeMx初始化配置工具和STM32Cube库如何通过TIMER的捕获功能完成对频率、
    发表于 06-25 15:05

    使用DMA(和更多)的UART传输示例代码

    你好,CuSoMeMe使用的是M9AF112K。他希望使用DMA传输UART。1)有没有使用DMAUART传输示例代码?二)是特列表或类似
    发表于 08-29 16:09

    stm32 uart1如何通过DMA方式发送和接收数据?

    stm32 uart1如何通过DMA方式发送和接收数据?
    发表于 12-08 07:05

    STM32U575 Nucleo UART_TwoBoards DMA示例不会从终端接收怎么办

    STM32U575 Nucleo UART_TwoBoards DMA 示例不会从终端接收,是何原因
    发表于 12-19 06:20

    AT32F4xx_使用DMA动态更新PWM占空比

    何使用AT32 的TMR 和DMA 动态更新PWM 占空比。该示例使用TMR4 的更新事件触发DMA1 搬运数据至TMR4 的通道2 数据寄存器(TMRx_C2DT),达到在TMR4
    发表于 01-09 20:21

    求助,是否有将DMAUART一起使用的示例

    我使用的是S32K3X4EVB-Q172开发板。我已经成功地实现了基于中断的 UART 接收但是我想使用 DMA 但我找不到任何例子。是否有将 DMAUART 一起使用的
    发表于 03-16 07:52

    如何使用AT32的TMR和DMA动态更新PWM占空比

    示例代码基于 AT32F403A,展示了如何使用 AT32 的 TMR 和 DMA 动态更新 PWM 占空比。该示例使用 TMR4 的更新事件触发
    发表于 10-27 06:28

    IO_SOFT_UART_USE_TIMER

    IO_SOFT_UART_USE_TIMER_cIO_SOFT_UART_USE_TIMER_cIO_SOFT_UART_USE_TIMER_c
    发表于 12-29 10:54 0次下载

    2021-06-05 GD32F405VG 调试过程关于DAC/DMA/TIMER等问题的解决

    ,比如STM32中的TIMER1的地址映射,对应的是GD32的TIMER0,STM32的DAC1对应GD32的DAC0,等等诸如此类。STM32
    发表于 12-03 09:06 12次下载
    2021-06-05 GD32F405VG 调试过程关于DAC/<b class='flag-5'>DMA</b>/<b class='flag-5'>TIMER</b>等问题的解决

    stm32F4的ADC+DMA+Timer,实现2MHz连续采样。1LSB分辨率,极低噪声。

    1. stm32F4的ADC+DMA+Timer的实现原理stm32F4的ADC参数
    发表于 12-20 19:48 56次下载
    <b class='flag-5'>stm32</b>F4的ADC+<b class='flag-5'>DMA+Timer</b>,实现2MHz连续采样。1LSB分辨率,极低噪声。

    stm32的串口DMA空闲中断接收不等长数据,stm32F1的usart1-DMA-IDLE收发

    stm32DMA收发原理,见另一篇:https://blog.csdn.net/Mark_md/article/details/107243054stm32F1的串口DMA
    发表于 12-28 19:35 6次下载
    <b class='flag-5'>stm32</b>的串口<b class='flag-5'>DMA</b>空闲中断接收不等长数据,<b class='flag-5'>stm32</b>F1的usart1-<b class='flag-5'>DMA</b>-IDLE收发

    STM32 UART配置中断DMA传输

    在处理UART数据的时候,DMA是一种非常灵活、高效的方式。
    的头像 发表于 07-24 14:32 1181次阅读
    <b class='flag-5'>STM32</b> <b class='flag-5'>UART</b>配置中断<b class='flag-5'>DMA</b>传输