OpenEdv-开源电子网

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

定时器初始化函数寄存器配置问题

[复制链接]

8

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2015-6-1
在线时间
21 小时
发表于 2015-11-2 14:07:17 | 显示全部楼层 |阅读模式
5金钱

void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
{
  uint16_t tmpcr1 = 0;

  /* Check the parameters */
  assert_param(IS_TIM_ALL_PERIPH(TIMx));
  assert_param(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct->TIM_CounterMode));
  assert_param(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct->TIM_ClockDivision));

  tmpcr1 = TIMx->CR1; 
 
  if((TIMx == TIM1) || (TIMx == TIM8)|| (TIMx == TIM2) || (TIMx == TIM3)||
     (TIMx == TIM4) || (TIMx == TIM5))
  {
    /* Select the Counter Mode */
    tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_CMS)));
    tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_CounterMode;
  }
大家好,我想请问下这段代码的具体含义。1.assert_param(IS_TIM_ALL_PERIPH(TIMx));是判断IS_TIM_ALL_PERIPH(TIMx)的值是为0或者空吗?#define IS_TIM_ALL_PERIPH(PERIPH) (((PERIPH) == TIM1) || \
                                   ((PERIPH) == TIM2) || \
                                   ((PERIPH) == TIM3) || \
                                   ((PERIPH) == TIM4) || \
                                   ((PERIPH) == TIM5) || \
                                   ((PERIPH) == TIM6) || \
                                   ((PERIPH) == TIM7) || \
                                   ((PERIPH) == TIM8) || \
                                   ((PERIPH) == TIM9) || \
                                   ((PERIPH) == TIM10)|| \
                                   ((PERIPH) == TIM11)|| \
                                   ((PERIPH) == TIM12)|| \
                                   ((PERIPH) == TIM13)|| \
                                   ((PERIPH) == TIM14)|| \
                                   ((PERIPH) == TIM15)|| \
                                   ((PERIPH) == TIM16)|| \
                                   ((PERIPH) == TIM17))
又是什么意思呢?
2.tmpcr1 = TIMx->CR1; 将定时器的控制寄存器CR1赋值给tmpcr1是什么意思?怎么理解?
3. tmpcr1 = TIMx->CR1; 
   tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_DIR)));
  tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_CounterMode;
这两行代码是啥意思,TIM_CR1_DIR和TIM_CR1_DIR都是控制寄存器CR1的第4(0x10)位和5、6(0x60)位,对他们运算是啥意思?这三个tmpcr1分别对应多少?
以上代码都来自原子哥的定时器的示例,请大家帮忙解读下!非常感谢!!

最佳答案

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

这是库函数了。 1是检查参数对不对,即检查定时器寄存器的地址是否合法。去掉都可以的,前提是保证自己别写错了。 2.tmpcr1 就是个临时变量而已,先把寄存器的值装进临时变量,处理完后再赋回去。 3.“&=”经常作清0某些位用,这里tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_CMS)));     就是把TIM_CR1_DIR 和TIM_CR1_CMS位清0。其他位不变。   &nbs ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2015-4-14
在线时间
0 小时
发表于 2015-11-2 14:07:18 | 显示全部楼层
这是库函数了。
1是检查参数对不对,即检查定时器寄存器的地址是否合法。去掉都可以的,前提是保证自己别写错了。
2.tmpcr1 就是个临时变量而已,先把寄存器的值装进临时变量,处理完后再赋回去。
3.“&=”经常作清0某些位用,这里tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_CMS)));
    就是把TIM_CR1_DIR 和TIM_CR1_CMS位清0。其他位不变。

   “|=”经常作置1某些位。其他位不变
回复

使用道具 举报

8

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2015-6-1
在线时间
21 小时
 楼主| 发表于 2015-11-2 14:07:18 | 显示全部楼层
回复【2楼】chy712:
---------------------------------
非常感谢你的帮助!第2、3问我懂了,能不能具体解答下第一问, assert_param(IS_TIM_ALL_PERIPH(TIMx)); 
是检查那个参数?怎么实现的,我看到的都是些宏定义呀,
#define assert_param(expr) ((void)0)
#define IS_TIM_ALL_PERIPH(PERIPH) (((PERIPH) == TIM1) || \
                                   ((PERIPH) == TIM2) || \
                                   ((PERIPH) == TIM3) || \
                                   ((PERIPH) == TIM4) || \
                                   ((PERIPH) == TIM5) || \
                                   ((PERIPH) == TIM6) || \
                                   ((PERIPH) == TIM7) || \
                                   ((PERIPH) == TIM8) || \
                                   ((PERIPH) == TIM9) || \
                                   ((PERIPH) == TIM10)|| \
                                   ((PERIPH) == TIM11)|| \
                                   ((PERIPH) == TIM12)|| \
                                   ((PERIPH) == TIM13)|| \
                                   ((PERIPH) == TIM14)|| \
                                   ((PERIPH) == TIM15)|| \
                                   ((PERIPH) == TIM16)|| \
                                   ((PERIPH) == TIM17))
能否继续解惑,不胜感谢!
回复

使用道具 举报

3

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2015-4-14
在线时间
0 小时
发表于 2015-11-2 14:07:18 | 显示全部楼层
assert_param(IS_TIM_ALL_PERIPH(TIMx)); 
即为assert_param((TIMx==TIM1)||(TIMx==TIM2)||(TIMx==TIM3)||......||(TIMx==TIM17))

如果没定义USE_FULL_ASSERT这个东西
那上面的最终是 ((void)0) ,什么都不干。

如果定义了USE_FULL_ASSERT这个东西
那上面那句最终就是
((TIMx==TIM1)||(TIMx==TIM2)||(TIMx==TIM3)||......||(TIMx==TIM17)) ? (void)0: assert_failed((uint8_t *)__FILE__, __LINE__));
如果TIMx和TIM1,TIM2,TIM3等等任一项相等就会执行(void)0,什么都不做。
如果都不相等,代表参数肯定错了,那就执行assert_failed((uint8_t *)__FILE__, __LINE__));这个函数。但这个函数具体是什么,我就不晓得了。

我们在用的时候基本都没定义USE_FULL_ASSERT。所以这些assert_param都是((void)0),什么都没做的。
回复

使用道具 举报

8

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2015-6-1
在线时间
21 小时
 楼主| 发表于 2015-11-3 08:33:52 | 显示全部楼层
回复【4楼】chy712:
---------------------------------
非常感谢你的帮助,我懂了,谢谢!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 22:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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