本节来编写定时器中断的实验代码,使用0.94寸OLED显示实验的效果:
1.在System项目目录下新建Timer.c/.h模块
2.编写Timer_Init函数,对定时器进行初始化配置。
在库函数TIM.h文件中,熟悉定时器初始化的相关函数:
编写void Timer_Init(void)定时器初始化函数如下:
void Timer_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启时钟 TIM2是APB1总线上的外设
TIM_InternalClockConfig(TIM2); //选择时基单元的时钟
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //配置时基单元——定义结构体
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //配置时基单元——结构体参数:时钟分频
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //配置时基单元——结构体参数:计数器模式
TIM_TimeBaseInitStructure.TIM_Period = 10000-1; //周期:ARR
TIM_TimeBaseInitStructure.TIM_Prescaler = 7200-1; //PSC预分频器
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //重复计数器的值
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure); //配置时基单元
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //开启使能,更新中断
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //NVIC优先级分组
NVIC_InitTypeDef NVIC_InitStructure; //NVIC初始化参数的结构体
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); //NVIC初始化
TIM_Cmd(TIM2,ENABLE); //启动定时器
}
3.编写中断函数: 以上就完成了定时中断的初始化代码,接下来编写中断函数:
以下函数实现了变量Num++,可以用OLED来查看中断实验效果
void TIM2_IRQHandler(void) //TIM2的中断函数,这个函数名在启动文件startup_stm32f10x_md.s中查找
{
if (TIM_GetITStatus(TIM2,TIM_IT_Update) == SET) //获取中断标志位,如果更新中断为SET,则执行函数内语句
{
Num++; //每调用一次中断,Num++;
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中断标志位
}
}
4.编写主函数,添加OLED_Init();、Timer_Init(); 调用OLED来显示中断函数中Num变量的自增变化:
uint16_t Num = 0; //添加变量Num
int main(void)
{
OLED_Init(); //OLED初始化
Timer_Init(); //定时器初始化
OLED_ShowString(1, 1, "Num:"); //OLED显示字符
while(1)
{
OLED_ShowNum(1, 5, Num, 5); //1行,5列,显示变量num,显示长度“5”
OLED_ShowNum(2, 2, TIM_GetCounter(TIM2), 5); //获取计数器的值
}
}
5.编译代码。 实际查看效果发现,代码复位后从1开始计数,具体原因在TIM_TimeBaseInit函数的说明中有解释:(在初始化时基设置后,会手动置一个更新事件来使预分频器的值有效,更新事件同时会产生一个更新中断,一旦初始化完成立刻就会进中断,这就是上电后看到中断从1开始计数的原因)
所以,解决办法为,在Timer.c中添加如下语句:
最后,附上实验效果: