基于STM32CubeMx基本定时器实现每秒翻转一次LED的亮灭

通过STM32CubeMx设置STM32F103ZET6的基本定时器,计算预分配系数和自动重装载值以达到1s溢出时间,配置中断并设置优先级,然后在代码中初始化定时器,启用中断,并编写中断回调函数来翻转LED状态,从而实现LED每秒亮灭一次的功能。

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

STM32CubeMx设定

基本定时器配置

本次使用单片机为STM32F103ZET6,打开STM32CubeMx,跳转到定时器界面:
在这里插入图片描述
找到基本定时器并将其激活,可以将鼠标悬停在选项上查看属于什么定时器,或者打开相应的技术手册查看,这里需要设置定时器更新中断时间,可根据一下公式计算:
Tout= ((arr+1)*(psc+1))/Tclk,这里的参数对应:Tout为溢出时间,arr为自动重装载值,psc为预分配系数以及Tclk为输入时钟频率,其中arr、psc以及Tclk可以在STM32CubeMx中查看并设置,最终计算出Tout,这里设置时间为1s,根据公式首先会先带入psc,我们设置psc为72-1,Tclk为72M,就可以算出arr为10000-1,即下图:
在这里插入图片描述
输入时钟频率我们可以在系统时钟树配置中查看:
在这里插入图片描述

基本定时器中断设置

打开基本定时器中断并进行配置抢占优先级和响应优先级
在这里插入图片描述
可根据自身需求设置,这里设置为0,0。

工程生成及代码编写

工程生成

生成工程后我们可以看到左边已经有了相关的代码:
在这里插入图片描述
在用到基本定时器中断有以下几个比较重要的函数:

void MX_TIM6_Init(void);										//基本定时器6初始化及配置
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle);	//相关时钟使能及NVIC中断配置
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);//使能更新中断函数
void TIM6_IRQHandler(void);										//定时器6中断处理服务函数
void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim);				//HAL库定时器公共服务处理函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);	//定时器溢出中断回调函数

接下来就是如何使用这些函数:

定时器6初始化及配置

打开tim.c文件即可查看到初始化相关函数:
在这里插入图片描述我们在STM32CubeMx中的配置,在keil中已经一键生成了代码,需要做的就是加入使能更新中断函数:

HAL_TIM_Base_Start_IT(&htim6);		//配置的基本定时器为定时器6

中断回调函数编写

使能了定时器中断后,下一步就是编写中断回调函数,功能比较简单,就是翻转IO口的电平即可控制灯的亮灭:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
}

这里的参数参考板子上相关控制LED灯的IO口即可。

main函数

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM6_Init();
  /* USER CODE BEGIN 2 */
 
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

这里的main函数我们不需要编写,STM32CubeMx已经帮我们生成好了,至此,我们所需要实现的通过基本定时器实现每秒翻转一次LED的亮灭功能已经实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

葛叶灬

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

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

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

打赏作者

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

抵扣说明:

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

余额充值