当前位置: 首页 > 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.dtcms.com/a/242656.html

相关文章:

  • JetBrains IntelliJ IDEA插件推荐
  • Spring MVC 核心枢纽:DispatcherServlet 的深度解析与实践价值
  • Zynq multi boot及网口远程更新开发
  • .Net框架,除了EF还有很多很多......
  • 简易版抽奖活动的设计技术方案
  • 数据库管理与高可用-PostgreSQL初体验
  • 安全编程期末复习34(红色重点向下兼容)
  • 8.1.排序的基本概念
  • ArkUI-X平台差异化
  • 函数中的Callable
  • Web安全漏洞详解及解决方案
  • 行业 |5G六年,互联网改变了什么?
  • Vue 2.0 + C# + OnlyOffice 开发
  • GO自带日志库log包解释
  • RAG->大模型搜索search-R1
  • Java中高并发线程池的相关面试题详解
  • AE之番外篇
  • 模型上下文协议(MCP)实践指南
  • 深入解析默认值工具类:DefaultUtil
  • TF-IDF算法详解与实践总结
  • 上海市计算机学会竞赛平台第六届上海市青少年算法竞赛网络赛(青年组)平方的和
  • Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
  • 【2025CVPR】花粉识别新标杆:HieraEdgeNet多尺度边缘增强框架详解
  • 【PhysUnits】17.6 Unit基础结构(unit.rs)
  • python模拟键盘 鼠标操作 通过ctypes调用Windows API实现底层输入模拟
  • Android Studio 问题:Android Studio 一直开在 Updating indexes
  • 使用Mvnd加速Maven构建速度
  • 深度学习核心概念:优化器、模型可解释性与欠拟合
  • TI以太网PHY收发器晶体选择和规格
  • OpenGL学习20250610