EFR32FG14开发板代码中#ifdef指令的逻辑作用咨询
EFR32FG14按键示例中
#ifdef的逻辑解析 这段代码里的#ifdef BSP_GPIO_LED1_PORT是C语言预编译阶段的条件编译指令,核心作用是让代码适配不同硬件配置的评估板,具体逻辑如下:
1. 宏定义的前提
BSP_GPIO_LED1_PORT是硬件相关宏,定义在bsp.h(板级支持包头文件)中。如果你的EFR32FG14评估板配备了LED1,这个宏会被定义为对应引脚的端口号;如果板子只有LED0没有LED1,这个宏就不会被定义。
2. 条件编译的具体作用
初始化阶段
在initGPIO()函数里:
#ifdef BSP_GPIO_LED1_PORT GPIO_PinModeSet(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN, gpioModePushPull, 0); #endif
只有当BSP_GPIO_LED1_PORT宏存在时,预编译器才会保留这段LED1引脚配置代码,将LED1设置为推挽输出。如果宏不存在,这段代码会被直接跳过,避免出现“未定义标识符”的编译错误。
主循环控制逻辑
在主循环的死循环里:
#ifdef BSP_GPIO_LED1_PORT // 控制LED1状态 if (GPIO_PinInGet(BSP_GPIO_PB1_PORT, BSP_GPIO_PB1_PIN) == PB_PRESSED) { // LED1点亮 GPIO_PinOutSet(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN); } else { // LED1熄灭 GPIO_PinOutClear(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN); } #endif
同样逻辑:只有板子有LED1(宏已定义),才会编译这段“PB1按键控制LED1亮灭”的代码。没有LED1的板子,这段逻辑会被忽略,代码只保留LED0的控制部分。
3. 核心目的
这种写法是嵌入式开发中常见的硬件适配技巧,让同一份代码兼容带LED1和不带LED1的不同EFR32评估板,不需要为不同硬件单独编写和维护多套代码,提升代码的复用性和可移植性。
完整代码(中文注释版)
#include "em_device.h" #include "em_chip.h" #include "em_cmu.h" #include "em_gpio.h" #include "bsp.h" // 按键为低电平有效 #define PB_PRESSED (1) /**************************************************************************//** * @brief GPIO初始化函数 *****************************************************************************/ void initGPIO(void) { // 使能GPIO时钟 CMU_ClockEnable(cmuClock_GPIO, true); // 配置PB0和PB1为输入引脚 GPIO_PinModeSet(BSP_GPIO_PB0_PORT, BSP_GPIO_PB0_PIN, gpioModeInput, 0); GPIO_PinModeSet(BSP_GPIO_PB1_PORT, BSP_GPIO_PB1_PIN, gpioModeInput, 0); // 配置LED0和LED1为输出引脚 GPIO_PinModeSet(BSP_GPIO_LED0_PORT, BSP_GPIO_LED0_PIN, gpioModePushPull, 0); #ifdef BSP_GPIO_LED1_PORT GPIO_PinModeSet(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN, gpioModePushPull, 0); #endif } /**************************************************************************//** * @brief 主函数 *****************************************************************************/ int main(void) { // 芯片 errata 处理 CHIP_Init(); // 初始化外设 initGPIO(); while (1) { // 控制LED0状态 if (GPIO_PinInGet(BSP_GPIO_PB0_PORT, BSP_GPIO_PB0_PIN) == PB_PRESSED) { // LED0点亮 GPIO_PinOutSet(BSP_GPIO_LED0_PORT, BSP_GPIO_LED0_PIN); } else { // LED0熄灭 GPIO_PinOutClear(BSP_GPIO_LED0_PORT, BSP_GPIO_LED0_PIN); } #ifdef BSP_GPIO_LED1_PORT // 控制LED1状态 if (GPIO_PinInGet(BSP_GPIO_PB1_PORT, BSP_GPIO_PB1_PIN) == PB_PRESSED) { // LED1点亮 GPIO_PinOutSet(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN); } else { // LED1熄灭 GPIO_PinOutClear(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN); } #endif } }
内容的提问来源于stack exchange,提问作者lub2354
相关产品推荐
相关产品推荐

