简单看了下定时器的内容,挺多的,觉得定时器就是封装的中断,因为单独的一个定时器无法完成任何事,还需要定时器(中断)函数。
截个江科大的做的图:
像之前的中断一样,定时器的配置流程如上图所示,首先是时钟单元的获取(确定用什么时钟,定时频率),然后是时基单元(定多长时间),中断输出(达到定时标志进入中断处理相关任务)
由于之前玩过DSP2812,所以对定时器的一些概念还比较熟悉,因此理解起来还算轻松,就是第一步时钟单元的配置内容多一些,需要结合手册。
代码部分,由于TIM2是内部中断,因此直接配置NVIC中断通道即可
void Timer_Init()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_InternalClockConfig(TIM2);//¿É²»Ð´£¬ÒòΪÆô¶¯Ê±Ä¬ÈÏʹÓÃ
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStru;
TIM_TimeBaseInitStru.TIM_ClockDivision=TIM_CKD_DIV1;//²»·ÖƵ£¬¾ÍÊÇ72MHz
TIM_TimeBaseInitStru.TIM_CounterMode=TIM_CounterMode_Up;//ÏòÉϼÆÊýģʽ
TIM_TimeBaseInitStru.TIM_Period=10000-1;//¼ÆÊýÖÜÆÚ1s
TIM_TimeBaseInitStru.TIM_Prescaler=7200-1;
TIM_TimeBaseInitStru.TIM_RepetitionCounter=0;//¸ß¼¶¶¨Ê±Æ÷²ÅÉÓÃ
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStru);
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);
}
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
{
Num ++;
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
重点部分是实际单元的计时周期配置,公式如下:
•
CK_CNT_OV = CK_CNT / (ARR
+ 1)
= CK_PSC / (PSC + 1) / (ARR + 1),其中,CK_PSC为时钟频率,PSC为分频值,代码中写成7200-1,也就是7200分频,ARR为自动重装载值,计数达到此值自动置0,代码中写成10000-1。也就是以10KHz计数频率计数10000次,正好是1s。
实验结果:计数周期为1s,OLED上显示数字变化。