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);
}
}