You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 20:55:57