备战蓝桥杯之嵌入式——TIM

这次是定时器实验,实验功能是利用定时器中断使LED每隔500ms进行闪烁。

首先要理解这条公式:

Tout(溢出时间)=(ARR+1)(PSC+1)/Tclk

然后还要理解定时器的时钟:

除非APB1的分频系数是1,否则通用定时器的时钟等于APB1时钟的2倍。

默认调用SystemInit函数情况下:

SYSCLK=72M

AHB时钟=72M

APB1时钟=36M

所以APB1的分频系数=AHB/APB1时钟=2

所以,通用定时器时钟CK_INT=2*36M=72M

最后给出配置定时器的步骤:

1:使能定时器时钟;

2:配置定时器初始化;

3:使能定时器中断;

4:配置中断;

5:使能定时器;

贴出timer.c中的程序:

#include "timer.h"

void TIMER_Init(u16 arr,u16 psc)

{

         TIM_TimeBaseInitTypeDefTIM_TimeBaseInitStructure;

         NVIC_InitTypeDefNVIC_InitStructure;

        

         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

        

         TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;

         TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;

         TIM_TimeBaseInitStructure.TIM_Period=arr;

         TIM_TimeBaseInitStructure.TIM_Prescaler=psc;

         TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);

        

         TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

        

        

        

         NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;

         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;

         NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;

         NVIC_Init(&NVIC_InitStructure);

        

         TIM_Cmd(TIM2,ENABLE);

}

void TIM2_IRQHandler(void)

{

         if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET) GPIO_WriteBit(GPIOA,GPIO_Pin_8,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8)));

         TIM_ClearITPendingBit(TIM2,TIM_IT_Update);

}

你可能感兴趣的:(嵌入式)