月照长城

导航

 

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

posted on 2021-01-14 13:22  月照长城  阅读(1542)  评论(0)    收藏  举报