OpenEdv-开源电子网

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

关于输入捕获实验中TIM_OC1PolarityConfig()函数问题

[复制链接]

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2020-2-25
在线时间
5 小时
发表于 2020-3-21 11:40:18 | 显示全部楼层 |阅读模式
1金钱
在学习输入捕获实验的时候,我发现实验例程中的“timer.c”中的两个函数:“TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获”和“TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);//CC1P=1 设置为下降沿捕获”

很奇怪。
TIM_OC1PolarityConfig();这个函数的格式(可能这样说不够准确)应该是TIM_OC1PolarityConfig(TIMx,TIM_OCPolarity_High)或者TIM_OC1PolarityConfig(TIMx,TIM_OCPolarity_Low)
但是原子哥这里面却是TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising)和TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling)。
为什么会这样呢?恳请大神为小弟指点迷津。

最佳答案

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

我明白原因了。查看TIM_OC1PolarityConfig()函数的内容,这个函数是用来配置TIMx_CCER这个寄存器的值。再从参考手册里查这个寄存器,手册里说,当这个寄存器的某一位为0时是上升沿捕获,为1时是下降沿捕获。于是,我们配置TIM_OC1PolarityConfig()时,就相当于配置TIMx_CCER寄存器,而配置这个寄存器就可以配置是上升还是下降沿捕获。函数的输入参数完全可以写成TIM_OCPolarity_High,意思是配置成上升沿捕获,或者写成TIM_OCP ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2021-1-9
在线时间
51 小时
发表于 2020-3-21 11:40:19 来自手机 | 显示全部楼层
我明白原因了。查看TIM_OC1PolarityConfig()函数的内容,这个函数是用来配置TIMx_CCER这个寄存器的值。再从参考手册里查这个寄存器,手册里说,当这个寄存器的某一位为0时是上升沿捕获,为1时是下降沿捕获。于是,我们配置TIM_OC1PolarityConfig()时,就相当于配置TIMx_CCER寄存器,而配置这个寄存器就可以配置是上升还是下降沿捕获。函数的输入参数完全可以写成TIM_OCPolarity_High,意思是配置成上升沿捕获,或者写成TIM_OCPolarity_Low,意思是配置成下降沿捕获。所以,可以把TIM_OC1PolarityConfig()作为配置上升还是下降捕获的函数
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2020-3-21 17:17:56 | 显示全部楼层
看不出你的问题点在哪,描述再具体一点,方便解答
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2020-2-25
在线时间
5 小时
 楼主| 发表于 2020-3-21 21:35:53 | 显示全部楼层
1208 发表于 2020-3-21 17:17
看不出你的问题点在哪,描述再具体一点,方便解答

就是说右键点击TIM_OC1PolarityConfig()这个函数,Go To Definition of “TIM_OC1PolarityConfig”,它后面是两个参数,第一个是选择哪个定时器,第二个是选择极性。点开第二个Go
To Definition去选择极性,它给出来的选择是“TIM_OCPolarity_High”或者“TIM_OCPolarity_Low”。
可是原子哥给的例程里面,这个第二个却是TIM_ICPolarity_Rising或者TIM_ICPolarity_Falling。我不太明白为什么第二个会是这个。
不知道我这样解释,您清楚吗。。。。
回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2020-2-25
在线时间
5 小时
 楼主| 发表于 2020-3-22 16:02:54 | 显示全部楼层
1208 发表于 2020-3-21 17:17
看不出你的问题点在哪,描述再具体一点,方便解答

就是说,右击TIM_OC1PolarityConfig();这个函数,Go To Definition of,会出现“void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)”。然后选择括号中的第二个参数,右击Go to definition of “IS_TIM_OC_POLARITY”,会出现两个选择:TIM_OCPolarity_High和TIM_OCPolarity_Low。这个是库函数里面的情况。
但是原子哥给的例程里面,第二个参数却是TIM_ICPolarity_Falling或者TIM_ICPolarity_Rising。我不太理解为什么会是这两个,明明库函数里面是上面那两个。
由于我是初学者,很多东西不能用专业词汇来表达出来。不知道这样您听懂了没。。。。
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2020-3-24 10:44:59 | 显示全部楼层
生活有度 发表于 2020-3-22 16:02
就是说,右击TIM_OC1PolarityConfig();这个函数,Go To Definition of,会出现“void TIM_OC1PolarityCon ...

