//单片机头文件 //硬件驱动 #include "led.h" LED_INFO led_info = {0}; /* ************************************************************ * 函数名称: Led_Init * * 函数功能: 蜂鸣器初始化 * * 入口参数: 无 * * 返回参数: 无 * * 说明: ************************************************************ */ void Led_Init(void) { GPIO_InitTypeDef gpio_initstruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //打开GPIOA的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); gpio_initstruct.GPIO_Mode = GPIO_Mode_Out_PP; //设置为输出 gpio_initstruct.GPIO_Pin = GPIO_Pin_15; //将初始化的Pin脚 gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz; //可承载的最大频率 GPIO_Init(GPIOA, &gpio_initstruct); //初始化GPIO Led_Set(LED_OFF); //初始化完成后,关闭led } /* ************************************************************ * 函数名称: Led_Set * * 函数功能: led控制 * * 入口参数: status:开关led * * 返回参数: 无 * * 说明: 开-LED_ON 关-LED_OFF ************************************************************ */ void Led_Set(_Bool status) { GPIO_WriteBit(GPIOA, GPIO_Pin_15, status == LED_ON ? Bit_RESET : Bit_SET); //如果status等于LED_ON,则返回Bit_SET,否则返回Bit_RESET led_info.Led_Status = status; } 按上个要求修改
时间: 2025-07-10 11:10:23 浏览: 3
代码概述
该代码使用标准外设库(StdPeriph)实现对 LED 的初始化和控制。现在要求将其改写为适用于 STM32G474RET6 的 HAL 库版本,以匹配新的开发环境。
---
代码解析
### 修改要点:
1. 使用 `__HAL_RCC_GPIOA_CLK_ENABLE()` 替代 `RCC_APB2PeriphClockCmd()`。
2. 移除 `GPIO_PinRemapConfig()`,因为 G4 系列中 JTAG 引脚默认可用,无需重映射。
3. 使用 `HAL_GPIO_Init()` 和 `HAL_GPIO_WritePin()` 代替 StdPeriph 函数。
4. 使用 `GPIO_PIN_15` 宏代替 `GPIO_Pin_15`。
---
### 修改后的 HAL 版本代码如下:
```c
// 单片机头文件
#include "main.h" // HAL 库主头文件,包含 GPIO 定义等
// 硬件驱动
#include "led.h"
LED_INFO led_info = {0};
/**
************************************************************
* 函数名称: Led_Init
*
* 函数功能: LED 初始化
*
* 入口参数: 无
*
* 返回参数: 无
*
* 说明: 初始化 LED 所用的 GPIO
************************************************************
*/
void Led_Init(void)
{
GPIO_InitTypeDef gpio_initstruct;
/* 使能 GPIOA 时钟 */
__HAL_RCC_GPIOA_CLK_ENABLE();
/* 配置 GPIO 结构体 */
gpio_initstruct.Pin = GPIO_PIN_15; // LED 对应的引脚
gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出模式
gpio_initstruct.Pull = GPIO_NOPULL; // 不使用上下拉
gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH; // 高速模式
HAL_GPIO_Init(GPIOA, &gpio_initstruct); // 初始化 GPIO
Led_Set(LED_OFF); // 初始关闭 LED
}
/**
************************************************************
* 函数名称: Led_Set
*
* 函数功能: LED 控制
*
* 入口参数: status:开关 LED
*
* 返回参数: 无
*
* 说明: 开 - LED_ON,关 - LED_OFF
************************************************************
*/
void Led_Set(_Bool status)
{
/* 设置 LED 状态 */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, (status == LED_ON) ? GPIO_PIN_RESET : GPIO_PIN_SET);
led_info.Led_Status = status;
}
```
---
知识点
1. **GPIO基本配置**
包括引脚选择、工作模式(如推挽输出)、上下拉设置及输出速度等。
2. **HAL库时钟使能操作**
使用 `__HAL_RCC_GPIOX_CLK_ENABLE()` 来开启对应GPIO端口的时钟,是操作前的必要步骤。
3. **推挽输出模式理解**
推挽输出具有较强的驱动能力,能够主动输出高/低电平,常用于数字输出控制。
阅读全文
相关推荐


















