【DigiKey&NXP】NXP FRDM-MCXA153开发板 +环境与mcxa153 GPIO使用(四)

然后打开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() 需根据实际需求实现。

五、驱动效果