刀刀网
您的当前位置:首页STM32定时器定时中断(自制时钟)

STM32定时器定时中断(自制时钟)

来源:刀刀网

  STM32定时器定时中断是指利用STM32系列微控制器上的定时器模块来生成周期性的定时中断信号。通过配置定时器的预分频器和自动重载寄存器,可以实现在特定时间间隔内生成中断请求。这种定时器中断可以用于实现精确的时间计量、周期性任务的触发等功能。

接线图和运行结果如下图所示:

编写Timer.c步骤如下:

1.打开RCC时钟

2.设置时基单元的时钟

3.配置时基单元

4.TIM使能中断

5.设置NVIC 

6.启动定时器

源代码如下:

#include "stm32f10x.h"                  // Device header
  
  //要用主函数的num变量就在变量前面声明  
extern uint16_t m;
extern uint16_t h;
extern uint16_t f;
void Timer_Init(void)
{
	//第一步打开RCC时钟  注意TIM2是APB1的外设
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
	//第二步设置时基单元的时钟
	TIM_InternalClockConfig(TIM2);
	
	//第三步配置时基单元
	TIM_TimeBaseInitTypeDef  TimeStructure;
	TimeStructure.TIM_ClockDivision=TIM_CKD_DIV1;//1分频
	TimeStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
	//1S(1HZ)的列子为:ARR=10000 PSC=7000  定时频率:CK_CNT_OV=CK_CNT/(ARR+1)=CK_PSC/(PSC+1)/(ARR+1)
	//CK_PSC=72M    
	TimeStructure.TIM_Period=10000-1;//ARR自动重装器的值 0——65535
	TimeStructure.TIM_Prescaler=7000-1;//PSC就是预分频器的值  0——65535
	TimeStructure.TIM_RepetitionCounter=0;   //重复计数器 高级计数器才有 所以置0
	TIM_TimeBaseInit(TIM2,&TimeStructure);
	
	
	TIM_ClearFlag(TIM2,TIM_IT_Update);//防止每次复位从1开始
	//第四步 TIM使能中断  开启更新中断到NVIC的通路
	TIM_ITConfig(TIM2, TIM_IT_Update,ENABLE);
	
	//第五步设置NVIC 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef  NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;//指定中断通道来开启或关闭 我们用的是STM32F10X_MD的15_10
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//指定的通道是使能还是失能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级 2组的取值是0-3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;//设置响应优先级  2组的取值是0-3
	NVIC_Init(&NVIC_InitStructure);
	
	//第六步启动定时器
	TIM_Cmd(TIM2, ENABLE);
}
//定时器2的中断函数
void  TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
	{
		if(m==60)
		{
			m=0;
			f+=1;
		}
		if(f==60)
		{
			f=0;
			h+=1;
		}
		if(h==24)
		{
			h=0;
		}
		m++;
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}

Timer.h代码如下:

#ifndef __TIMER_H
#define __TIMER_H

void Timer_Init(void);

#endif

Mian.c如下:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"

uint16_t h;
uint16_t f;
uint16_t m;
int main(void)
{
	/*模块初始化*/
	OLED_Init();		//OLED初始化
	Timer_Init();
	/*OLED显示*/
	//以19:36:00秒为例子
	h=19;
	f=36;
	OLED_ShowString(1, 1, "Time:");				//1行1列显示字符A
	while (1)
	{
		OLED_ShowNum(1,7,h,2);
		OLED_ShowChar(1,9,':');
		OLED_ShowNum(1,10,f,2);
		OLED_ShowChar(1,12,':');
		OLED_ShowNum(1,13,m,2);
	}
}

因篇幅问题不能全部显示,请点此查看更多更全内容