STM32F103C8T6 hal库灯反转
时间: 2025-05-13 11:50:09 浏览: 16
### 使用STM32F103C8T6 HAL库实现LED灯反转功能
要实现LED灯的反转功能,可以通过设置GPIO引脚的状态来完成。具体来说,在程序运行过程中不断切换GPIO引脚的高低电平状态即可达到反转的效果。
以下是基于STM32F103C8T6 HAL库的一个简单示例代码:
#### 初始化配置
在初始化阶段,需要定义并配置用于驱动LED的GPIO引脚。假设该引脚连接至PA5端口上的LED。
```c
#include "stm32f1xx_hal.h"
// 定义全局变量
uint8_t led_state = 0;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
// 配置系统时钟
HAL_Init();
SystemClock_Config();
// 初始化GPIO
MX_GPIO_Init();
while (1)
{
if (led_state == 0)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 设置高电平点亮LED
led_state = 1;
}
else
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 设置低电平熄灭LED
led_state = 0;
}
HAL_Delay(500); // 延迟时间设定为500ms以便肉眼可见变化
}
}
/**
* @brief 系统时钟配置函数
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6;
RCC_OscInitStruct.PLL.PLLDIV = RCC_PLL_DIV3;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler(); // 错误处理函数
}
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_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
{
Error_Handler(); // 错误处理函数
}
}
/**
* @brief GPIO初始化函数
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟
// 配置PA5作为推挽输出模式
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
```
上述代码实现了通过改变GPIOA第5号引脚(即PA5)的电平状态来控制LED灯的亮灭操作[^1]。每次循环都会更改一次LED的状态,并延迟半秒钟再执行下一轮切换动作。
#### 进一步扩展:使用定时器中断触发翻转逻辑
如果希望更加精确地控制LED灯的闪烁频率或者减少CPU占用率,则可以考虑利用TIMx外设配合中断机制来进行管理。下面是一个简单的例子说明如何借助Timer模块达成这一目标:
修改`MX_TIM2_Init()`方法以及相应回调函数如下所示:
```c
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
static uint8_t toggle_flag = 0 ;
if(htim->Instance == TIM2 ){
if(toggle_flag ==0 ){
HAL_GPIO_WritePin(GPIOA , GPIO_PIN_5 , GPIO_PIN_SET );
toggle_flag =!toggle_flag ;
}else{
HAL_GPIO_WritePin(GPIOA , GPIO_PIN_5 , GPIO_PIN_RESET );
toggle_flag=!toggle_flag ;
}
}
}
```
最后记得启动计数器中断服务例程:`HAL_TIM_Base_Start_IT()`.
阅读全文
相关推荐


















