登录/注册

stm32定时器中断实现流水灯

stm32定时器中断实现流水灯

更多

以下是使用STM32定时器中断实现流水灯的详细步骤和代码示例(基于STM32标准外设库):

硬件连接

实现思路

  1. 配置GPIO为推挽输出
  2. 配置TIM2定时器(1秒中断一次)
  3. 实现TIM2中断服务函数控制LED流水效果
  4. 启用中断和定时器

代码实现

#include "stm32f10x.h"

// LED引脚定义 (PA0~PA7)
#define LED_PINS  (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | \
                   GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7)

volatile uint8_t current_led = 0; // 当前LED位置

void GPIO_Config(void) {
    GPIO_InitTypeDef GPIO_InitStructure;

    // 开启GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 配置PA0~PA7为推挽输出
    GPIO_InitStructure.GPIO_Pin = LED_PINS;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 初始状态:关闭所有LED
    GPIOA->ODR &= ~LED_PINS;
}

void TIM2_Config(void) {
    TIM_TimeBaseInitTypeDef TIM_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    // 1. 开启TIM2时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    // 2. 配置定时器基础参数
    TIM_InitStructure.TIM_Period = 1000 - 1;       // 自动重装载值
    TIM_InitStructure.TIM_Prescaler = 7200 - 1;    // 预分频值
    TIM_InitStructure.TIM_ClockDivision = 0;
    TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_InitStructure);

    // 3. 使能TIM2更新中断
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

    // 4. 配置NVIC
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    // 5. 启动定时器
    TIM_Cmd(TIM2, ENABLE);
}

int main(void) {
    // 初始化系统时钟(默认使用内部8MHz RC)
    SystemInit();

    GPIO_Config();      // 配置GPIO
    TIM2_Config();      // 配置定时器

    // 初始化第一个LED
    GPIO_SetBits(GPIOA, GPIO_Pin_0);
    current_led = 0;

    while(1) {
        // 主循环不执行任务,所有操作在中断中完成
    }
}

// TIM2中断服务函数
void TIM2_IRQHandler(void) {
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  // 清除中断标志

        // 关闭当前LED
        GPIO_ResetBits(GPIOA, (uint16_t)(1 << current_led));

        // 移动到下一个LED(0-7循环)
        current_led = (current_led + 1) % 8;

        // 点亮新LED
        GPIO_SetBits(GPIOA, (uint16_t)(1 << current_led));
    }
}

关键配置说明

  1. 定时器参数计算

    • 系统时钟:72MHz(APB1时钟为36MHz,但TIM2挂载在APB1上)
    • 预分频值:7200 → 分频后频率:72MHz / 7200 = 10kHz
    • 自动重装载值:1000 → 中断周期:1000 / 10kHz = 0.1秒
    • 实际效果:LED每0.1秒移动一次
  2. 修改流水速度

    • 加快:减小TIM_Period
    • 减慢:增大TIM_Period
    • 例:改为1秒中断 → TIM_Period = 10000 - 1

硬件修改建议

调试技巧

  1. 若LED不亮:
    • 检查硬件连接(LED方向、限流电阻)
    • 用万用表测量GPIO输出电平
  2. 若流水灯不切换:
    • 检查中断是否进入(在中断内设置断点)
    • 确认定时器配置是否正确

注意:工程中需要包含标准外设库文件(如stm32f10x_tim.h等),具体实现可能因开发板型号略有差异。

51单片机定时器定时1秒程序流水灯结果分析

流水灯的设计原理、实现步骤和结果分析。 一、设计原理 在51单片机中,定时器常用的工作方式有两种:

2023-12-26 14:57:57

定时器中断是什么意思,定时器中断的工作原理

定时器中断是由单片机中的定时器溢出而申请的中断。51单片机中有两个

2023-07-23 09:45:48

STM32定时器中断应用实例

本文将介绍:通过STM32cube mx配置工程文件,实现定时器中断的功

2023-04-21 11:36:46

STM32定时器中断显示时间

前言利用STM32的定时器中断,实现时间的显示。我们知道利用

资料下载 訾存贵 2021-12-24 18:56:06

STM32CubeMX_定时器中断_PWM

文章目录前言STM32CubeMX新建工程基本定时器配置生成代码定时器中断

资料下载 佚名 2021-12-05 13:51:04

AT89C52流水灯+外部中断INT0+定时器(汇编语言)

AT89C52流水灯+外部中断INT0+定时器(汇编语言)任务要求用 AT89S52 单片机控制彩灯(

资料下载 佚名 2021-11-23 17:06:45

51单片机实验——用定时器0实现流水灯,要求每个led轮流显示1s。

用定时器0实现流水灯,要求每个led轮流显示1s。

资料下载 旧念 2021-11-23 16:36:10

使用51单片机定时器控制流水灯的程序免费下载

本文档的主要内容详细介绍的是使用51单片机定时器控制流水灯的程序免费下载。

资料下载 佚名 2020-09-15 18:20:33

STM32定时器的分类及中断原理

本文主要介绍常规定时器中的TIM3,实现定时器中断的功能。

2023-01-12 17:29:17

定时器中断实现stm32定时

前言之前的流水灯实验中用到了延时函数,当时用的是SysTick也就是系统滴答时钟定时的。这一章我们用定时器

2022-01-06 06:46:34

如何通过TIM2定时器中断控制LED流水灯的闪烁?

如何通过TIM2定时器中断控制LED流水灯的闪烁?

2021-11-16 08:49:25

使用中断实现流水灯

学习单片机都要学习流水灯,因为流水灯比较简单,易于实现,效果也比较好呈现。上个博客是按键

2021-08-13 08:38:38

通过TIM2定时器中断控制LED流水灯的闪烁时间

一、实验说明本次实验建立在上两次实验上,稍加修改,通过TIM2定时器中断控制LED流水灯的闪烁时间,并且增加两个按键PA1、PA2,其中PA1控

2021-08-13 06:03:41

定时器模拟PWM实现流水灯

本帖最后由 周小树 于 2020-12-18 16:50 编辑 1、使用ARM7的定时器,实现流水灯(不使用软件延时),同时如何在不改变P

2020-12-15 15:38:32

stm32定时器中断与误区

在用到STM32定时器的更新中断时,发现有些情形下只要开启定时器就立即进

2019-06-17 15:48:20

7天热门专题 换一换
相关标签