【1-1】、定时器定时中断&定时器外部时钟
第一步:RCC开启时钟,是每个代码的第一步
第二步:选择时基单元的时钟源,对于定时中断,我们选择内部时钟源
第三步:配置时基单元 ,包括预分频器、自动重装器、计数模式等等,可以用结构体进行配置
第四步:配置输出中断控制,允许更新中断输出到NVIC
第五步:配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级
第六步:运行控制
整个模块配置完成后,我们还需要使能一下计数器,要不然计数器是不会运行的,当定时器使能后,计数器就会开始计数了,当计数器更新时,触发中断。这个时候我们再写一个中断函数,这样这个中断函数就能每隔一段时间自动执行一次。
1.定时器初始化
代码如下:
void Timer_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;//时基单元的结构体
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//初始化TIM2时钟
TIM_InternalClockConfig(TIM2);//选择时基单元时钟(内部时钟、可写可不写(默认开启内部时钟))
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//1分频(不分频)
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//计数器模式(向上计数)
TIM_TimeBaseInitStruct.TIM_Period=10000-1;//ARR自动重装器的值 //////决定计时时间的两个参数 定时频率(CK_CNT_OV)=CK_PSC/(PSC+1)/(ARR+1) CK_PSC为内部时钟72M
TIM_TimeBaseInitStruct.TIM_Prescaler=7200-1;//PSC预分频器的值//////决定计时时间的两个参数 PSC和ARR有一个数的偏差
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;//重复计数器的值(高级计数器才用,这里不用)
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);//配置时基单元
TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除中断标志位
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能中断
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//优先级分组
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;//中断通道
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//响应优先级
NVIC_Init(&NVIC_InitStructure);//初始化优先级
TIM_Cmd(TIM2,ENABLE);//启动定时器
}
2.定时器中断
代码如下:
void TIM2_IRQHandler(void)//定时器中断函数
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)//判断中断标志位
{
num++;
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志位
}
}
该处定时器中断一段在哪里使用就写在哪里,不需要在.h文件中声明,其中定时器中断的num变量如果在主函数中定义,中断函数在初始化函数的.c文件中使用num变量(跨文件使用),必须在使用文件中用extern uint16_t num定义才可以。
3.定时器外部时钟
(1)我们首先需要选择外部时钟源模式2(函数TIM_ETRClockMode2Config),其中TIM2对应的ETR外部时钟引脚为A0。
(2)初始化GPIOA_Pin_0
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//初始化GPIOA时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0X00);//选择外部时钟源模式2
当外部对A0口输入一个方波的脉冲,就会触发定时器中断进行计数。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了定时器定时中断的使用和定时器外部时钟的使用。