一、TIM_InternalClockConfig 设置 TIMx 内部时钟
转到函数定义该函数影响的是从模式控制寄存器(TIMx_SMCR) 的从模式选择(SMS)。
TIM_SMCR_SMS在stm32f10x.h中定义如下。
#define TIM_SMCR_SMS ((uint16_t)0x0007) /*!< SMS[2:0] bits (Slave mode selection) */
这段代码的目的是将TIMx->SMCR
的特定位字段清零,即将它与(~((uint16_t)TIM_SMCR_SMS))
进行按位与并赋值。
首先,(uint16_t)TIM_SMCR_SMS
将TIM_SMCR_SMS
强制转换为uint16_t
类型,确保它与TIMx->SMCR
的数据类型一致。然后,使用~
运算符对该值进行按位取反操作,得到一个掩码,将TIM_SMCR_SMS
对应的位设置为0,其他位设置为1。
最后,将TIMx->SMCR
与这个掩码进行按位与操作,清除TIM_SMCR_SMS
的位字段,然后将结果赋值给TIMx->SMCR
。
TIM_SMCR_SMS = ((uint16_t)0x0007) = 0000 0000 0000 0111
~((uint16_t)TIM_SMCR_SMS) = 1111 1111 1111 1000
TIMx->SMCR &= (uint16_t)(~((uint16_t)TIM_SMCR_SMS)) = 1111 1111 1111 1000
SMS=000
从模式选择SMS = 000:关闭从模式 – 如果CEN=1,则预分频器直接由内部时钟驱动。
时钟源确定为内部时钟。
时钟树走向如下
二、TIM_ITRxExternalClockConfig 设置 TIMx 内部触发为外部时钟模式
转到函数定义。这里我也没有看明白,不过可以确定的是时钟树的走向是正确的。
继续跳转到TIM_SelectInputTrigger()定义,可以看到与从模式控制寄存器(TIMx_SMCR) 的触发选择(TS)有关。
时钟树走向如下
三、TIM_TIxExternalClockConfig 设置 TIMx 触发为外部时钟
转到函数定义。查看TIM_TIxExternalCLK1Source_TI2 ((uint16_t)0x0060)在SMCR寄存器中对应TS=110也就是TI2FP2.
#define TIM_TIxExternalCLK1Source_TI2 ((uint16_t)0x0060)
时钟树走向如下。
四、TIM_ETRClockMode1Config 配置 TIMx 外部时钟模式 1
TIM_ETRClockMode1Config 参考TIM_ETRClockMode2Config。
五、TIM_ETRClockMode2Config 配置 TIMx 外部时钟模式 2
转到函数定义该函数影响的是从模式控制寄存器(TIMx_SMCR) 的外部时钟使能位(ECE)
TIM_SMCR_ECE在stm32f10x.h中定义如下。
#define TIM_SMCR_ECE ((uint16_t)0x4000) /*!< External clock enable */
0x4000对应二进制数为0100 0000 0000 0000。也就是说使能了 从模式控制寄存器(TIMx_SMCR) 的外部时钟使能位(ECE),将时钟源配置为“外部时钟模式2”
时钟树走向如下
六、TIM_ETRConfig 配置 TIMx 外部触发
配置ETR的预分频器、极性、滤波器。