OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7274|回复: 15

stm32定时器的输出比较功能如何理解

[复制链接]

42

主题

141

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
342
金钱
342
注册时间
2015-5-26
在线时间
49 小时
发表于 2016-6-4 22:53:56 | 显示全部楼层 |阅读模式
1金钱
STM32定时器之输出比较功能:按照PDF的描述,输出比较是当计数器的值与比较寄存器的值匹配时,产生事件。其实我不太明白,这个模块有什么用,要实现这样的功能,使用定时器,在定时器中断里面计数,外加一个if语句就能实现所谓的"将计数值与比较值进行匹配"。而输出比较功能,匹配事件发生的时候,可以触发中断,同样的,我编程也可以实现啊,我把中断程序放在if语句里面不就可以了嘛。
就是说,定时器中断进行计数,用if语句判断计数匹配到达没有,并且在if语句里面写程序(这个程序就是输出比较事件发生时,进入中断里面的中断程序)。

按照这样的思想也能实现pdf中描述的功能啊,那为什么st要多弄一个所谓的输出比较呢?请版主和各位朋友解答一下,谢谢

最佳答案

查看完整内容[请看2#楼]

一个是硬件实现 一个是软件实现 这两者有本质的差别 软件的实现是需要占用CPU时间的 但硬件就不占用了 还有响应速度面 都有差别的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
发表于 2016-6-4 22:53:57 | 显示全部楼层
一个是硬件实现   一个是软件实现   这两者有本质的差别     软件的实现是需要占用CPU时间的    但硬件就不占用了       还有响应速度面    都有差别的   
回复

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2016-6-5 13:32:23 | 显示全部楼层
如果需要输出频率很高的PWM,那是不是得频繁中断,来翻转IO口电平?
博观而约取,厚积而薄发。
回复

使用道具 举报

42

主题

141

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
342
金钱
342
注册时间
2015-5-26
在线时间
49 小时
 楼主| 发表于 2016-6-5 15:35:09 | 显示全部楼层
745021926 发表于 2016-6-5 13:32
如果需要输出频率很高的PWM,那是不是得频繁中断,来翻转IO口电平?

       谢谢您,我后来查阅了一些资料,当我们要用到PWM输出的时候,这个输出比较就是用来产生PWM波的,也就是应用这个外设功能去实现的。我明白您说为什么说频率很高的pwm就要频繁中断去翻转了。使用这个输出比较功能就可以从硬件上去实现从而节约cpu时间,提高效率。
       有点像28335里面的epwm模块,PBRD和COMPA、COMPB做比较,发生匹配时,产生事件。而在32里面,PBRD就是这里ARR的值,就是说我们计数器计数的峰值,而CMP在32这里就是TIM_CCR捕获比较寄存器里面的值,就是通过这两个值不同,从而比较事件发生的时间不同,控制频率跟占空比的。跟28335一样可以工作在up、down、up&dowmm模式。
       使用捕获功能的时候,会将CNT的值放到TIM_CCR寄存器里面,供我们读出,统计脉冲的宽度,但如果单纯捕获外部电平变化,只需要利用捕获中断进行处理,而不必理会此时保存在CCR寄存器的值。
————————————————————————————
请您评价一下这样说对不对呢?
回复

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2016-6-5 19:05:44 | 显示全部楼层
对的
回复

使用道具 举报

42

主题

141

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
342
金钱
342
注册时间
2015-5-26
在线时间
49 小时
 楼主| 发表于 2016-6-5 19:23:22 | 显示全部楼层

太好了。并且我还有一个小的疑惑,stm32的IO口有很多都是复用的,而且是好几个功能复用一个引脚。我参考了一些资料,其实是不是这样子,先将GPIO口,配置成复用(输入或者输出),然后对应的将某外设使能,比如说103rct6的PA口,同一个口可以复用为ADC,也可以是TIM,那么闲将GPIO使能为复用,然后使能ADC模块,那就默认为将ADC口配置到PA口上了,此时就不能使能PAx口别的复用外设了。在DSP里就是这样子的,我不太清楚32里面是否也如此。
————————————————————
假如说真是这样的话,就有一定的局限了,某些外设的使用会占用别的外设的IO,就不能同时使用了(如果不进行端口重映射的话)
回复

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2016-6-5 20:55:11 | 显示全部楼层
林春霞 发表于 2016-6-5 19:23
太好了。并且我还有一个小的疑惑,stm32的IO口有很多都是复用的,而且是好几个功能复用一个引脚。我参考 ...

可以重映射,或者分时复用。
博观而约取,厚积而薄发。
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-6-5 21:55:45 | 显示全部楼层
林春霞 发表于 2016-6-5 19:23
太好了。并且我还有一个小的疑惑,stm32的IO口有很多都是复用的,而且是好几个功能复用一个引脚。我参考 ...

蛋疼的并不止于此,

STM32F1系列的芯片引脚好多复用功能是黏在一块的,
比如定时器4,你如果想把通道1从PB6迁移到PD12,那么通道234也必须得跟着走。。。


好在STM32F4系列的芯片GPIO模块彻底更新了,改成引脚复用矩阵,稍微方便一些。。。
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

42

主题

141

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
342
金钱
342
注册时间
2015-5-26
在线时间
49 小时
 楼主| 发表于 2016-6-5 22:38:24 | 显示全部楼层
xkwy 发表于 2016-6-5 21:55
蛋疼的并不止于此,

STM32F1系列的芯片引脚好多复用功能是黏在一块的,

哎,虽然我现在没遇到这样的情况,但我就在想,如果我同时需要用到两个外设,而这两个外设对应的都是同一个IO口,好像PA就有TIM跟ADC复用的,某一时刻就只能用一个咯。如果不分时的话,32的外设是不会达到很高的利用率的,会相互矛盾。你觉得呢?
回复

使用道具 举报

42

主题

141

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
342
金钱
342
注册时间
2015-5-26
在线时间
49 小时
 楼主| 发表于 2016-6-5 23:01:08 | 显示全部楼层
jiaozhu 发表于 2016-6-5 22:20
一个是硬件实现   一个是软件实现   这两者有本质的差别     软件的实现是需要占用CPU时间的    但硬件就不 ...

谢谢你
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-6-6 12:26:12 | 显示全部楼层
林春霞 发表于 2016-6-5 22:38
哎,虽然我现在没遇到这样的情况,但我就在想,如果我同时需要用到两个外设,而这两个外设对应的都是同一 ...

是这样的,所以新版的STM32系列(如F4,F0等),GPIO采用了复用矩阵,合理配置矩阵,就能让所有模块、引脚都高效利用(当初我画板子时,楞是对着矩阵图看了好多天,才得出最佳的配置)
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

42

主题

141

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
342
金钱
342
注册时间
2015-5-26
在线时间
49 小时
 楼主| 发表于 2016-6-6 13:18:19 | 显示全部楼层
xkwy 发表于 2016-6-6 12:26
是这样的,所以新版的STM32系列(如F4,F0等),GPIO采用了复用矩阵,合理配置矩阵,就能让所有模块、引 ...

好的,非常感谢,祝生活工作愉快!
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-6-6 14:07:50 | 显示全部楼层
jiaozhu 发表于 2016-6-5 22:20
一个是硬件实现   一个是软件实现   这两者有本质的差别     软件的实现是需要占用CPU时间的    但硬件就不 ...

还是这个解释简洁清楚
回复

使用道具 举报

42

主题

141

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
342
金钱
342
注册时间
2015-5-26
在线时间
49 小时
 楼主| 发表于 2016-6-6 16:43:06 | 显示全部楼层
xkwy 发表于 2016-6-6 12:26
是这样的,所以新版的STM32系列(如F4,F0等),GPIO采用了复用矩阵,合理配置矩阵,就能让所有模块、引 ...

xkwy前辈,无意在另外一个帖子下看到您的回复。刚好我也遇到了类似的问题。就是这个定时器一打开就先进入一次中断。究竟这个原因是怎么造成的?我觉得是因为打开定时器的时候,stm32会将0放入定时器的计数单元CNT,而CNT当等于0或者等于ARR的时候,是会产生更新事件的,这个更新事件就会触发中断。定时器刚工作的时候,将0放入CNT进行向上计数的同时,CNT=0也触发了中断。是不是这样子的呢?
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-6-6 20:30:24 | 显示全部楼层
林春霞 发表于 2016-6-6 16:43
xkwy前辈,无意在另外一个帖子下看到您的回复。刚好我也遇到了类似的问题。就是这个定时器一打开就先进入 ...

不清楚,STM32的好多模块中断在打开的一瞬间都会立即进入一次,比如串口

我之前的回帖中有解决办法,就是寄存器配置的先后问题
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

10

主题

147

帖子

0

精华

高级会员

Rank: 4

积分
602
金钱
602
注册时间
2015-7-11
在线时间
94 小时
发表于 2016-12-3 17:15:27 | 显示全部楼层
学习了谢谢!!!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-21 02:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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