然后打开GPIO
三、点亮LED
然后打开gpio led output.c文件,编译代码,再进入调试模式。
这里有三个步骤,但是需要注意一下,要先编译才能进行下载调试,而且硬件还需要连接TYPE C在J15上才可以正常下载,不然也会认不到设备。
四、代码:
int main(void)
{
/\* 定义LED引脚的配置结构体 \*/
gpio_pin_config_t led_config = {
kGPIO_DigitalOutput, // 引脚方向:数字输出
0, // 初始输出逻辑电平:低电平(0)
};
/\* 硬件初始化(包括时钟、引脚、调试控制台) \*/
BOARD_InitHardware();
/\* 打印提示信息到终端(通过调试串口) \*/
PRINTF("\\r\\n GPIO Driver example\\r\\n");
PRINTF("\\r\\n The LED is blinking.\\r\\n");
/\* 初始化LED引脚为输出模式 \*/
GPIO_PinInit(BOARD_LED_GPIO, BOARD_LED_GPIO_PIN, &led_config);
/\* 主循环:周期性切换LED状态 \*/
while (1)
{
delay(); // 延时函数(未展示,可能是软件延时或定时器延时)
/\* 切换LED引脚电平(通过位操作翻转指定引脚) \*/
GPIO_PortToggle(BOARD_LED_GPIO, 1u << BOARD_LED_GPIO_PIN);
}
}
/**
* @brief 初始化单个GPIO引脚
* @param base GPIO外设基地址(如GPIOA、GPIOB等)
* @param pin 引脚编号(如0~31)
* @param config 引脚配置结构体指针(方向、初始电平)
*/
void GPIO_PinInit(GPIO_Type *base, uint32_t pin, const gpio_pin_config_t *config)
{
/\* 参数校验:确保配置结构体非空 \*/
assert( != config);
/\* 使能GPIO外设时钟(避免操作无效寄存器) \*/
GPIO_PortClockEnable(base, true);
/\* 复位外设(如果芯片支持通过RESET模块复位GPIO) \*/
#if defined(GPIO_RESETS_ARRAY)
RESET_ReleasePeripheralReset(s_gpioResets\[GPIO_GetInstance(base)\]);
#endif
/\* 根据配置方向设置引脚模式 \*/
if (config->pinDirection == kGPIO_DigitalInput)
{
/\* 配置为输入模式:清除PDDR(Port Data Direction Register)对应位 \*/
base->PDDR &= GPIO_FIT_REG(\~(1UL << pin));
}
else
{
/\* 配置为输出模式:
\* 1. 设置初始输出电平(通过PSOR/PCOR寄存器)
\* 2. 设置PDDR对应位为输出方向
\*/
GPIO_PinWrite(base, pin, config->outputLogic);
base->PDDR |= GPIO_FIT_REG((1UL << pin));
}
}
硬件抽象层(HAL)设计
gpio_pin_config_t 结构体封装了引脚方向和初始电平,便于移植。
GPIO_PinInit() 通过 base 参数支持多GPIO端口GPIOA、GPIOB,增强代码复用性。
寄存器操作细节
PDDR(Port Data Direction Register):控制引脚方向(输入/输出)。
输入模式:对应位清零(&= ~)。
输出模式:对应位置1(|=)。
GPIO_FIT_REG 宏:可能用于寄存器位域适配(如处理不同芯片的寄存器差异)。
复位管理
RESET_ReleasePeripheralReset() 确保GPIO外设从复位状态释放(部分芯片需手动解除复位)。
LED控制逻辑
GPIO_PortToggle() 通过异或操作翻转引脚电平(1u << pin 生成位掩码)。
延时函数 delay() 需根据实际需求实现。
五、驱动效果



