【STM32单片机_(HAL库)】4-1【定时器TIM】定时器中断点灯实验
【摘要】 【STM32单片机_(HAL库)】4-1【定时器TIM】定时器中断点灯实验 介绍在嵌入式系统中,定时器(TIM)是一个非常重要的外设,它可以用于计时、产生PWM信号、输入捕获、输出比较等。本文将探讨如何使用STM32的硬件抽象层(HAL)库,通过定时器中断来控制LED的点亮和熄灭。 应用使用场景周期性事件:例如心跳信号、状态指示灯。精准延时:需要精确的时间控制,例如传感器数据采集。频率测量...
【STM32单片机_(HAL库)】4-1【定时器TIM】定时器中断点灯实验
介绍
在嵌入式系统中,定时器(TIM)是一个非常重要的外设,它可以用于计时、产生PWM信号、输入捕获、输出比较等。本文将探讨如何使用STM32的硬件抽象层(HAL)库,通过定时器中断来控制LED的点亮和熄灭。
应用使用场景
- 周期性事件:例如心跳信号、状态指示灯。
- 精准延时:需要精确的时间控制,例如传感器数据采集。
- 频率测量:利用输入捕获功能测量信号频率。
- PWM控制:例如舵机控制和电机驱动。
原理解释
定时器通过内部时钟源(如APB1或APB2)进行计数。当计数器达到预设值时触发中断,我们可以在中断处理函数中执行特定操作,例如切换LED的状态。
算法原理流程图
算法原理解释
- 初始化GPIO:配置LED所连接的GPIO端口为输出模式。
- 初始化定时器:设置定时器的时基,决定中断触发的频率。
- 启用中断:使能定时器中断,并设置优先级。
- 进入主循环:程序进入主循环,主要处理其他任务。
- 处理中断:当定时器溢出时触发中断,在中断处理函数中完成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。
部署场景
- 硬件准备:
- STM32开发板
- 一颗LED及其限流电阻
- 软件环境:
- STM32CubeMX生成项目框架
- Keil MDK编译代码并下载到开发板
材料链接
总结
通过本次实验,我们了解了如何使用STM32的定时器中断来控制LED的点亮和熄灭。定时器在嵌入式系统中有广泛的应用,可以用于实现各种时序控制任务。
未来展望
随着技术的发展,定时器将会变得更加精确和多功能。未来我们可以探索更多高级应用,如通过DMA实现高效的数据传输、复杂的PWM波形生成等,进一步提升嵌入式系统的性能和功能。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)