前置知识
流程图![](https://img-blog.csdnimg.cn/7f6f7f97b7344483bd945436c0d82e08.png)
定时器溢出频率公式
内部时钟PSC为72MHz
主要用到的库函数
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能定时器2的时钟
TIM_InternalClockConfig(TIM2);//选择定时器为内部时钟模式
/*
选择模式的函数有
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
uint16_t TIM_ICPolarity, uint16_t ICFilter);
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
对应流程图的几个模式
*/
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);//初始化时基单元
TIM_ClearFlag(TIM2,TIM_FLAG_Update);
/*
在函数TIM_TimeBaseInit()中的最后一句代码
TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter;
会让单片机上机后立刻进入一次中断,所以用这句代码清除中断标志位
*/
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能中断,更新中断到NVIC的通道
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置抢占优先级
NVIC_Init(&NVIC_InitStruct);
TIM_Cmd(TIM2,ENABLE);//开启定时器
void TIM2_IRQHandler();//中断函数
主要代码
main.c
int main(void)
{
OLED_Init();
Timer2_Init();
while (1)
{
OLED_ShowString(1, 1, "Num:");
OLED_ShowNum(1,5,num,5);
}
}
void TIM2_IRQHandler()//在Start文件中的startup文件可以找到中断函数名
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update))
{
num++;
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除标志位
}
}
Timer2_Init.c
void Timer2_Init()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision= TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode= TIM_CounterMode_Up ;
TIM_TimeBaseInitStruct.TIM_Period =10000-1;
TIM_TimeBaseInitStruct.TIM_Prescaler=7200-1 ;
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_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn ;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE ;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2 ;
NVIC_InitStruct.NVIC_IRQChannelSubPriority= 1;
NVIC_Init(&NVIC_InitStruct);
TIM_Cmd(TIM2,ENABLE);
}