定时器编程,就是中断的编程。因为使用定时器必定要使用到中断。
步骤一:RCC_Configuration();//设置系统时钟,包括时钟RCC的配置,倍频到72MHZ。
步骤二:GPIO的配置,使用函数为GPIO_cfg();,该函数的实现如下:
voidGPIO_cfg()
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;//选择引脚6
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//输出频率最大50MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//带上拉电阻输出
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
实际上定时器的讲解,不需要配置GPIO的引脚,只是我们在定时器实验中,
使用每隔一秒点亮一次LED灯来做实验,所以需要配置对应GPIO的引脚。
步骤三:嵌套中断控制器的配置,我们照样使用函数NVIC_Config();只是初始化的过程略有不同。这里我们也把函数实现列出来:
从以上函数实现来看,实际上只是改动了结构体成员NVIC_IRQChannel的值,现在需要的通道是TIM2的通道,因此初始化值为TIM2_IRQChannel。从这里也可以看出,这个函数实际上可以看做一个模型,可以拿去别的程序中改动后直接使用。
voidNVIC_cfg()
{
NVIC_InitTypeDefNVIC_InitStructure;
//选择中断分组1
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//选择TIM2的中断通道
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQChannel;
//抢占式中断优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
//响应式中断优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
//使能中断
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
步骤四:定时器的初始化配置,使用Timer_Config();。OK,关键部分出来了。
我们来看下实现过程:
TIMER_cfg();//定时器的配置
//开启定时器2
TIM_Cmd(TIM2,ENABLE);
voidTimer_Config(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_DeInit(TIM2);
TIM_TimeBaseStructure.TIM_Period=2000-1;//自动重装载寄存器的值
TIM_TimeBaseStructure.TIM_Prescaler=(36000-1);//时钟预分频数
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//采样分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除溢出中断标志
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM2,ENABLE);/开启时钟