• 484查看
  • 0回复

[芯片硬件] STM32G4 UART+TIMER+DMA应用示例

[复制链接]


该用户从未签到

发表于 5-5-2024 20:15:15 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师




这里使用STM32G4系列Nucleo开发板演示如下需求的实现过程。

TIMER2使用3个通道的PWM输出,占空比可能被不时修改。修改的数据通过UART传输过来,UART接收的数据通过DMA传输到内存。新的数据接收后,基于TIMER更新事件触发DMA,利用TIMER的更新事件触发DMA Burst 而一次性用新数据修改3个通道的CCR值以调整PWM输出。每次新数据的接收允许以产生按键动作为准,即每次按键动作允许一次数据更新。

STM32G4 UART+TIMER+DMA应用示例w2.jpg

这里有两点要注意,TIM2是32位定时器,3个CCR数据使用32位格式。另外,3个数据的修改基于更新事件一次性修改,不能出现混乱,即不可以某一个时刻3个CCR寄存器的数据不是来自同一批的。为了避免数据混乱这种情况,我这里平常禁止TIMER2的更新事件的产生,只有每次收到新数据后才临时允许更新事件的产生,并在TIMER触发的DMA完成中断里再次禁止更新事件的产生。

使用LPUART从外部接收新数据,选用LPUART主要原因是它的TX/RX刚好跟G4Nucleo开发板的虚拟串口接在一起的,并无其它特别原因。至于按键就选用板载按键PC13,并开启了对应的外部中断。

大致的数据传输流程如下图所示:

STM32G4 UART+TIMER+DMA应用示例w3.jpg

关于定时器更新事件的能否产生的控制由TIMER的控制寄存器里的UDIS位决定:

STM32G4 UART+TIMER+DMA应用示例w4.jpg

我在代码里对该位的操作,写成宏的方式,便于阅读。

STM32G4 UART+TIMER+DMA应用示例w5.jpg

该位默认为0。若该位被软件置1,定时器的更新事件将不能产生,意味着开启预装功能时,影子寄存器内容不能被更新,同时也不能因溢出操作、计数器复位操作而触发相应中断或DMA请求 。

测试代码的里几个主要的基本操作:

一、响应按键事件,启动UART的DMA接收。

HAL_UART_Receive_DMA(&hlpuart1,(uint8_t*)CCR_rx, 12);

二、基于UART事件的DMA接收完成中断,允许TIMER更新事件的产生,并启动基于TIMER更新事件的DMA Burst 传输。

Permit_UpdateEvt;  //Updated event  permitted

HAL_TIM_DMABurst_MultiWriteStart(&htim2,TIM_DMABASE_CCR1,TIM_DMA_UPDATE,(uint32_t*)CCR_rx,TIM_DMABURSTLENGTH_3TRANSFERS,3);

三、基于TIMER事件的DMA完成中断,禁止更新事件的产生,并基于串口通信提示可以接受下次数据更新。

__HAL_TIM_CLEAR_FLAG(&htim2,TIM_FLAG_UPDATE);

Forbid_UpdateEvt;//update event forbidden

Indicating_CCR_Updated();

再看看基本的CubeMx配置,配置比较简单。下面是LPUART的配置贴图。

STM32G4 UART+TIMER+DMA应用示例w6.jpg

STM32G4 UART+TIMER+DMA应用示例w7.jpg

我开启LPUART 的DMA接收,其发送功能使用查询阻塞模式,主要用来输出一些提示信息。

下面是TIM2的一些基本配置截图。开启3个通道的PWM输出和基于TIMER更新事件的DMA传输。

STM32G4 UART+TIMER+DMA应用示例w8.jpg

STM32G4 UART+TIMER+DMA应用示例w9.jpg

最后,我们来简单验证下。下面截图就是通过串口助手键入新数据后TIMER的输出结果。

STM32G4 UART+TIMER+DMA应用示例w10.jpg

整体上,操作流程就是每次按键操作提示可以修改占空比了;串口终端键入新的3个字的数据,基于UART接收事件的DMA传输完成后提示数据收到;基于TIMER事件的DMA完成完成后提示数据更新结束,提示等待下次按键动作。

好,今天的分享就到这里,下次再聊。如果有人想要完整的测试工程代码的话,可以私下留言,只要时间不是过去太久且我这边有保存的话,都可以分享供参考。




该用户从未签到

发表于 11-3-2025 19:58:00 | 显示全部楼层
关于STM32G4 UART+TIMER+DMA的应用示例,这里为您提供一个简要的专业回复:

使用STM32G4系列Nucleo开发板,实现UART接收数据并通过DMA传输到内存,数据用于动态调整TIMER2的PWM输出。TIM2作为32位定时器,其三个CCR数据采用32位。当通过UART接收到新数据时,使用DMA Burst传输模式一次性更新三个通道的CCR值,从而调整PWM占空比。每次数据更新以按键动作为触发条件。此过程充分利用了DMA的高效数据传输和TIMER的精准定时能力,确保了PWM输出的实时性和准确性。在实现过程中,需要注意配置正确的定时器参数、DMA传输设置以及中断处理逻辑。

以上是一个基于您描述需求的专业回复,供您参考。如需更详细的信息或代码示例,请进一步询问。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 11-3-2025 19:58:00 | 显示全部楼层
以下是对STM32G4 UART+TIMER+DMA应用示例的回复:

基于STM32G4系列Nucleo开发板,实现您所描述的功能,流程如下:

1. 配置TIMER2为3个通道的PWM输出。
2. 使用UART接收数据,并通过DMA将数据传输到内存。
3. 当接收到新数据时,基于TIMER的更新事件触发DMA Burst传输。
4. 利用新的数据一次性更新3个通道的CCR值,调整PWM输出。

注意事项:

1. TIM2为32位定时器,确保配置与硬件兼容。
2. 当修改CCR数据时,考虑到数据为32位,需确保数据传输的准确性和完整性。

在实现过程中,务必详细阅读STM32G4系列相关文档,确保代码的稳定性和可靠性。此功能涉及到多个模块的组合使用,建议逐步调试,确保每个环节的正确性。

以上回复供参考,如需了解更多细节,请继续交流。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报

快速发帖

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

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 19-8-2025 02:25 , Processed in 0.330836 second(s), 36 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.