stm32实现定时器中断
主要代码:
tim.h
#ifndef __TIM_H__
#define __TIM_H__
#include <stm32f10x.h>
// 定义使用的通用定时器和相关配置
#define GENERAL_TIMx TIM2
#define GENERAL_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd
#define GENERAL_TIM_CLK RCC_APB1Periph_TIM2
#define GENERAL_TIM_IRQ TIM2_IRQn
#define GENERAL_TIM_INT_FUN TIM2_IRQHandler
// 函数声明
void GENERAL_TIMx_Configuration(void);
void GENERAL_TIMx_NVIC_Configuration(void);
#endif
tim.c
#include "tim.h"
void GENERAL_TIMx_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// 开启定时器时钟
GENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK, ENABLE);
// 配置定时器中断优先级
GENERAL_TIMx_NVIC_Configuration();
// 设置定时器周期为 999 (1 毫秒)
TIM_TimeBaseStructure.TIM_Period = 999;
// 设置预分频器,预分频值为 71 (1 MHz 的时钟频率)
TIM_TimeBaseStructure.TIM_Prescaler = 71;
// 向上计数模式
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
// 初始化定时器
TIM_TimeBaseInit(GENERAL_TIMx, &TIM_TimeBaseStructure);
// 清除更新中断标志位
TIM_ClearITPendingBit(GENERAL_TIMx, TIM_IT_Update);
// 使能更新中断
TIM_ITConfig(GENERAL_TIMx, TIM_IT_Update, ENABLE);
// 启动定时器
TIM_Cmd(GENERAL_TIMx, ENABLE);
}
void GENERAL_TIMx_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
// 设置中断优先级分组为 0
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
// 设置中断源为 GENERAL_TIM_IRQ
NVIC_InitStructure.NVIC_IRQChannel = GENERAL_TIM_IRQ;
// 设置抢占优先级为 0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
// 设置响应优先级为 3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
// 使能定时器中断
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
main.c
#include "stm32f10x.h"
#include "LED.h"
#include "tim.h"
__IO uint16_t timer_count = 0;
void GENERAL_TIM_INT_FUN(void)
{
if (TIM_GetITStatus(GENERAL_TIMx, TIM_IT_Update) != RESET)
{
// 清除定时器更新中断标志
TIM_ClearITPendingBit(GENERAL_TIMx, TIM_IT_Update);
// 计数器增加
timer_count++;
}
}
int main(void)
{
// 初始化板载 LED 灯
LED_Init();
// 初始化并配置通用定时器,使其每 1 毫秒中断一次
GENERAL_TIMx_Configuration();
// 无限循环
while (1)
{
// 检查计时器计数是否达到 1000 (1000 毫秒)
if (timer_count == 1000)
{
// 重置计时器计数
timer_count = 0;
// 切换 LED 状态
LED1_Turn();
}
}
}
演示视频:
stm32定时器