最详细STM32,cubeMX 定时器

这篇文章将详细介绍 STM32,cubeMX 定时器的配置和使用。


前言

  • 实验开发板:STM32F103C8T6。
  • 所需软件:keil5 , cubeMX 。
  • 实验目的:了解 cubeMX 定时器 的配置和使用。
  • 实验:使用定时器控制 led 闪烁。

一、定时器基础知识

STM32的定时器是用于时间测量和事件生成的复杂工具。可以使用内部或外部时钟源。时钟源和分频设置将决定定时器计数的速度。

定时器可以配置为在特定事件(如溢出或匹配特定值)上触发中断。这使得它能够周期性地执行代码片段,例如读取传感器数据或刷新显示。

定时器的主要组件:

  • 计数器:定时器的核心部分,可以配置向上/向下 计数。
  • 预分频器:分频定时器的输入时钟改变计数器的计数速率。如果时钟速度是72MHz,并使用预分频值为7199,那么计数器的计数速度将是10kHz。(72MHz / 7199)
  • 自动重载寄存器(ARR, Auto-reload register):定义了计数器重置的值。

二、cubeMX 配置

  1. 选择芯片。
    在这里插入图片描述

  2. 配置仿真。
    在这里插入图片描述

  3. 配置时钟,选择 HSE, 高速时钟。
    在这里插入图片描述

  4. 配置时钟树。选择最大 72 MHZ, 然后双击 enter 即可。系统会自动配置最合适的时钟。
    在这里插入图片描述

  5. 设置工程名,路径和工具链。
    在这里插入图片描述

  6. 自动生成 .c / .h 文件。
    在这里插入图片描述

  7. 将 led 引脚设置输出。
    在这里插入图片描述

  8. 让 led 引脚默认输出高电平。因为 根据实际电路当引脚是低电平时,led 点亮。
    在这里插入图片描述

  9. 这里我使用 定时器2 , 并使用 内部时钟源。
    在这里插入图片描述

  10. 使能定时器中断。
    在这里插入图片描述

  11. 设置 定时器参数(分频系数,向上计数,自动重装载值)。
    在这里插入图片描述

  12. 创建工程。
    在这里插入图片描述

三、定时时长

定时时长 = (计数器自动重载值 + 1 )*( 分频系数 + 1 )/ 定时器时钟频率

(为什么重装载值和分频系数不置为整数? 原因:精越定时)

这里 我想要设置 定时时长为 1ms ,那么首先设置相关参数:

  • 定时器时钟频率 : 72 MHZ。
  • 分频系数 (PSC): 选择 72 分频。
  • 计数器自动重载值(ARR):可控制定时器的定时时间,改变定时时长。

因为 分频系数 / 定时器时钟频率 = 计数器的计数速率, 所以 72 / 72MHZ = 1us 。则每 1 us 计数一次。当计数到 1000 (ARR) 时, 发生定时器的溢出中断. 即 ARR 从 0 增加到 1000 ,每 1 us 增加一次,则 定时时长为 1000 * 1 us = 1 ms .
在这里插入图片描述

四、自动生成代码讲解

自动生成的 定时器的代码在 tim.c 文件中。

  1. 首先还是 先定义一个 定时器对象,这是一个结构体。
  2. 初始化这个结构体中的相关参数。
  3. 调用 HAL_TIM_Base_Init(&htim2) 对其初始化。
  4. 之后自动调转到HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) 执行。
    5. __HAL_RCC_TIM2_CLK_ENABLE( ); 开启定时器 2
  5. HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); 设置优先级
    HAL_NVIC_EnableIRQ(TIM2_IRQn); 使能中断
    在这里插入图片描述
    在这里插入图片描述

五、实验程序

开启定时器中断:

HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);

定时器中断回调函数:

/* 发生定时器中断后调用定时器中断回调函数 */

HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);

定时器控制 led 闪烁:

static int i=0;


/* 根据cubeMX 配置的参数确定多久触发定时器中断,这里 是每 1 ms 触发一次中断即调用该函数 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim == &htim2)
	{
		if(++i == 1000)					// 当 i 加到 1000 时,则时间到达 1 s, 翻转 led 电平
		{
			i=0;
			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_4);
		}
	}
}

总结

下篇文章为大家介绍 串口 的相关知识。

首先你需要在STM32CubeMX中配置定时器和按键的GPIO口,然后生成代码。 在生成的代码中,你需要找到定时器的中断处理函数,在其中编写控制LED闪烁的代码。具体地,可以设置一个变量来记录LED的闪烁速度,然后在定时器中断处理函数中根据按键状态更新这个变量的值,从而改变LED的闪烁速度。 以下是示例代码: ```c /* 定义三个LED的GPIO口 */ #define LED1_Pin GPIO_PIN_0 #define LED1_GPIO_Port GPIOA #define LED2_Pin GPIO_PIN_1 #define LED2_GPIO_Port GPIOA #define LED3_Pin GPIO_PIN_2 #define LED3_GPIO_Port GPIOA /* 定义三个按键的GPIO口 */ #define KEY1_Pin GPIO_PIN_3 #define KEY1_GPIO_Port GPIOB #define KEY1_EXTI_IRQn EXTI3_IRQn #define KEY2_Pin GPIO_PIN_4 #define KEY2_GPIO_Port GPIOB #define KEY2_EXTI_IRQn EXTI4_IRQn #define KEY3_Pin GPIO_PIN_5 #define KEY3_GPIO_Port GPIOB #define KEY3_EXTI_IRQn EXTI9_5_IRQn /* 定义LED闪烁速度变量和按键状态变量 */ uint32_t blink_speed = 1000; // 初始闪烁速度为1s uint8_t key1_pressed = 0; uint8_t key2_pressed = 0; uint8_t key3_pressed = 0; /* 定时器中断处理函数 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) // 如果是定时器2的中断 { static uint32_t cnt = 0; /* 每到闪烁速度的倍数时,翻转LED的状态 */ if (++cnt >= blink_speed) { cnt = 0; HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); } /* 检测按键状态并更新闪烁速度变量 */ if (key1_pressed) { blink_speed = 1000; // 闪烁速度为1s } else if (key2_pressed) { blink_speed = 500; // 闪烁速度为0.5s } else if (key3_pressed) { blink_speed = 250; // 闪烁速度为0.25s } } } /* 按键中断处理函数 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == KEY1_Pin) // 如果是按键1的中断 { key1_pressed = 1; key2_pressed = 0; key3_pressed = 0; } else if (GPIO_Pin == KEY2_Pin) // 如果是按键2的中断 { key1_pressed = 0; key2_pressed = 1; key3_pressed = 0; } else if (GPIO_Pin == KEY3_Pin) // 如果是按键3的中断 { key1_pressed = 0; key2_pressed = 0; key3_pressed = 1; } } ``` 在这个示例代码中,我们使用了定时器2和三个按键来控制三个LED的闪烁速度。当按下不同的按键时,闪烁速度变量会被更新,从而改变LED的闪烁速度。在定时器中断处理函数中,我们使用一个计数器来记录时间,并在到达闪烁速度的倍数时翻转LED的状态。需要注意的是,这里使用了静态变量来存储计数器的值,因为定时器中断处理函数会被不停地调用,每次调用都会重新定义一个局部变量,而无法记录上一次的计数器值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

糖果罐子♡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值