定时器例程(Hal库配置)

本文介绍如何使用STM32H746VIT6开发板实现1秒周期的流水灯闪烁效果。主要内容包括硬件环境准备、软件配置步骤,如RCC时钟设置、定时器及中断配置等,并提供了关键代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境准备

硬件:基于stm32H746VIT6的开发板
软件:STM32CubeMX、Keil v5.35.0.0

测试需求

周期为1s的流水灯闪烁

工程配置

测试

1、RCC时钟启用外部晶振

测试

2、时钟树配置

测试

3、定时器配置

在“Timer->TIM1”中,启用内部时钟。
(参数配置需注意图示)

测试

4、中断NVIC配置

选取"TIM1 update interrupt"

测试

5、流水灯输出配置

测试

逻辑代码

1、时钟启动指令

测试

2、定位时钟1的溢出中断
2.1 在stm32h7xx_it中寻找Tim1中断

测试

2.2 查看定义HAL_TIM_IRQHandler

测试

2.3 在HAL_TIM_IRQHandler中存在溢出中断

测试

2.4 确定回调函数(存在weak)

测试

3、在main.c中重写中断回调函数

测试

工程代码Demo_Timer.rar
(访问密码:1666)

### STM32 HAL 定时器配置教程 #### 1. 定时器特性概述 STM32 的定时器是一种多功能模块,广泛应用于时间测量、脉冲宽度调制 (PWM) 和输入捕获等功能。基础定时器具有以下特点[^1]: - 提供高精度的时间基准。 - 支持多种工作模式,如向上计数、向下计数和中心对齐模式。 #### 2. 基础定时器的结构和功能 ##### 2.1 基本特征 基础定时器由多个寄存器组成,主要包括控制寄存器、状态寄存器以及自动重装载寄存器等。这些寄存器用于定义定时器的行为及其触发条件。 ##### 2.2 基础定时器相关寄存器 以下是几个重要的寄存器描述: - **TIMx_CR1**: 控制定时器的主要操作模式。 - **TIMx_ARR**: 设置自动重载值,决定定时周期。 - **TIMx_PSC**: 预分频器寄存器,用于调整计数频率。 ##### 2.3 工作流程 定时器的工作过程可以分为以下几个阶段: 1. 开启定时器时钟。 2. 初始化定时器参数,包括预分频系数 (`PSC`) 和自动重装值 (`ARR`)[^2]。 3. 启动定时器并使能相应的中断源。 4. 编写中断服务函数以响应事件。 #### 3. HAL驱动程序中的定时器配置 ##### 3.1 定时器两种定时模式 HAL支持两种基本的定时模式: - 自由运行模式:计数值不断累加直到溢出。 - 更新事件模式:当计数值达到设定的最大值时发生更新事件。 ##### 3.2 主要函数说明 ###### (1)通用HAL驱动函数 使用 `HAL_TIM_Base_Init()` 函数完成定时器的基础初始化设置。此函数会根据用户指定的参数填充 TIM_HandleTypeDef 结构体成员变量[^2]。 ###### (2)启动和停止定时器的方式 可以通过以下方法管理定时器的状态: - 调用 `HAL_TIM_Base_Start_IT(&htim)` 来启用带有中断请求的定时器。 - 使用 `HAL_TIM_Base_Stop_IT(&htim)` 中断关闭定时器的功能。 ##### 3.3 中断处理机制 为了高效地捕捉到特定条件下产生的信号变化,在实际应用中通常需要注册自定义回调函数替代默认版本。例如修改 `HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)` 方法实现个性化的逻辑处理。 #### 4. 示例代码展示 下面给出一段简单的示例代码演示如何利用 HAL 创建一个基于定时器的延时功能: ```c #include "stm32f4xx_hal.h" // 定义全局句柄对象 TIM_HandleTypeDef htim; void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); // 初始化定时器 __HAL_RCC_TIM2_CLK_ENABLE(); htim.Instance = TIM2; htim.Init.Prescaler = 8399; // 设定预分频值为8399,则每毫秒增加一次 htim.Init.CounterMode = TIM_COUNTERMODE_UP; htim.Init.Period = 999; // 计数至999即产生中断(约等于一秒) htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if(HAL_TIM_Base_Init(&htim)!= HAL_OK){while(1);} // 启动定时器并允许其中断 HAL_TIM_Base_Start_IT(&htim); while (1){} } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ if(htim->Instance==TIM2){ // 执行某些动作... } } ``` 上述代码片段展示了如何通过 HAL API 对 TIM2 进行初始化,并设置了每隔一秒钟触发一次中断的服务例程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫中眸zc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值