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 寄存器的并行操作能力,将位掩码直接转换为硬件指令,无需逐个引脚处理。