OpenEdv-开源电子网

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

STM32通用定时器输出比较模式完全解读

[复制链接]

98

主题

253

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2011-12-16
在线时间
57 小时
发表于 2011-12-21 22:21:32 | 显示全部楼层 |阅读模式
精简了官方的例程,注释非常详细!分享一下,谢谢支持!O(∩_∩)O~见附件
http://wenku.baidu.com/view/28921f04b52acfc789ebc95f.html

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-12-22 00:14:24 | 显示全部楼层
回复 支持 反对

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
发表于 2012-1-5 12:22:00 | 显示全部楼层
回复【楼主位】kexuexyz:
精简了官方的例程,注释非常详细!分享一下,谢谢支持!O(∩_∩)O~见附件
---------------------------------
科学男孩,关于你的输出比较模式完全理解有点疑问请教。
(1)比较寄存器的值+60000,变化规律是60000-->0-->60000.....但是计数器变化规律是0-->60000-->65535-->0-->60000-->65535-->0....所以输出一个周期有65535个脉冲:也就是60000个脉冲翻转一次,然后5535个脉冲再翻转一次。所以并非60000次产生一个比较中断吧?
(2)这样处理如果要改变输出频率的话,总是要溢出,是否使用这种方式不合理?
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

98

主题

253

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2011-12-16
在线时间
57 小时
 楼主| 发表于 2012-1-6 13:08:09 | 显示全部楼层
回复【3楼】科科1987:
---------------------------------
科科1987 你好,您拜读了我的pdf,哥灰常感动~~~~~~~~·
(1)本例中将计数器时钟设置成了6MHz,下面又将自动重装载寄存器设置成了65535(最大值),在中断服务程序中又将捕获比较值增加60000,捕获比较寄存器的值增加后超过65536将从0开始继续加,比如,如果捕获值为65530,那么加60000后将变为59995,计数器超过65535后也将从0开始,每当计数值达到比较值时,捕获比较值就增加60000。这样计数器就一直处于追赶捕获比较值的状态,则系统每计数60000次将产生一次捕获中断,也就是IO口的翻转速度为100Hz.(PS:这就相当于一只兔子和一只乌龟赛跑围绕着一个圆形操场赛跑,每当乌龟跑到兔子地方时,兔子立马飞速往前跑一定距离然后睡觉,当乌龟来时兔子立马又往前跑一定距离,哈哈!)
(2)溢出正是本程序的巧妙所在,如果(1)理解了,你自然就懂了,不管你信不信,反正我是信了。
回复 支持 反对

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
发表于 2012-1-6 13:39:29 | 显示全部楼层
回复【4楼】kexuexyz:
回复【3楼】科科1987:
---------------------------------
科科1987 你好,您拜读了我的pdf,哥灰常感动~~~~~~~~·
(1)本例中将计数器时钟设置成了6MHz,下面又将自动重装载寄存器设置成了65535(最大值),在中断服务程序中又将捕获比较值增加60000,捕获比较寄存器的值增加后超过65536将从0开始继续加,比如,如果捕获值为65530,那么加60000后将变为59995,计数器超过65535后也将从0开始,每当计数值达到比较值时,捕获比较值就增加60000。这样计数器就一直处于追赶捕获比较值的状态,则系统每计数60000次将产生一次捕获中断,也就是IO口的翻转速度为100Hz.(PS:这就相当于一只兔子和一只乌龟赛跑围绕着一个圆形操场赛跑,每当乌龟跑到兔子地方时,兔子立马飞速往前跑一定距离然后睡觉,当乌龟来时兔子立马又往前跑一定距离,哈哈!)
(2)溢出正是本程序的巧妙所在,如果(1)理解了,你自然就懂了,不管你信不信,反正我是信了。
---------------------------------
谢谢科学男孩的耐心讲解,还是有一点不是很清楚:“如果捕获值为65530,那么加60000后将变为59995” ,我的理解是捕获寄存器的值为65530, 如果一次就增加60000不就溢出了吗? 溢出后捕获寄存器的值就是0了吧? 也就是不会再变为59995了;
但是如果是一个一个递增那就是先递增5次溢出后为0,然后再一个一个递增到59995,也即60000次了。 请问科学男孩这两种情况怎么理解呢?谢谢~~
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

98

主题

253

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2011-12-16
在线时间
57 小时
 楼主| 发表于 2012-1-6 14:13:56 | 显示全部楼层
回复【5楼】科科1987:
---------------------------------
是这样的,在C语言中,比如一个8位的变量,最大值为255,那么255再加1将变为0,如果255加2,那么将变为1,跟数学中的角度差不多,比如350°加10°将变为360°,即0°。
回复 支持 反对

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
发表于 2012-1-6 17:10:18 | 显示全部楼层
回复【6楼】kexuexyz:
回复【5楼】科科1987:
---------------------------------
是这样的,在C语言中,比如一个8位的变量,最大值为255,那么255再加1将变为0,如果255加2,那么将变为1,跟数学中的角度差不多,比如350°加10°将变为360°,即0°。
---------------------------------
哦 明白了  谢谢科学男孩~~~
不过还有一个问题请教,就是我用直接操作寄存器的程序为啥不对呢,是哪里配置有误呢? 请科学男孩有空帮小弟看看,不胜感激!!
具体问题请看http://www.openedv.com/posts/list/0/2475.htm#13258
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

6

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2012-3-4
在线时间
0 小时
发表于 2012-7-15 09:45:32 | 显示全部楼层
发现楼主的程序中好像没有把相应的IO设置为AFIO
回复 支持 反对

使用道具 举报

3

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2012-5-31
在线时间
71 小时
发表于 2013-1-14 15:53:20 | 显示全部楼层
看看。。。。。。。。。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

3

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2012-5-31
在线时间
71 小时
发表于 2013-1-14 21:21:03 | 显示全部楼层
附件在什么地方???
回复 支持 反对

使用道具 举报

98

主题

253

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2011-12-16
在线时间
57 小时
 楼主| 发表于 2013-1-15 15:31:02 | 显示全部楼层
回复【10楼】834492956:
---------------------------------
没看见吗?链接
回复 支持 反对

使用道具 举报

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-11-4
在线时间
0 小时
发表于 2013-11-9 18:44:01 | 显示全部楼层
回复【4楼】kexuexyz:
---------------------------------
TIM_TimeBaseStructure.TIM_Period=65535;
那你这个自动重装载值是不是没什么用了啊???????????
回复 支持 反对

使用道具 举报

4

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2015-3-17
在线时间
0 小时
发表于 2015-4-27 21:41:42 | 显示全部楼层
能来个寄存器版的不
回复 支持 反对

使用道具 举报

0

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2015-10-15
在线时间
39 小时
发表于 2016-11-18 19:42:04 来自手机 | 显示全部楼层
这不是利用通用定时器的时间基准功能实现pwm输出的吗,多谢了。只不过还不是我想要的
回复 支持 反对

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2018-5-19
在线时间
8 小时
发表于 2018-5-22 14:27:36 | 显示全部楼层
楼主,想请教你一下,如果单纯用定时器更新中断的方式定时,TIM_TimeBaseStructure.TIM_Period和TIM_TimeBaseStructure.TIM_Prescaler这两个值是要有一个"减一后再赋值"的操作的。  现在换成你的这种更新比较值的定时方法,TIM_TimeBaseStructure.TIM_Prescaler和比较值也需要这个"减一后再赋值"的操作吗?
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2023-8-10
在线时间
6 小时
发表于 2023-9-12 10:39:26 | 显示全部楼层
多谢了。。。。。。。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 15:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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