1、TIM定时器的相关寄存器介绍
- 输入捕获单元组成
状态寄存器 1 (TIM1_SR1)
若发生驳货事件,状态寄存器1(TIM1_SR1)中相应的CCxIF标志位会被置“1”,表示计数值已被捕获至 捕获/比较寄存器(TIM1_CCRx)中。
若状态寄存器1(TIM1_SR1)中的CCxIF标志位被置“1”后,又发生了一次捕获事件,则状态寄存器2(TIM1_SR2)中的CCxOF会被置1,以表示发生了重复的捕获事件。
2、输入捕获模式的介绍
在输入捕获模式下,当检测到ICi信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存器(TIM1_CCRx)中。当发生捕获事件时,相应的CCiIF标志(TIM1_SR寄存器)被置1。
如果TIM1_IER寄存器的CCiIE位被置位,也就是使能了中断,则将产生中断请求。如果发生捕获事件时CCiIF标志已经为高,那么重复捕获标志CCiOF(TIM1_SR2寄存器)被置1。写CCiIF=0或读取存储在TIM1_CCRiL寄存器中的捕获数据都可清除CCiIF。写CCiOF=0可清除CCiOF。
以下例子说明如何在TI1输入的上升沿时捕获计数器的值到TIM1_CCR1寄存器中,步骤如下:
- 选择有效输入端:例如TIM1_CCR1连接到TI1输入,所以写入TIM1_CCR1寄存器中的
CC1S=01,此时通道被配置为输入,并且TIM1_CCR1寄存器变为只读。
- 根据输入信号TIi的特点,可通过配置TIM1_CCMRi寄存器中的ICiF位来设置相应的输入滤
波器的滤波时间。假设输入信号在最多5个时钟周期的时间内抖动,我们须配置滤波器的带
宽长于5个时钟周期;因此我们可以连续采样8次,以确认在TI1上一次真实的边沿变换,即
在TIMi_CCMR1寄存器中写入IC1F=0011,此时,只有连续采样到8个相同的TI1信号,信
号才为有效(采样频率为f MASTER )。
- 选择TI1通道的有效转换边沿,在TIM1_CCER1寄存器中写入CC1P=0(上升沿)。
- 配置输入预分频器。在本例中,我们希望捕获发生在每一个有效的电平转换时刻,因此预
分频器被禁止(写TIM1_CCMR1寄存器的IC1PS=00)。
- 设置TIM1_CCER1寄存器的CC1E=1,允许捕获计数器的值到捕获寄存器中。
- 如果需要,通过设置TIM1_IER寄存器中的CC1IE位允许相关中断请求。
当发生一个输入捕获时:
● 当产生有效的电平转换时,计数器的值被传送到TIM1_CCR1寄存器。
● CC1IF标志被设置(中断标志)。当发生至少2个连续的捕获时,而CC1IF未曾被清除时,
CC1OF也被置1。
● 如设置了CC1IE位,则会产生一个中断。
为了处理捕获溢出(CC1OF位),建议在读出重复捕获标志之前读取数据,这是为了避免丢失在
读出捕获溢出标志之后和读取数据之前可能产生的重复捕获信息。
1)PWM 输入信号测量
该模式是输入捕获模式的一个特例,除下列区别外,操作与输入捕获模式相同:
● 两个ICi信号被映射至同一个TIi输入。
● 这两个ICi信号的有效边沿的极性相反。
● 其中一个TIiFP信号被作为触发输入信号,而触发模式控制器被配置成复位触发模式。
2)PWM信号的周期测量示例
例如,你可以用以下方式测量TI1上输入的PWM信号的周期(TIM1_CCR1寄存器)和占空比(TIM1_CCR2寄存器)。(具体取决于f MASTER 的频率和预分频器的值)
- 选择TIM1_CCR1的有效输入:置TIM1_CCMR1寄存器的CC1S=01(选中TI1)。
- 选择TI1FP1的有效极性(用来捕获数据到TIM1_CCR1中和清除计数器):置CC1P=0(上升沿
有效)。
- 选择TIM1_CCR2的有效输入:置TIM1_CCMR2寄存器的CC2S=10(选中TI1FP2)。
- 选择TI1FP2的有效极性(捕获数据到TIM1_CCR2):置CC2P=1(下降沿有效)。
- 选择有效的触发输入信号:置TIM1_SMCR寄存器中的TS=101(选择TI1FP1)。
- 配置触发模式控制器为复位触发模式:置TIM1_SMCR中的SMS=100。
- 使能捕获:置TIM1_CCER1寄存器中CC1E=1,CC2E=1。
3、输入捕获测量初始化的一般流程
- 设置具体的输入通道,既 捕获/ 比较模式寄存器 (TIM1_CCMRx)的CCxS[1:0]位
- 设置信号采样率及滤波器,即 捕获/ 比较模式寄存器 (TIM1_CCMRx)的ICxF[3:0]位
- 设置信号边沿极性,既配置 捕获/ 比较使能寄存器 (TIM1_CCERx)的CCxP位
- 设置信号预分配因子,既 捕获/ 比较模式寄存器 (TIM1_CCMRx)的IC1PSC[1:0]位
- 使能捕获功能,既配置 捕获/ 比较使能寄存器 (TIM1_CCERx)的CCxE位
4、参考代码
两种初始化方式:
/****************************************************************/ //TIM1功能初始化函数my_init(),无形参,无返回值 /****************************************************************/ void my_init(void) { //1.CC1通道被配置为输入,IC1映射在TI1FP1上“CC1S[1:0]=01” TIM1_CCMR1|=0x01; //2.配置信号边沿极性为TI1F或TI2F的低电平或下降沿“CC1P=1” TIM1_CCER1&=0xFD; //上升沿 //3.CC2通道被配置为输入,IC2映射在TI1FP2上“CC2S[1:0]=10” TIM1_CCMR2|=0x02; //4.配置TI1FP2信号边沿极性为下降沿“CC2P=1” TIM1_CCER1|=0x20; //5.配置采样率为主时钟频率,无滤波器“IC1F[3:0]=0000” TIM1_CCMR1&=0x0F; //6.配置输入/捕获1通道预分频器因子为8分频“IC1PSC[1:0]=11” TIM1_CCMR1|=0x0C; //7.使能TIM1_CH1输入捕获功能“CC1E=1” TIM1_CCER1|=0x01; //8.使能TIM1计数器功能“CEN=1” TIM1_CR1|=0x01; } /****************************************************************/ //TIM1功能初始化函数TIM1_init(),无形参,无返回值 /****************************************************************/ void TIM1_init(void) { //1.CC1通道被配置为输入,IC1映射在TI1FP1上“CC1S[1:0]=01” // 0x000000001 : CC1通道被配置为输入,IC1映射在TI1FP1上; TIM1_CCMR1|=0x01; //2.配置TI1FP1信号边沿极性为上升沿“CC1P=0” // 0x11111101 : 捕获发生在TI1F或TI2F的上升沿; TIM1_CCER1&=0xFD; //3.CC2通道被配置为输入,IC2映射在TI1FP2上“CC2S[1:0]=10” // 0x00000010 : CC2通道被配置为输入,IC1映射在TI2FP2上; TIM1_CCMR2|=0x02; //4.配置TI1FP2信号边沿极性为下降沿“CC2P=1” // 0x00100000 : 1:捕获发生在TI1F或TI2F的下降沿 TIM1_CCER1|=0x20; //5.配置触发输入信号为TI1FP1,“TS[2:0]=101” // 0x01010000 : 选择用于选择同步计数器的触发输入,滤波后的定时器输入1(TI1FP1) TIM1_SMCR|=0x50; //6.配置触发模式为复位触发,“SMS[2:0]=100” // 0x00000100 : 复位模式 – 在选中的触发输入(TRGI)的上升沿时重新初始化计数器,并且产生一个更新寄存器的信号 TIM1_SMCR|=0x04; //7.使能TIM1计数器功能“CEN=1” TIM1_CR1|=0x01; //没有设置在外部触发寄存器(TIM1_ETR)中的采样频率 }