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这几个寄存器的地址总是依次顺序摆放的,了解这点对阅读上面个别函数调用有帮助。

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

    关注

    31

    文章

    5308

    浏览量

    119978
  • STM32
    +关注

    关注

    2265

    文章

    10870

    浏览量

    354694
  • uart
    +关注

    关注

    22

    文章

    1227

    浏览量

    101161

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    STM32G4 UART+TIMER+DMA应用示例

    这里使用STM32G4系列Nucleo开发板演示如下需求的实现过程。
    的头像 发表于 11-27 10:42 2056次阅读
    <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 1617次阅读
    <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

    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次下载

    UART需要使用DMA发送吗 ?

    UART需要使用DMA发送吗?
    的头像 发表于 03-07 16:57 7079次阅读

    STM32---UART使用DMA数据传输

    当预先不知道要接收的数据时,如何使用 DMAUART 上读取数据的信息。在STM32中,通常有以下几种模式:轮询模式程序必须轮询状态位以检查是否已收到新字符并以足够快的速度读取它以获得所有字节
    发表于 12-03 10:06 8次下载
    <b class='flag-5'>STM32---UART</b>使用<b class='flag-5'>DMA</b>数据传输

    STM32CubeMX_UART_printf_接收中断_DMA空闲中断_LPUART

    文章目录前言STM32CubeMX新建F767工程UART配置生成代码串口发送printf支持串口接收中断DMA空闲中断工程代码微信公众号前言STM32CubeMX_环境搭建_GPIO
    发表于 12-06 18:36 6次下载
    <b class='flag-5'>STM32CubeMX_UART</b>_printf_接收中断_<b class='flag-5'>DMA</b>空闲中断_LPUART

    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 TIMER占空比的方案

    现在有人有这样一个需求,他使用STM32F429芯片做开发,其中用到32位的TIM2实现3路PWM输出。
    的头像 发表于 09-30 09:23 1073次阅读

    STM32 UART配置中断DMA传输

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