硬汉嵌入式论坛

 找回密码
 立即注册
查看: 75|回复: 2
收起左侧

[STM32CubeF4] STM32F407模拟输出SENT协议

[复制链接]

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 前天 16:25 | 显示全部楼层 |阅读模式
最近负责的项目需要使用STM32F407芯片模拟输出SENT协议信号,在CSDN上面看到有大佬使用STM32定时器的BURST模式实现,具体使用的函数是HAL_TIM_DMABurst_MultiWriteStart()。



目前我的PWM周期为3μs,占空比50%。为了验证功能,我使用HAL_TIM_DMABurst_WriteStart()函数去改变我原始输出的波形,但是始终无法得到想要的波形,我也不知道问题出在哪里,请贴吧大佬帮忙分析一下。

1.cubemx配置
(1)PWM引脚配置:
使用PE9作为PWM波形的输出引脚,配置为TIM1_CH1

PWM定时器选择

PWM定时器选择

(2)PWM相关参数配置:

PWM相关参数配置

PWM相关参数配置

(3)定时器DMA配置:
论坛3.png
论坛4.png

2.程序代码
论坛5.png

3.目前遇到的问题
(1)现在我想用示波器捕获到SENT协议一帧信号里面的同步信号,但始终没有捕获到;
论坛6.png

(2)对hal库函数HAL_TIM_DMABurst_WriteStart()的疑问
我参考了论坛里面STM32H7的PWM + DMA突发模式实现定时器寄存器的批量更新 - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz!这个帖子,对帖子中的"const uint32_t aSRC_Buffer[3]"数组有些疑问。

const uint32_t aSRC_Buffer[3]的第一个元素表示ARR值,请问这个元素和初始化PWM参数配置中的ARR值有没有关系?


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116739
QQ
发表于 昨天 09:12 | 显示全部楼层
1、aSRC_Buffer[3]的三个数值就是动态更新ARR,RCR和CCR1寄存器值的,你可以根据需要添加更多值来实现动态的效果。
2、除了这个方法,还有一个好用的方式,TIM UP事件可以触发DMA传输,触发一次,DMA传输一个值,你可以方便的在DMA缓冲设置高低电平,然后传输给指定引脚控件,传输给GPIO的BSRR寄存器即可
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 昨天 10:47 | 显示全部楼层
eric2013 发表于 2025-7-3 09:12
1、aSRC_Buffer[3]的三个数值就是动态更新ARR,RCR和CCR1寄存器值的,你可以根据需要添加更多值来实现动态 ...

好的,硬汉哥,我去论坛里面找找第二种方式的例子
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-7-4 11:06 , Processed in 0.241590 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表