Rising对应的是High,Falling对应low
可能板子芯片不一样,定义有所不同
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2020-2-25
在线时间
5 小时
 楼主| 发表于 2020-3-24 17:34:20 | 显示全部楼层
1208 发表于 2020-3-24 10:44
Rising对应的是High,Falling对应low
可能板子芯片不一样,定义有所不同

好吧,谢谢大佬
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2020-3-28
在线时间
5 小时
发表于 2020-4-26 11:02:42 | 显示全部楼层
对,我也遇到这个问题,很迷惑,而且我也特别纳闷这里的函数为啥叫“OCxPolarityConfig”
既然是用来设置输入捕获中断的极性,应该叫“ICxPolarityConfig”呀,但是stm32f4xx_tim.h下并没有这个函数名
以下是我的猜想:
可能从硬件角度来看,设置输出的高电平有效和设置输入的捕获上升沿的配置是一样的,所以在软件中,他们极性设置的操作过程也是一样的,因为我发现“stm32f4xx_tim.h”中“ICPolarity_Rising”和“OCPolarity_High”的值是一样的。既然两个函数的操作是一样的,就没必要再单独写一个函数,实际操作中直接调用“OCxPolarityConfig”就可以了
一个是“高电平有效”,一个是“检测捕获上升沿”,这样想的话两者的确有共通的地方,不知道可不可以这样理解“检测到了有效的高电平”等价于“检测到上升沿”
我也是一个刚学一个月的小白,如果说错了还希望大佬莫怪
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2020-8-3
在线时间
1 小时
发表于 2020-8-21 14:01:45 | 显示全部楼层
92567a 发表于 2020-4-26 11:02
对,我也遇到这个问题,很迷惑,而且我也特别纳闷这里的函数为啥叫“OCxPolarityConfig”
既然是用来设置 ...

我也遇见了这个问题
回复

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1013
金钱
1013
注册时间
2014-4-7
在线时间
98 小时
发表于 2020-8-21 16:07:14 | 显示全部楼层
芯片不一样 有可能预定义的变量名不一样,可以看预定义后的真实值,预定义的值不一样就直接看函数中的配置,具体配置的是哪个寄存器
在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2020-7-12
在线时间
47 小时
发表于 2021-1-8 16:03:25 | 显示全部楼层
#define TIM_OCPolarity_High                ((uint16_t)0x0000)
#define  TIM_ICPolarity_Rising              ((uint16_t)0x0000)
Rising  和_High 都是0x0000
#define TIM_OCPolarity_Low                 ((uint16_t)0x0002)
#define  TIM_ICPolarity_Falling            ((uint16_t)0x0002)
Low 和Falling 都是0x0002
作者为了和定时器的上升沿和下降沿一直,所以这个样用,改成H or L程序是没问题的
回复

使用道具 举报

0

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2021-1-9
在线时间
51 小时
发表于 2021-1-9 10:51:47 来自手机 | 显示全部楼层
TIM_OCPolarity_High和TIM_ICPolarity_Rising是等价的,这个我理解,但是为什么要调用TIM_OC1PolarityConfig()这么一个函数?这个函数的字面意思不应该是输出通道的极性配置吗?为什么能用在输入通道上?
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2021-12-20
在线时间
7 小时
发表于 2022-3-19 16:39:10 | 显示全部楼层
Siryel 发表于 2021-1-9 10:51
TIM_OCPolarity_High和TIM_ICPolarity_Rising是等价的,这个我理解,但是为什么要调用TIM_OC1PolarityConfi ...

极性配置实际上操作的都是TIMx_CEER寄存器的CC1P位
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 21:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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