经典的多位gpio初始化操作

复制代码
void leds_init(uint32_t led_mask) {
    uint32_t pin = 0;
    while (led_mask) {
        if (led_mask & 1) {
            led_init(pin);
        }
        led_mask >>= 1;//等于led_mask = led >> 1;
        pin++;
    }
}

示例:从初始化到批量控制的完整流程

假设需要控制 GPIO0、GPIO2、GPIO5 三个引脚的 LED(低电平点亮):

1. 初始化阶段

调用 leds_init(0b00100101)(二进制,对应第 0、2、5 位为 1):

  • 函数遍历 led_mask 的每一位,发现第 0、2、5 位为 1,调用 led_init(0)led_init(2)led_init(5)
  • 每个 led_init(pin) 会配置对应 GPIO 引脚为推挽输出模式(确保可以主动控制电平)。
2. 批量设置状态阶段

调用 leds_set_state(0b00100101, LED_ON)(低电平点亮):

  • 底层调用 nrf_gpio_pins_clear(0b00100101),将 GPIO0、GPIO2、GPIO5 的清除寄存器对应位设为 1。
  • GPIO 硬件检测到清除寄存器的位为 1,立即将这些引脚置低电平,LED 点亮。

为什么两个函数可以"独立"但协同工作?

这里的"独立"是指两个函数的代码逻辑分离(一个负责初始化,一个负责状态设置),但它们通过以下机制实现协同:

  • ​统一的位掩码标识目标引脚​led_mask 是两者共享的"契约",明确指定了需要操作的引脚集合。
  • ​GPIO 硬件的批量操作支持​ :底层库函数(如 nrf_gpio_pins_clear)利用 GPIO 寄存器的并行操作能力,将位掩码直接转换为硬件指令,无需逐个引脚处理。
相关推荐
DIY机器人工房3 小时前
【科普】STM32CubeMX是配置工具,STM32CubeIDE是集成开发环境,二者互补但定位不同,前者负责初始化配置,后者专注代码开发调试。
单片机·嵌入式硬件·嵌入式·diy机器人工房
努力做小白3 小时前
Linux驱动20 --- FFMPEG视频API
linux·驱动开发·单片机·嵌入式硬件·ffmpeg·lvgl
得单片机的运12 小时前
STM32的蓝牙通讯(HAL库)
stm32·单片机·嵌入式硬件·蓝牙
国科安芯13 小时前
抗辐照芯片在低轨卫星星座CAN总线通讯及供电系统的应用探讨
运维·网络·人工智能·单片机·自动化
weixin_4526006914 小时前
GC8872刷式直流电机驱动器详解:3.6A驱动能力与PWM控制
stm32·单片机·嵌入式硬件·智能家居·音响·电动工具
Despacito0o17 小时前
STM32 I2C通信完整教程:从协议原理到硬件实现
stm32·单片机·嵌入式硬件
你好,奋斗者!17 小时前
小电流驱动大电流:原理、实现方式与应用前景
stm32·单片机·嵌入式硬件·电路设计
XINVRY-FPGA20 小时前
XCZU4EV-1FBVB900E Xilinx FPGA AMD Zynq UltraScale+ MPSoC EV(Embedded Vision)
arm开发·嵌入式硬件·计算机视觉·fpga开发·硬件架构·硬件工程·fpga
猫猫的小茶馆21 小时前
【STM32】FreeRTOS 任务的删除(三)
java·linux·stm32·单片机·嵌入式硬件·mcu·51单片机
学不动CV了21 小时前
单片机ADC采集机理层面详细分析(二)
c语言·arm开发·stm32·单片机·嵌入式硬件·开源·51单片机