STM32定时器中断

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定时器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值