时钟选择
计数器时钟可由下列时钟源提供:
● 内部时钟(CK_INT)
● 外部时钟模式1:外部输入脚(TIx)
● 外部时钟模式2:外部触发输入(ETR)
● 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。
/-------------------------------
内部时钟(CK_INT)就是最普通的系统时钟分频
外部时钟模式1:外部输入脚(TIx),TI1、TI2,从TIMx_CHx中输入,且TI1可以配置为CH123异或之后的结果。
外部时钟模式2:外部触发输入(ETR),对应的TIMx_ETR引脚。
/-------------------------------
1、内部时钟,这个最简单
TIM2->SMCR 2:0=000;即可,什么其他操作都不需要,剩下的是每种都有的操作
开时钟、预分频、重装值、使能计数器、开中断、分配优先级。
RCC->APB1ENR|=1<<0; //开TIM2时钟
//TIM2->CR1|=UP_DOWN<<4; //DIR第四位,计数方向0:向上;1向下
TIM2->PSC=psc; //时钟预分频
TIM2->ARR=arr; //自动重装值
TIM2->CR1|=1<<0;//CEN第0位,1:使能计数器;0:关闭定时器
TIM2->DIER|=1<<0; //UIE 位0 允许更新中断 0:禁止更新中断;1:允许更新中断。
MY_NVIC_Init(1,3,TIM2_IRQn,2);//抢占1,子优先级3,组2
/----------------------------------------------------------------------------------/
2、外部时钟模式1:外部输入脚(TIx),TI1、TI2,从TIMx_CHx中输入,且TI1可以配置为CH123异或之后的结果。
这个比较复杂点,只配置了TI2,功能与ETR一样了,这个不对,需要深挖一下,配置过程比较难受,最后也是成功了。
程序讲解分为两部分,配置函数与中断服务函数。先说简单的中断服务函数
void TIM2_IRQHandler(void)
{
if(TIM2->SR&0X0001)//溢出中断
{
LED_G_T;
timer++;
}
TIM2->SR&=~(1<<0);//清除中断标志位
if(TIM2->SR&0X0040)//触发器中断标记.这一种有误差,用处不大,不如加入自动重装值,之后提取加满次数和计数器当前值效果好。
{
LED_R_T;
HZ++;
}
TIM2->SR&=~(1<<6);//触发器中断标记
TIM2->SR=0;
}
以上就是一个成功计频的中断服务函数,配置中设定一个自动重装值,这样会有两个重要的中断,触发中断和溢出中断,使用时按照固定时间取出溢出次数和CNT当前值计算后得出频率。
触发中断在每次TI2引脚捕捉上升沿之后都会触发,溢出中断在累积捕捉自动重装值次上升沿后触发,这个很简单。
/--------------------------------------------------------
第二部分配置函数就复杂点,先说明一下做了哪些工作,
开时钟 :TIMx时钟和输入引脚时钟。
配置输入引脚 :下拉输入 8
TI2配置 :CC2通道配置为输入、设置滤波器、设定捕获极性(上下沿触发)
计数器配置 :选择外部时钟1模式、选择触发源、预分频与自动重装值、开计数器使能、选择开启哪些中断,配置优先级。
配置函数:
RCC->APB1ENR|=1<<0; //开TIM2时钟
RCC->APB2ENR|=1<<2; //使能PORTA时钟
/输入引脚/
GPIOA->CRL&=0XFFFFFF0F; //PA1 清除之前设置
GPIOA->CRL|=0X00000080; //PA1 输入
GPIOA->ODR|=0<<1; //PA1 下拉
/TI2配置/
TIM2->CCMR1|=01<<8; //TIMx_CCMR1寄存器 9:8位 01:CC2通道被配置为输入,IC2映射在TI2上;
TIM2->CCMR1|=000<<12; //位15:12 IC2F[3:0]:输入捕获2滤波器(如果不需要滤波器,保持IC2F=0000)
//注: 捕获预分频器不用作触发,所以不需要对它进行配置
TIM2->CCER|=0<<5; //位5 CC2P:输入/捕获2输出极性:0:上升沿;1:下降沿
/计数器配置/
TIM2->SMCR|=7<<0; //SMS=’111’,选择定时器外部时钟模式1
TIM2->SMCR|=6<<4; //位6:4 TS[2:0]:触发选择 110:滤波后的定时器输入2(TI2FP2) 选定TI2作为触发输入源
//TIM2->PSC=10; //时钟预分频 |
TIM2->ARR=65535; //自动重装值 |此两项预分频始终效果不好,会丢信号,自动重装值配合运算计频还不错。
TIM2->CR1|=1<<0;//CEN第0位,1:使能计数器;0:关闭定时器
/中断配置/
//TIM2->DIER|=1<<6; //此位开中断后,每次上升沿都会进中断,SR第六位;位6 TIE:触发中断使能0:禁止触发中断;1:使能触发中断。
TIM2->DIER|=1<<0; //UIE 位0 允许更新中断 0:禁止更新中断;1:允许更新中断。
MY_NVIC_Init(1,3,TIM2_IRQn,2);//抢占1,子优先级3,组2
/**-------------------------------------------------------------------------*/
3、外部时钟模式2:外部触发输入(ETR),对应的TIMx_ETR引脚。
这个相对模式1来说简单得多,配置过模式1之后随随便便就出来了。
这两个非常类似,与1不同的是,选择时钟时不需要SMS三位的配置,只需要第14位置一,因此外部时钟模式1和2可以同时使用!!
/--------------------------------------------------------
中断服务函数与模式1基本一致,只有溢出中断,用法一模一样,甚至可以复制。
配置函数做了哪些工作:
开时钟 :TIMx时钟和输入引脚时钟。
配置输入引脚 :下拉输入 8
计数器配置 :选择滤波器、设置ETR预分频器、外部触发极性、开启外部时钟模式2、预分频与自动重装值、开计数器使能、选择开启哪些中断,配置优先级。
/*时钟*/
RCC->APB1ENR|=1<<0; //开TIM2时钟
RCC->APB2ENR|=1<<2; //使能PORTA时钟
/*输入引脚*/
GPIOA->CRL&=0XFFFFFFF0; //PA0 清除之前设置
GPIOA->CRL|=0X00000008; //PA0 输入
GPIOA->ODR|=0<<1; //PA0 下拉
/*计数器配置*/
TIM2->SMCR|=0<<8; //滤波器 ETF[3:0]=0000
TIM2->SMCR|=0<<12; //设置预分频器 /2 ,置TIMx_SMCR寄存器中的ETPS[1:0]=01,外部触发信号ETRP的频率必须最多是CK_INT频率的1/4
TIM2->SMCR|=1<<14; //开启外部时钟模式2,置TIMx_SMCR寄存器中的ECE=1 0:禁止外部时钟模式2;1:使能外部时钟模式2。
//TIM2->PSC=10; //时钟预分频 |
TIM2->ARR=arr; //自动重装值 |此两项预分频始终效果不好,会丢信号,自动重装值配合运算计频还不错。
TIM2->CR1|=1<<0;//CEN第0位,1:使能计数器;0:关闭定时器
/中断配置/
TIM2->DIER|=1<<0; //UIE 位0 允许更新中断 0:禁止更新中断;1:允许更新中断。
MY_NVIC_Init(1,3,TIM2_IRQn,2);//抢占1,子优先级3,组2
/**-------------------------------------------------------------------------*/
时钟选择
计数器时钟可由下列时钟源提供:
● 内部时钟(CK_INT)
● 外部时钟模式1:外部输入脚(TIx)
● 外部时钟模式2:外部触发输入(ETR)
● 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。
/-------------------------------
内部时钟(CK_INT)就是最普通的系统时钟分频
外部时钟模式1:外部输入脚(TIx),TI1、TI2,从TIMx_CHx中输入,且TI1可以配置为CH123异或之后的结果。
外部时钟模式2:外部触发输入(ETR),对应的TIMx_ETR引脚。
/-------------------------------
1、内部时钟,这个最简单
TIM2->SMCR 2:0=000;即可,什么其他操作都不需要,剩下的是每种都有的操作
开时钟、预分频、重装值、使能计数器、开中断、分配优先级。
RCC->APB1ENR|=1<<0; //开TIM2时钟
//TIM2->CR1|=UP_DOWN<<4; //DIR第四位,计数方向0:向上;1向下
TIM2->PSC=psc; //时钟预分频
TIM2->ARR=arr; //自动重装值
TIM2->CR1|=1<<0;//CEN第0位,1:使能计数器;0:关闭定时器
TIM2->DIER|=1<<0; //UIE 位0 允许更新中断 0:禁止更新中断;1:允许更新中断。
MY_NVIC_Init(1,3,TIM2_IRQn,2);//抢占1,子优先级3,组2
/----------------------------------------------------------------------------------/
2、外部时钟模式1:外部输入脚(TIx),TI1、TI2,从TIMx_CHx中输入,且TI1可以配置为CH123异或之后的结果。
这个比较复杂点,只配置了TI2,功能与ETR一样了,这个不对,需要深挖一下,配置过程比较难受,最后也是成功了。
程序讲解分为两部分,配置函数与中断服务函数。先说简单的中断服务函数
void TIM2_IRQHandler(void)
{
if(TIM2->SR&0X0001)//溢出中断
{
LED_G_T;
timer++;
}
TIM2->SR&=~(1<<0);//清除中断标志位
if(TIM2->SR&0X0040)//触发器中断标记.这一种有误差,用处不大,不如加入自动重装值,之后提取加满次数和计数器当前值效果好。
{
LED_R_T;
HZ++;
}
TIM2->SR&=~(1<<6);//触发器中断标记
TIM2->SR=0;
}
以上就是一个成功计频的中断服务函数,配置中设定一个自动重装值,这样会有两个重要的中断,触发中断和溢出中断,使用时按照固定时间取出溢出次数和CNT当前值计算后得出频率。
触发中断在每次TI2引脚捕捉上升沿之后都会触发,溢出中断在累积捕捉自动重装值次上升沿后触发,这个很简单。
/--------------------------------------------------------
第二部分配置函数就复杂点,先说明一下做了哪些工作,
开时钟 :TIMx时钟和输入引脚时钟。
配置输入引脚 :下拉输入 8
TI2配置 :CC2通道配置为输入、设置滤波器、设定捕获极性(上下沿触发)
计数器配置 :选择外部时钟1模式、选择触发源、预分频与自动重装值、开计数器使能、选择开启哪些中断,配置优先级。
配置函数:
RCC->APB1ENR|=1<<0; //开TIM2时钟
RCC->APB2ENR|=1<<2; //使能PORTA时钟
/输入引脚/
GPIOA->CRL&=0XFFFFFF0F; //PA1 清除之前设置
GPIOA->CRL|=0X00000080; //PA1 输入
GPIOA->ODR|=0<<1; //PA1 下拉
/TI2配置/
TIM2->CCMR1|=01<<8; //TIMx_CCMR1寄存器 9:8位 01:CC2通道被配置为输入,IC2映射在TI2上;
TIM2->CCMR1|=000<<12; //位15:12 IC2F[3:0]:输入捕获2滤波器(如果不需要滤波器,保持IC2F=0000)
//注: 捕获预分频器不用作触发,所以不需要对它进行配置
TIM2->CCER|=0<<5; //位5 CC2P:输入/捕获2输出极性:0:上升沿;1:下降沿
/计数器配置/
TIM2->SMCR|=7<<0; //SMS=’111’,选择定时器外部时钟模式1
TIM2->SMCR|=6<<4; //位6:4 TS[2:0]:触发选择 110:滤波后的定时器输入2(TI2FP2) 选定TI2作为触发输入源
//TIM2->PSC=10; //时钟预分频 |
TIM2->ARR=65535; //自动重装值 |此两项预分频始终效果不好,会丢信号,自动重装值配合运算计频还不错。
TIM2->CR1|=1<<0;//CEN第0位,1:使能计数器;0:关闭定时器
/中断配置/
//TIM2->DIER|=1<<6; //此位开中断后,每次上升沿都会进中断,SR第六位;位6 TIE:触发中断使能0:禁止触发中断;1:使能触发中断。
TIM2->DIER|=1<<0; //UIE 位0 允许更新中断 0:禁止更新中断;1:允许更新中断。
MY_NVIC_Init(1,3,TIM2_IRQn,2);//抢占1,子优先级3,组2
/**-------------------------------------------------------------------------*/
3、外部时钟模式2:外部触发输入(ETR),对应的TIMx_ETR引脚。
这个相对模式1来说简单得多,配置过模式1之后随随便便就出来了。
这两个非常类似,与1不同的是,选择时钟时不需要SMS三位的配置,只需要第14位置一,因此外部时钟模式1和2可以同时使用!!
/--------------------------------------------------------
中断服务函数与模式1基本一致,只有溢出中断,用法一模一样,甚至可以复制。
配置函数做了哪些工作:
开时钟 :TIMx时钟和输入引脚时钟。
配置输入引脚 :下拉输入 8
计数器配置 :选择滤波器、设置ETR预分频器、外部触发极性、开启外部时钟模式2、预分频与自动重装值、开计数器使能、选择开启哪些中断,配置优先级。
/*时钟*/
RCC->APB1ENR|=1<<0; //开TIM2时钟
RCC->APB2ENR|=1<<2; //使能PORTA时钟
/*输入引脚*/
GPIOA->CRL&=0XFFFFFFF0; //PA0 清除之前设置
GPIOA->CRL|=0X00000008; //PA0 输入
GPIOA->ODR|=0<<1; //PA0 下拉
/*计数器配置*/
TIM2->SMCR|=0<<8; //滤波器 ETF[3:0]=0000
TIM2->SMCR|=0<<12; //设置预分频器 /2 ,置TIMx_SMCR寄存器中的ETPS[1:0]=01,外部触发信号ETRP的频率必须最多是CK_INT频率的1/4
TIM2->SMCR|=1<<14; //开启外部时钟模式2,置TIMx_SMCR寄存器中的ECE=1 0:禁止外部时钟模式2;1:使能外部时钟模式2。
//TIM2->PSC=10; //时钟预分频 |
TIM2->ARR=arr; //自动重装值 |此两项预分频始终效果不好,会丢信号,自动重装值配合运算计频还不错。
TIM2->CR1|=1<<0;//CEN第0位,1:使能计数器;0:关闭定时器
/中断配置/
TIM2->DIER|=1<<0; //UIE 位0 允许更新中断 0:禁止更新中断;1:允许更新中断。
MY_NVIC_Init(1,3,TIM2_IRQn,2);//抢占1,子优先级3,组2
/**-------------------------------------------------------------------------*/
举报