STM32G4 UART+TIMER+DMA应用示例

这里使用stm32g4系列nucleo开发板演示如下需求的实现过程。
timer2使用3个通道的pwm输出,占空比可能被不时修改。修改的数据通过uart传输过来,uart接收的数据通过dma传输到内存。新的数据接收后,基于timer更新事件触发dma,利用timer的更新事件触发dma burst 而一次性用新数据修改3个通道的ccr值以调整pwm输出。每次新数据的接收允许以产生按键动作为准,即每次按键动作允许一次数据更新。
这里有两点要注意,tim2是32位定时器,3个ccr数据使用32位格式。另外,3个数据的修改基于更新事件一次性修改,不能出现混乱,即不可以某一个时刻3个ccr寄存器的数据不是来自同一批的。为了避免数据混乱这种情况,我这里平常禁止timer2的更新事件的产生,只有每次收到新数据后才临时允许更新事件的产生,并在timer触发的dma完成中断里再次禁止更新事件的产生。
使用lpuart从外部接收新数据,选用lpuart主要原因是它的tx/rx刚好跟g4nucleo开发板的虚拟串口接在一起的,并无其它特别原因。至于按键就选用板载按键pc13,并开启了对应的外部中断。
大致的数据传输流程如下图所示:
关于定时器更新事件的能否产生的控制由timer的控制寄存器里的udis位决定:
我在代码里对该位的操作,写成宏的方式,便于阅读。
该位默认为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的配置贴图。
我开启lpuart 的dma接收,其发送功能使用查询阻塞模式,主要用来输出一些提示信息。
下面是tim2的一些基本配置截图。开启3个通道的pwm输出和基于timer更新事件的dma传输。
最后,我们来简单验证下。下面截图就是通过串口助手键入新数据后timer的输出结果。
整体上,操作流程就是每次按键操作提示可以修改占空比了;串口终端键入新的3个字的数据,基于uart接收事件的dma传输完成后提示数据收到;基于timer事件的dma完成完成后提示数据更新结束,提示等待下次按键动作。
好,今天的分享就到这里,下次再聊。如果有人想要完整的测试工程代码的话,可以私下留言,只要时间不是过去太久且我这边有保存的话,都可以分享供参考。


关于USB,你想知道的都在这里
LM2576制作的12V直流稳压电源电路
如何实现飞跃至48V电气架构
双喜临门!利尔达入选浙江省电子信息产业百家重点企业和“专精特新”中小企业!
发改委约谈三星 存储产品的垄断局面或将改变
STM32G4 UART+TIMER+DMA应用示例
特克股份LM1117系列芯片顺利量产
三星旗下最贵手机W2019即将发布 双摄+屏幕指纹值得期待
UWB定位技术的应用是怎样的
除了照明,LED还有怎样的功能?
群创光电与CLT合作,将玻璃切割技术用于车用触控面板上
realme首款真无线耳机佩戴图晒出,将于12月17日在印度发布
低噪声放大器校准原理_低噪声放大器特点和应用
血流检测仪的工作原理及适用范围
2018世界物联网博览会在无锡开幕
基于深度学习的无信标自动追踪工具
应用系统应该使用哪种物联网协议
IDC预测:2020年智能手表将占据可穿戴设备市场的一半
基于生物识别的身份验证解决方案
美国银行官员表示加密货币正阻碍当局抓捕犯罪分子