你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

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

0 I( T. X8 }. ~+ q$ g
11.jpg

  u& C  I( b: T! D/ V
在读写控制线的下降沿进行数据的准备,即MCU将图形数据送到数据总线上,在读写控制线的上升沿显示屏的控制器将数据取走。
这里我们想到了借助定时器输出一路PWM信号来模拟那根读写时序控制线,利用定时器的输出比较事件触发DMA,将数据送到GPIOA端口,然后在上升沿由屏控制器读走数据。在DMA的传输完成中断里关闭定时器的PWM输出从而停止数据传输。
0 E: r0 C$ U/ F3 W2 X  [
按照上面的思路来编程进行调试后发现个问题,那就是在DMA传输完成中断里去关闭定时器的PWM输出时,这个停止动作不能做到很及时,尤其在数据传输速率较高时,即这个PWM输出停止操作有个延时,往往会导致多输出几个不必要的PWM脉冲。

* w. S1 K, y5 e; u
比方本来计划发送500个数据,读写控制线相应地也应该只输出500个PWM脉冲信号,然后维持在高电平,但程序代码是在完成了500个DMA数据传输后才去关闭定时器的PWM输出,由于中断响应的时间加上关闭定时器输出的代码执行时间可能会导致多输出1个或2个不等的PWM脉冲后才停下来【说“可能”是因为它跟传输速率和处理代码有关】,这些多输出的脉冲虽不会触发DMA传输了,但其上升沿还是会触发显示控制器的数据读取操作,而这多读取的数据并非正常操作,进而会影响产品功能。【下图所示红色脉冲即多出的PWM信号】
: k% v2 U1 g! m& y
22.jpg
. l! Y- O2 P9 h& n  H1 S
那有没有办法让定时器的PWM输出个数跟DMA传输的数据个数刚好一致呢?即若要传输500个数据也就刚好输出500个PWM脉冲。这里有个比较简单的办法,就是使用STM32高级定时器的重复计数器和定时器输的单脉冲输出模式来实现上述要求。

3 _. ?# s  H( s# b
所谓单脉冲输出模式,其基本原理就是定时器的计数器开始工作后,当碰到定时器更新事件时则停止计数工作,从而实现有限个数脉冲的输出。对于不带重复计数器寄存器的通用定时器,若工作在PWM输出模式,计数器启动后输出一个PWM脉冲则停止;若是带重复计数器寄存器的高级定时器,工作在pwm输出模式时,计数器启动后则输出指定个数的PWM脉冲后停止计数,具体的PWM脉冲输出个数由RCR寄存器的值与所选择的计数模式【向上计数模式、向下计数模式、双向计数模式】决定。关于定时器单脉冲模式细节请查看STM32各个系列的参考手册,下面阅读推荐的《STM32定时器单脉冲输出模式话题》也可以参考。
; j4 C& x6 F& u- \* i0 C
结合到这里的应用,我们可以将方案稍做调整。使用高级定时器【这里使用TIM1】的一个输出通道来实现读写控制时序脉冲,计数器采用向上计数模式,定时器采用PWM1单脉冲输出模式,输出的脉冲个数跟DMA待传输的数据个数保持一致,仍然通过定时器比较事件触发数据的DMA传输。这样的话,定时器输出指定个数的PWM后即自行停止输出,不再需要软件代码的干预,而且最后将输出锁定在高电平,刚好满足设计要求。【注:使用定时器单脉冲输出模式,当定时器停止计数后,输出端最后锁定的电平跟所选用的PWM模式和RCR寄存器的值以及计数方式三者有关。】
8 ~4 |, _9 ]! d3 w
比方要写入10个【数据弄小点便于示波器观察】图形数据到显示控制器。则配置RCR=10-1;采用PWM1单脉冲输出模式,向上计数方式。通过示波器我们可以看到如下输出:

5 p0 l1 f8 g% {- S; \8 ?" M
33.jpg

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

/ g2 F% `4 q7 y. x3 U/ o1 Y/ |
顺便提醒一下,当完成定时器的初始化后,在使能定时器更新中断或基于更新事件的DMA之前,记得对更新中断事件标志位先做个清零操作,否则有时可能会给我们带来些困扰,比方一使能定时器中断就跳入中断服务程序或者刚使能基于更新事件的DMA传输就发生DMA传输。ST固件库中的参考代码如下:
0 O& D$ V7 s4 Q7 ^+ h  }' x9 n3 L0 b
__HAL_TIM_CLEAR_IT(&htimx,TIM_IT_UPDATE);

0 J- ~) H. e$ Q6 R0 P5 J. N; x, I: f; z
该话题之前也多次提醒过,这里再提醒下。还是经常有人在应用中卡到这个地方。其原因是定时器初始化过程中使用了软件更新操作触发更新事件让用户配置的数据即时生效,同时它也使得定时器更新事件标志被置位了。
$ q! A& o: \" y/ N7 G8 `) K3 t
44.jpg

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

& B7 W3 a% u* I3 r+ W
最后,让我们祈祷眼前的新型肺炎疫情早点过去!愿一切尽早回归正常!
7 j0 t! l0 T& f/ Z$ o
' t! A! x. Q5 t
收藏 1 评论5 发布时间:2020-2-18 14:05

举报

5个回答
mmuuss586 回答时间:2020-2-18 14:24:39
Kevin_G 回答时间:2020-2-19 10:47:05
收藏
byronsong 回答时间:2020-2-20 09:42:18
感谢分享!
lrzxc 回答时间:2020-2-20 13:14:50
谢谢分享,单脉冲模式
xmshao 回答时间:2020-3-2 16:34:53
谢谢转载分享!
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版