使用STM32F103标准库实现定时器控制LED点亮和关闭
在这篇博客中,我们将学习如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。STM32F103系列单片机是一款广泛使用的微控制器,它具备丰富的外设功能,适合于多种嵌入式应用。
1. 硬件准备
- STM32F103开发板
- LED灯
- 电阻(一般使用220欧姆)
- 面包板和连接线
2. 软件准备
- STM32CubeMX
- Keil uVision 或 STM32CubeIDE
3. 使用STM32CubeMX配置工程
- 打开STM32CubeMX,新建一个工程并选择你的STM32F103型号。
- 在“Pinout & Configuration”选项卡中,启用一个定时器(例如TIM2)和一个GPIO引脚(例如PA5)用于连接LED。
- 配置定时器:
- 选择TIM2,设置为“Internal Clock”。
- 设置Prescaler和Counter Period,以实现所需的定时器频率。
- 启用“Update Interrupt”以在定时器溢出时产生中断。
- 配置GPIO:
- 设置PA5为“Output”模式,用于控制LED。
- 生成代码并导出到Keil或STM32CubeIDE。
4. 编写代码
生成的代码文件中,我们主要修改main.c
和stm32f1xx_it.c
文件,以实现定时器中断处理和LED控制。
main.c 文件
#include "main.h"
#include "stm32f1xx_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 SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {
0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {
0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
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_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);
}
static void MX_TIM2_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {
0};
TIM_MasterConfigTypeDef sMasterConfig = {
0};
htim2.Instance = TIM2;
htim2.Init.Prescaler = 7999; // 定时器预分频
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);
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {
0};
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // 切换LED状态
}
}
5. 代码解释
MX_TIM2_Init
:初始化TIM2定时器,设置预分频值和重装载值,以实现所需的定时器频率。这里的设置实现了1秒的定时周期。HAL_TIM_Base_Start_IT
:启动定时器并使能中断。HAL_TIM_PeriodElapsedCallback
:定时器溢出时的回调函数。在这个函数中,我们切换LED的状态(点亮或熄灭)。
6. 编译和烧录
- 将代码编译并烧录到STM32F103开发板上。
- 观察LED每秒点亮和熄灭。
结论
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。
希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。