当前位置: 首页 > web >正文

STM32基本定时器的启动和停止

文章目录

    • 需求背景
    • 实现目标
    • 核心代码实现
    • 实现效果

需求背景

在报警提示中,经常需要通过LED灯闪烁来提示报警,但是又需要人工解除报警,即取消LED灯闪烁。

在这个需求背景下,实现路径有两种:

  1. 轮询方式实现(简单但占用CPU)
  2. 中断方式实现(推荐,高效)

我们选择高效的中断方式实现,也便于和业务解耦。

实现目标

我们最终使用STM32F407ZGT6,选择基本定时器TIM6,用定时器的更新中断实现LED灯的闪烁,关闭定时器结束LED灯的闪烁。启动时,默认处于报警状态,即LED灯闪烁,可以通过按键Key0,解除报警,即关闭LED灯闪烁,通过按键Key1可以再次触发报警,即再次LED灯闪烁。

核心代码实现

//btim.h
#ifndef __BTIM_H
#define __BTIM_H#include "./SYSTEM/sys/sys.h"void btim_timx_int_init(uint16_t arr, uint16_t psc);
void clear_timx(TIM_HandleTypeDef *htim);#endif
//btim.c
#include "./BSP/TIMER/btim.h"
#include "./BSP/LED/led.h"TIM_HandleTypeDef g_timx_handle;/* 定时器中断初始化函数 */
void btim_timx_int_init(uint16_t arr, uint16_t psc)
{g_timx_handle.Instance = TIM6;                          /* 定时器6寄存器基地址 */g_timx_handle.Init.Prescaler = psc;                     /* 分频系数 */g_timx_handle.Init.Period = arr;                        /* 自动重装载值 */HAL_TIM_Base_Init(&g_timx_handle);HAL_TIM_Base_Start_IT(&g_timx_handle);                  /* 使能定时器和定时器更新中断并启动计数器 */
}/* 定时器基础MSP初始化函数,在HAL_TIM_Base_Start_IT中会被调用 */void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM6){__HAL_RCC_TIM6_CLK_ENABLE();                /* 开启定时器6时钟 */HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 1, 3);  /* 设置中断优先级,抢占优先级1,响应优先级3 */HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);          /* 开启中断使能,中断号IRQn */}
}/* 定时器6中断服务函数 */
void TIM6_DAC_IRQHandler(void)
{HAL_TIM_IRQHandler(&g_timx_handle);
}/* 定时器溢出中断中断回调函数 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM6){LED0_TOGGLE();}
}/* 关闭定时器 */
void clear_timx(TIM_HandleTypeDef *htim)
{HAL_TIM_Base_Stop_IT(htim);
}/* 在HAL_TIM_Base_Stop_IT中被调用 */
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM6){__HAL_RCC_TIM6_CLK_DISABLE();HAL_NVIC_DisableIRQ(TIM6_DAC_IRQn);}
}

实现效果

STM32按键实现启动和关闭定时器

http://www.xdnf.cn/news/8455.html

相关文章:

  • 多维数据助力企业网络安全
  • questions and answers_1
  • GitHub 趋势日报 (2025年05月22日)
  • Gemini 2.5 Pro 一次测试
  • 高项公式英文解析记忆
  • 大模型量化与双重量化(2)-- 代码示例与解释
  • Neo4j入门第二期(Spring Data Neo4j的使用)
  • Oracle 的 MOVE 操作是否重建表?
  • 【学习笔记】Sophus (Python) 使用文档
  • C#调用第三方C++版本SDK过程
  • windows bat 在目录下(包括子目录)搜索批量指定文件名称复制到另一个文件夹内
  • ES6 新增 API 方法
  • ​​3D 几何建模工具库​Open CASCADE(OCCT)简单介绍。
  • 如何评估物联网框架的交互体验?
  • springboot SnailJob client(客户端) 启动失败
  • 机器学习与深度学习:区别与联系
  • 【数据集】全球首个10米分辨率精细分类土地覆盖数据集GLC_FCS10
  • 鸿蒙ArkTS-发请求第三方接口显示实时新闻列表页面
  • 带您了解工业级网络变压器的浪涌等级测试有哪些条件?
  • mysql底层数据结构
  • 怎么判断一个Android APP使用了React Native 这个跨端框架
  • 【Golang】部分语法格式和规则
  • matlab时间反转镜算法
  • 2025年电工杯A题第一版本Q1-Q4详细思路求解+代码运行
  • day24Node-node的Web框架Express
  • C# Windows Forms应用程序-001
  • 国产矢量网络分析仪怎么样?能用在哪里?
  • 打破传统范式,线上 3D 画展彰显多元亮点
  • C语言---动态内存管理、柔性数组
  • unity控制相机围绕物体旋转移动