本节来编写定时器中断的实验代码,使用0.94寸OLED显示实验的效果:

1.在System项目目录下新建Timer.c/.h模块

STM32学习笔记_定时器中断笔记(2)_STM32学习笔记

2.编写Timer_Init函数,对定时器进行初始化配置。

在库函数TIM.h文件中,熟悉定时器初始化的相关函数:

STM32学习笔记_定时器中断笔记(2)_STM32学习笔记_02

编写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开始计数的原因)

STM32学习笔记_定时器中断笔记(2)_STM32学习笔记_03

STM32学习笔记_定时器中断笔记(2)_STM32学习笔记_04

所以,解决办法为,在Timer.c中添加如下语句:

STM32学习笔记_定时器中断笔记(2)_STM32学习笔记_05

最后,附上实验效果:

STM32学习笔记_定时器中断笔记(2)_STM32学习笔记_06