【STM32单片机_(HAL库)】4-1【定时器TIM】定时器中断点灯实验

举报
鱼弦 发表于 2024/10/01 11:12:35 2024/10/01
【摘要】 【STM32单片机_(HAL库)】4-1【定时器TIM】定时器中断点灯实验 介绍在嵌入式系统中,定时器(TIM)是一个非常重要的外设,它可以用于计时、产生PWM信号、输入捕获、输出比较等。本文将探讨如何使用STM32的硬件抽象层(HAL)库,通过定时器中断来控制LED的点亮和熄灭。 应用使用场景周期性事件:例如心跳信号、状态指示灯。精准延时:需要精确的时间控制,例如传感器数据采集。频率测量...

【STM32单片机_(HAL库)】4-1【定时器TIM】定时器中断点灯实验

介绍

在嵌入式系统中,定时器(TIM)是一个非常重要的外设,它可以用于计时、产生PWM信号、输入捕获、输出比较等。本文将探讨如何使用STM32的硬件抽象层(HAL)库,通过定时器中断来控制LED的点亮和熄灭。

应用使用场景

  • 周期性事件:例如心跳信号、状态指示灯。
  • 精准延时:需要精确的时间控制,例如传感器数据采集。
  • 频率测量:利用输入捕获功能测量信号频率。
  • PWM控制:例如舵机控制和电机驱动。

原理解释

定时器通过内部时钟源(如APB1或APB2)进行计数。当计数器达到预设值时触发中断,我们可以在中断处理函数中执行特定操作,例如切换LED的状态。

算法原理流程图

开始
初始化LED GPIO
初始化定时器 TIM
启用定时器中断
进入主循环
等待中断发生
中断处理函数
切换LED状态

算法原理解释

  1. 初始化GPIO:配置LED所连接的GPIO端口为输出模式。
  2. 初始化定时器:设置定时器的时基,决定中断触发的频率。
  3. 启用中断:使能定时器中断,并设置优先级。
  4. 进入主循环:程序进入主循环,主要处理其他任务。
  5. 处理中断:当定时器溢出时触发中断,在中断处理函数中完成LED状态的切换。

实际详细应用代码示例实现

初始化及主函数

#include "stm32f4xx_hal.h"

TIM_HandleTypeDef htim2;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM2_Init();

  HAL_TIM_Base_Start_IT(&htim2);

  while (1)
  {
    // 主循环
  }
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if (htim->Instance == TIM2)
  {
    HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12); // 切换LED状态
  }
}

时钟及GPIO初始化

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 8;
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 7;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK |
                                RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
}

static void MX_GPIO_Init(void)
{
  __HAL_RCC_GPIOD_CLK_ENABLE();
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  GPIO_InitStruct.Pin = GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}

static void MX_TIM2_Init(void)
{
  __HAL_RCC_TIM2_CLK_ENABLE();
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 8399;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 9999;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  HAL_TIM_Base_Init(&htim2);

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig);

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);
}

测试代码

测试代码与应用代码基本一致,因为我们主要测试定时器中断是否能够正确点亮和熄灭LED。

部署场景

  1. 硬件准备
    • STM32开发板
    • 一颗LED及其限流电阻
  2. 软件环境
    • STM32CubeMX生成项目框架
    • Keil MDK编译代码并下载到开发板

材料链接

总结

通过本次实验,我们了解了如何使用STM32的定时器中断来控制LED的点亮和熄灭。定时器在嵌入式系统中有广泛的应用,可以用于实现各种时序控制任务。

未来展望

随着技术的发展,定时器将会变得更加精确和多功能。未来我们可以探索更多高级应用,如通过DMA实现高效的数据传输、复杂的PWM波形生成等,进一步提升嵌入式系统的性能和功能。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。