OpenEdv-开源电子网

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

【这个问题大家来讨论一下】PWM捕获极性的修改问题

[复制链接]

30

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2013-3-7
在线时间
6 小时
发表于 2013-5-11 23:02:10 | 显示全部楼层 |阅读模式
大家好,我在战舰第15章PWM输出捕获实验时有一下的困惑:
实验代码提到,在捕获到第一个上升沿中断后,需要改变PWM的捕获极性,改为捕获下降沿,例程中代码是这样的:

TIM5CH1_CAPTURE_STA|=0X40;  //标记捕获到了上升沿
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);  //CC1P=1 设置为下降沿捕获

请问TIM_OC1PolarityConfig()函数应该是设置第一通道输出极性的吧,而且查阅TIM_OC1PolarityConfig()函数的定义:
void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)
{
  uint16_t tmpccer = 0;
  /* Check the parameters */
  assert_param(IS_TIM_LIST8_PERIPH(TIMx));
  assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity));
  tmpccer = TIMx->CCER;
  /* Set or Reset the CC1P Bit */
  tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC1P);
  tmpccer |= TIM_OCPolarity;
  /* Write to TIMx CCER register */
  TIMx->CCER = tmpccer;
}

这里的uint16_t TIM_OCPolarity参数只有两个选项:
This parameter can be one of the following values:
  *     @arg TIM_OCPolarity_High: Output Compare active high
  *     @arg TIM_OCPolarity_Low: Output Compare active low

请问这到底是怎么回事啊?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2013-5-15 14:37:38 | 显示全部楼层
楼主这个问题问得非常好。。。当时我也纠结了一下这个问题。。。
库函数只提供给了下面的函数输出比较极性函数:
void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
 根据有效性判断这个函数的入口参数为:
#define TIM_OCPolarity_High                ((uint16_t)0x0000)
#define TIM_OCPolarity_Low                 ((uint16_t)0x0002)
第二个参数取值判断:
#define IS_TIM_OC_POLARITY(POLARITY) (((POLARITY) == TIM_OCPolarity_High) || \
                                      ((POLARITY) == TIM_OCPolarity_Low))

查看了固件库V1.5版本,并没有输入捕获极性判断的函数,但是因为在两种模式下,都是配置同一个位,而且,
#define  TIM_ICPolarity_Rising             ((uint16_t)0x0000)
#define  TIM_ICPolarity_Falling            ((uint16_t)0x0002)

也就是说: TIM_OCPolarity_High         =       TIM_ICPolarity_Rising
                TIM_OCPolarity_Low         =         TIM_ICPolarity_Falling           


所以:TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);
   和   TIM_OC1PolarityConfig(TIM5,TIM_OCPolarity_Low);
都是对寄存器CCER配置:  TIM5->CCER|=1<<1;  

不知道是我没找到还是就是这样,当时我看到这里,就直接这样用,使用起来肯定没有问题。因为入口参数的值也符合。。。。
不过名字就有点难看了。。。。。。

大家怎么理解???

库函数不是万能的,使用的时候能了解一下寄存器,对库函数使用还是大有帮助的。。。
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复 支持 3 反对 0

使用道具 举报

21

主题

92

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2013-3-21
在线时间
0 小时
发表于 2013-5-11 23:52:48 | 显示全部楼层
回复【楼主位】supstudent:
---------------------------------
看资料啊  计数值小于oc1时比较输出的电平  一个是高电平 一个是低电平
努力努力
回复 支持 反对

使用道具 举报

30

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2013-3-7
在线时间
6 小时
 楼主| 发表于 2013-5-14 21:59:49 | 显示全部楼层
回复【2楼】happy:
回复【楼主位】supstudent: --------------------------------- 看资料啊  计数值小于oc1时比较输出的电平  一个是高电平 一个是低电平
---------------------------------
额,我的意思是:TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);  //CC1P=1 设置为下降沿捕获  在这一句中,TIM_ICPolarity_Falling根本就是一个非法的值,因为在定义的时候,已经指明了这个值只能为TIM_OCPolarity_High或者TIM_OCPolarity_Low。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-14 22:40:20 | 显示全部楼层
回复【3楼】supstudent:
---------------------------------
要看对情况吧。你那两个应该是针对输出匹配说的。
这里是输入捕获啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

30

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2013-3-7
在线时间
6 小时
 楼主| 发表于 2013-5-15 08:33:50 | 显示全部楼层
回复【4楼】正点原子:
回复【3楼】supstudent: --------------------------------- 要看对情况吧。你那两个应该是针对输出匹配说的。 这里是输入捕获啊。
---------------------------------
嗯,意思是TIM_OC1PolarityConfig(**,**);这个函数既可以设置输出匹配的配置,又可以设置输入捕获的性质吧?
如果这样的话,这个函数的名字就有点问题了,误导人呀,可以写成TIM_IN1PolarityConfig()什么的就好了。
回复 支持 反对

使用道具 举报

30

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2013-3-7
在线时间
6 小时
 楼主| 发表于 2013-5-15 11:27:27 | 显示全部楼层
再顶顶。。。。
回复 支持 反对

使用道具 举报

30

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2013-3-7
在线时间
6 小时
 楼主| 发表于 2013-5-15 21:37:56 | 显示全部楼层
回复【7楼】Admin:
---------------------------------
嗯,如果这样的话,就没有问题了啊,哎,这写库函数的人也比较坑爹,这不是误导人么,幸亏有大神在,呵呵,谢谢啦
回复 支持 反对

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-11-6 14:35:13 | 显示全部楼层
这样啊,,,,
小小蜗牛
回复 支持 反对

使用道具 举报

26

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2015-5-16
在线时间
0 小时
发表于 2015-5-21 20:46:34 | 显示全部楼层
刚看到这个实验,也是纠结于这个问题。谢谢六楼大神指点啦
回复 支持 反对

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-4-13
在线时间
0 小时
发表于 2015-7-16 11:16:26 | 显示全部楼层
MARK,现在明白了。还是没注意看两个对应的是同一寄存器同一位啊
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2016-4-7
在线时间
2 小时
发表于 2016-5-16 13:38:06 | 显示全部楼层
我昨天也遇到这个问题,正要发帖问呢。二楼的说法我想过,就是TIM_ICPolarity_Falling和TIM_ICPolarity_Low的基地址是一样的。不过更让我糊涂的是在stm32f10x_tim.h这个文件中好多宏定义指向的基地址都是(uint16_t)0x0000)和((uint16_t)0x0002),更迷糊了。探索中···
            
回复 支持 反对

使用道具 举报

8

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2021-3-11
在线时间
30 小时
发表于 2021-10-22 23:00:24 | 显示全部楼层
a60419048 发表于 2015-7-16 11:16
MARK,现在明白了。还是没注意看两个对应的是同一寄存器同一位啊

怎么查看这两个寄存器的位
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 16:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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