当前位置: 首页 > news >正文

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

http://www.xdnf.cn/news/961939.html

相关文章:

  • 基于FPGA的PID算法学习———实现PI比例控制算法
  • React Native 基础语法与核心组件:深入指南
  • 篇章三 论坛系统——环境搭建
  • 如何将数据从 iPhone 传输到笔记本电脑
  • ACM70V-701-2PL-TL00
  • CPP基础(2)
  • Linux 删除登录痕迹
  • rapidocr v3.1.0发布
  • 什么样的登录方式才是最安全的?
  • 高频交易技术:订单簿分析与低延迟架构——从Level 2数据挖掘到FPGA硬件加速的全链路解决方案
  • Numpy7——数学2(矩阵基础,线性方程基础)
  • 看板会议如何高效进行
  • 设计模式和设计原则回顾
  • React动态渲染:如何用map循环渲染一个列表(List)
  • VsCode 离线插件下载
  • 第十三章 RTC 实时时钟
  • 从离散控制到集成管理:Modbus TCP转CANopen网关重构烟丝膨胀生产线
  • 如何使用 IP 地址修改 Android 的 Captive Portal 校验 URL
  • 关于Android camera2预览变形的坑
  • 《高等数学》(同济大学·第7版)第四章第二节换元积分法
  • 在GIS 工作流中实现数据处理
  • 天机学堂手撸
  • CentOS下的分布式内存计算Spark环境部署
  • 什么是MongoDB
  • freeCAD 学习 step1
  • 【FFmpeg学习(2)】视频概念
  • 雨季智慧交通:从车辆盲区到客流统计的算法全覆盖
  • ubuntu + nginx 1.26 + php7.4 + mysql8.0 调优
  • Cypher 查询语言完全指南(2024最新版)—— Neo4j 图数据库实战教程
  • Unity | AmplifyShaderEditor插件基础(第八集:噪声波动shader)