STM32定时器单脉冲模式的一个应用示例

描述

有人选用STM32系列的一款低功耗芯片STM32L431进行产品开发,在其应用中需要通过STM32芯片驱动一个小尺寸显示屏,由于所选芯片不带FSMC外设,所以就想使用GPIO来进行图片数据的更新。显示屏控制器数据宽度选用16位,通过GPIOA与之连接,另外,同时还用到一根口线模拟下面的读写控制线,该控制线平常为高电平。

STM32

在读写控制线的下降沿进行数据的准备,即MCU将图形数据送到数据总线上,在读写控制线的上升沿显示屏的控制器将数据取走。

这里我们想到了借助定时器输出一路PWM信号来模拟那根读写时序控制线,利用定时器的输出比较事件触发DMA,将数据送到GPIOA端口,然后在上升沿由屏控制器读走数据。在DMA的传输完成中断里关闭定时器的PWM输出从而停止数据传输。

按照上面的思路来编程进行调试后发现个问题,那就是在DMA传输完成中断里去关闭定时器的PWM输出时,这个停止动作不能做到很及时,尤其在数据传输速率较高时,即这个PWM输出停止操作有个延时,往往会导致多输出几个不必要的PWM脉冲。

比方本来计划发送500个数据,读写控制线相应地也应该只输出500个PWM脉冲信号,然后维持在高电平,但程序代码是在完成了500个DMA数据传输后才去关闭定时器的PWM输出,由于中断响应的时间加上关闭定时器输出的代码执行时间可能会导致多输出1个或2个不等的PWM脉冲后才停下来【说“可能”是因为它跟传输速率和处理代码有关】,这些多输出的脉冲虽不会触发DMA传输了,但其上升沿还是会触发显示控制器的数据读取操作,而这多读取的数据并非正常操作,进而会影响产品功能。【下图所示红色脉冲即多出的PWM信号】

STM32

那有没有办法让定时器的PWM输出个数跟DMA传输的数据个数刚好一致呢?即若要传输500个数据也就刚好输出500个PWM脉冲。这里有个比较简单的办法,就是使用STM32高级定时器的重复计数器和定时器输的单脉冲输出模式来实现上述要求。

所谓单脉冲输出模式,其基本原理就是定时器的计数器开始工作后,当碰到定时器更新事件时则停止计数工作,从而实现有限个数脉冲的输出。对于不带重复计数器寄存器的通用定时器,若工作在PWM输出模式,计数器启动后输出一个PWM脉冲则停止;若是带重复计数器寄存器的高级定时器,工作在pwm输出模式时,计数器启动后则输出指定个数的PWM脉冲后停止计数,具体的PWM脉冲输出个数由RCR寄存器的值与所选择的计数模式【向上计数模式、向下计数模式、双向计数模式】决定。关于定时器单脉冲模式细节请查看STM32各个系列的参考手册,下面阅读推荐的《STM32定时器单脉冲输出模式话题》也可以参考。

结合到这里的应用,我们可以将方案稍做调整。使用高级定时器【这里使用TIM1】的一个输出通道来实现读写控制时序脉冲,计数器采用向上计数模式,定时器采用PWM1单脉冲输出模式,输出的脉冲个数跟DMA待传输的数据个数保持一致,仍然通过定时器比较事件触发数据的DMA传输。这样的话,定时器输出指定个数的PWM后即自行停止输出,不再需要软件代码的干预,而且最后将输出锁定在高电平,刚好满足设计要求。【注:使用定时器单脉冲输出模式,当定时器停止计数后,输出端最后锁定的电平跟所选用的PWM模式和RCR寄存器的值以及计数方式三者有关。】

比方要写入10个【数据弄小点便于示波器观察】图形数据到显示控制器。则配置RCR=10-1;采用PWM1单脉冲输出模式,向上计数方式。通过示波器我们可以看到如下输出:

STM32

这里比较巧妙地使用了高级定时器地单脉冲输出模式,做到了MCU写多少数据,屏控制器就读取多少个数据,不多不少。

顺便提醒一下,当完成定时器的初始化后,在使能定时器更新中断或基于更新事件的DMA之前,记得对更新中断事件标志位先做个清零操作,否则有时可能会给我们带来些困扰,比方一使能定时器中断就跳入中断服务程序或者刚使能基于更新事件的DMA传输就发生DMA传输。ST固件库中的参考代码如下:

__HAL_TIM_CLEAR_IT(&htimx,TIM_IT_UPDATE);

该话题之前也多次提醒过,这里再提醒下。还是经常有人在应用中卡到这个地方。其原因是定时器初始化过程中使用了软件更新操作触发更新事件让用户配置的数据即时生效,同时它也使得定时器更新事件标志被置位了。

STM32

OK,上面主要是分享了一个基于高级定时器单脉冲输出模式的一个应用示例及思路。如果是通用定时器,它没有RCR寄存器,是否还可以实现上述功能呢?应该也是可以的,有兴趣可以自行思考下。祝愿大家在STM32的产品开发过程中能对各个外设的功能及特性灵活运用,不断开发出自己满意的产品。

最后,让我们祈祷眼前的新型肺炎疫情早点过去!愿一切尽早回归正常!

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分