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

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

3天内不再提示

应用笔记 | STM32使用DMA产生PWM时波形异常分析

STM32单片机 来源:未知 2023-09-22 17:05 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

29761040-5926-11ee-939d-92fbcf53809c.gif

关键字:回调函数,HAL库

目录预览

1.前言

2.实验

3.使用实例

4.小结

01 前言

有客户反馈,使用STM32F4的TIM2结合DMA,产生的PWM波形不符合预期,但是相同的配置使用在TIM3上,得到的PWM波形就是符合预期的。其代码和配置都是从F1移植过来的,在F1上使用TIM2是没有问题的,对于F4的TIM2发生的问题,客户一直没有找到根本原因。

02

实验

根据客户的反馈,我们进行了实验。

硬件:STM32F401RE-NUCLEO

在STM32CubeMX中,将TIM2和TIM3所有参数均做相同的配置,其中配置DMA两端均为halfword长度。

2981025c-5926-11ee-939d-92fbcf53809c.png

29a89e48-5926-11ee-939d-92fbcf53809c.png

生成代码,并定义两个数组如下图所示:

29c57252-5926-11ee-939d-92fbcf53809c.png

在主函数中开启Timer。

29e214a2-5926-11ee-939d-92fbcf53809c.png

我们可以发现,实验结果如客户反馈的,TIM2输出的PWM是不正确的,TIM3输出的PWM是正确的。

2a022026-5926-11ee-939d-92fbcf53809c.png

03 分析

我们的实验中,TIM2和TIM3的配置是完全一样的,即使传输相同的数据,得到的PWM波形也是不同的。为此我们比较了TIM2和TIM3的硬件属性,可以很容易查看出,TIM2的计数器是32bit的,而TIM3的计数器是16bit的。

我想我们已经知道答案了,TIM2的计数器是32bit的,但是我们配置的DMA是halfword长度,这在AHB总线上解析数据时产生了非预期的结果。在调试界面我们也能看到,当问题发生时,TIM2的CCR1竟然比ARR的值要大,或者出现异常值,所以出现异常波形。

2a1fdee0-5926-11ee-939d-92fbcf53809c.png

根本原因在于,对于大部分STM32系列,主设备基于AHB外设进行寻址是不支持byte/half-word传输的,总线会强制将数据转化为32bit传送到总线上,这就是为什么我们看到CCR1的高半字和低半字的值是相同的原因。

当我们将TIM2的DMA外设端修改为word长度,并将内存数组定义为32bit,再次实验,可以发现PWM的波形就是正常的了:

2a36b39a-5926-11ee-939d-92fbcf53809c.png

2a666b44-5926-11ee-939d-92fbcf53809c.png

2a79522c-5926-11ee-939d-92fbcf53809c.png

04 小结

因为F103上没有32bit计数器的Timer,所以客户在F103上并没有出现类似的问题。在使用DMA访问经过AHB转APB的桥接外设时,我们要注意DMA对外设的访问宽度配置问题。

完整内容请点击“阅读原文”下载原文档。


原文标题:应用笔记 | STM32使用DMA产生PWM时波形异常分析

文章出处:【微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。


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

    关注

    6078

    文章

    45581

    浏览量

    673739
  • PWM
    PWM
    +关注

    关注

    116

    文章

    5894

    浏览量

    226603
  • STM32
    +关注

    关注

    2313

    文章

    11195

    浏览量

    374671

原文标题:应用笔记 | STM32使用DMA产生PWM时波形异常分析

