1、初始化:使能时钟、使能基本定时器中断、NVIC中断使能
/***************************************************************** 函数名:Timer_Init 功 能:Timer6初始化 参 数:arr自动重装载值,psc预分频系数 返回值:无 描 述:看手册功能框架图,可知基本定时器6挂载在APB1 1、基本定时器 TIM6 包含一个 16 位自动重载计数器,该计数器由可编程预分频器驱动。TIM6是16 位自动重载递增计数器 2、更新事件产生的来源:计数器上溢/下溢、将UG位置1(更新生成)、通过从模式控制器生成的更新事件 *****************************************************************/ int TIM6_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6 ,ENABLE);//使能时钟 TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStruct.TIM_Period = arr-1; //TIMx_ARR自动重装载值 范围0~65535(2^16-1) TIM_TimeBaseInitStruct.TIM_Prescaler = psc-1; //预分频系数 TIM_TimeBaseInit(TIM6, &TIM_TimeBaseInitStruct); //初始化定时器并产生更新事件后就立马进入中断 TIM_Cmd( TIM6, ENABLE); TIM_ClearITPendingBit(TIM6,TIM_IT_Update); //清除中断标志位,把更新事件清除后不能马上进入中断,定时时间到了才进入中断 TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE ); //使能TIM6中断,CPU执行中断服务函数(默认执行启动文件的服务函数,如果没写定时器中断服务函数就进入死循环) NVIC_EnableIRQ(TIM6_DAC_IRQn); //NVIC中断使能,需要特别注意的是TIM6_DAC_IRQn printf("定时器6初始化\r\n"); }
2、验证基本定时器是否开始计数(前提:串口1配置完成)
while(1) { printf("%d\r\n",TIM6->CNT);//验证是否初始化成功。如果定时器初始化成功,计数器开始计数 }
3、定时器中断服务函数
/***************************************************************** 函数名:TIM6_DAC_IRQHandler 功 能:定时器中断服务函数,定时器定时时间到了之后,自动执行定时器中断函数 参 数:无 返回值:无 描 述:这个函数在系统启动文件有定义,汇编语言中的B .代表while(1) *****************************************************************/ void TIM6_DAC_IRQHandler(void) { if(TIM_GetITStatus(TIM6,TIM_IT_Update)==SET) //溢出中断 { printf("进入定时器6中断\r\n"); LED1 = !LED1; LED2 = !LED2; LED3 = !LED4; LED4 = !LED4; } TIM_ClearITPendingBit(TIM6,TIM_IT_Update); //清除中断标志位,避免重复进入中断 }
4、计算定时时长1s
TIM6_Init(10000,8400);//定时时间=周期*周期次数

定时器6时钟源频率:84MZ(由上面的时钟树可知)
自己设置的分频系数:8400
计数频率:84000000/8400=10000Hz
周期(计数一次所需时间):1/10000=0.1ms
自己设置的周期次数(自动重装载值):10000
定时时长:0.1*10000=1000ms=1s
浙公网安备 33010602011771号