文章出处:【微信号:STM32_STM8_MCU,微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    LAT1185+一个地址未对齐引起的 HardFault 异常用笔记

    客户在使用 STM32G070 的时候,KEIL MDK 为编译工具,当编译优化选项设置为Level0 的时候,程序会出现 Hard Fault 异常,而当编译优化选项设置为 Level1 的时候
    发表于 01-11 17:28 0次下载

    LAT1189+Timer 结合 DMA 2D 通道实现不同波形输出应用笔记

    TIM 来定时切换输出正弦波或固定电平。使用 TIM 输出 PWM 产生正弦波形时,需要结合 GPDMA 来实现。在 STM32U5 系列中,GPDMA 共有 16 个独立通道,其中
    发表于 01-11 17:25 0次下载

    LAT1202+TIM DMA burst 输出变频 PWM 波形用笔记

    客户需要 MCU 输出一组变频的 PWM 波形来控制外围器件,并且不同频率脉冲的个数也不同。STM32U5 芯片拥有 TIM1/TIM8 高级定时器,还有通用定时器TIM2/TIM3/TIM4
    发表于 01-11 17:22 0次下载

    STM32G474 HRTIME PWM 丢波问题分析与解决

    STM32G474 中包含了针对数字电源应用的高精度定时器(HRTIMER),客户在应用该定时器产生 PWM 时,发现 PWM 的输出出现了“丢波”现象,本文对该问题进行
    发表于 01-04 13:47 0次下载

    哪些场景适合使用DMA

    : 模数转换器(ADC)采集数据: 当ADC连续采样时,通常会产生大量数据。使用DMA可以将ADC转换结果直接传输到内存中的数组,而不需要CPU每次读取ADC数据寄存器。这样可以避免CPU被频繁
    发表于 11-12 07:13

    SPI主机/从机接收发送都开启DMA通信

    和发送;SPI 作为从机时,接收和发送同时开启 DMA 进行数据接收和发送。 注:本应用笔记对应的代码是基于雅特力提供的V2.x.x 板级支持包(BSP)而开发,对于其他版本BSP,需要注意使用上
    发表于 09-10 16:56

    什么是“电压暂降”?CET中电技术供配电异常信息捕捉及故障诊断分析装置

    为解决这一难点,CET中电技术研发的供配电异常信息捕捉及故障诊断分析装置,具有2MHz/s高速瞬态捕捉和波形记录功能,可捕捉0.5us±4kV快速电压瞬态并记录波形,这意味着产品能在0
    的头像 发表于 08-28 14:49 1044次阅读
    什么是“电压暂降”?CET中电技术供配电<b class='flag-5'>异常</b>信息捕捉及故障诊断<b class='flag-5'>分析</b>装置

    STM32多通道FFT运算异常的原因?怎么解决?

    问题报告:STM32多通道FFT运算异常 报告人:XXX日期:2025年X月X日硬件平台:STM32F407VGT6开发环境:STM32CubeMX + KeilCMSIS-DSP库版
    发表于 06-19 06:27

    六步方波驱动波形异常的原因?

    能够转起来,但是波形却很不正常。波形是某一个状态时,某一根相线对地的电压波形(黄色线)。青色线是此状态是,其他半桥的下桥臂MOS的G极波形。 与标准的方波驱动
    发表于 06-17 07:58

    定时器使用DMA突发传输功能时,传入指针从常量数组改为变量数组后,传输功能异常的原因?

    用的是STM32H743开发板。 代码如下: static const uint32_t s_tim_dma[] = {1600, 0x00000000, 500}; //定义为const
    发表于 06-17 06:29

    定时器使用DMA突发传输功能时,传入指针从常量数组改为变量数组后,传输功能异常的原因?

    用的是STM32H743开发板。 代码如下: static const uint32_t s_tim_dma[] = {1600, 0x00000000, 500}; //定义为const
    发表于 06-16 07:17

    定时器使用DMA突发传输功能时,传入指针从常量数组改为变量数组后,传输功能异常的原因?

    用的是STM32H743开发板。 代码如下: static const uint32_t s_tim_dma[] = {1600, 0x00000000, 500}; //定义为const
    发表于 06-12 07:10

    STM32H743定时器使用DMA突发传输功能时,传入指针从常量数组改为变量数组后,传输功能异常,为什么?

    用的是STM32H743开发板。 代码如下: static const uint32_t s_tim_dma[] = {1600, 0x00000000, 500}; //定义为const
    发表于 06-10 06:57

    GPDV6624C应用笔记1.0版

    电子发烧友网站提供《GPDV6624C应用笔记1.0版.pdf》资料免费下载
    发表于 06-06 17:20 0次下载

    FX3图传过程中异常停止的原因?

    还可以正常读写数据,只有Thread0出现了异常。 4. 日志文件 您可以在附加的日志文件中找到 Bus Hound 软件捕获的异常数据。 您能帮忙分析一下为什么Thread0的
    发表于 05-19 08:00