找回密码
 立即注册

使用微信账号登录

只需一步,快速开始

查看: 7|回复: 0

[Nordic] nRF54L15 GPIO 特性(三)

[复制链接]
连续签到天数:1天
签到总天数:8天
签到总奖励:36金币
发表于 6 小时前 | 显示全部楼层 |阅读模式

马上注册,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册  

×
2.2.1.获取节点描述符node specifier,即node_id
​ 参考文件:ncs/zephyr/doc/build/dts/api-usage.rst
​ 通过标签获取:DT_NODELABEL()
​ 通过别名获取: DT_ALIAS(sw0);DT_ALIAS(led00) //sw0,led00分别为button0,led0的别名
​ 通过绝对路径获取:DT_PATH(zephyr_user);DT_PATH(leds);DT_PATH(soc,gpio_50400)
​ 通过实体编号获取:DT_INST()
​ 通过被选取的节点chosen node获取:DT_CHOSEN()
​ 通过父节点/子节点获取:DT_PARENT(); DT_CHILD() ;
​ 通过node2及其phandle属性获取node1的节点描述符: node1=DT_PHANDLE(node2, prop)
\- DT_PATH(zephyr_user, i2c_40002000)\- DT_NODELABEL(i2c1)\- DT_ALIAS(sensor_controller)\- DT_INST(x, vnd_soc_i2c)2.2.2通过节点将gpio配置(属性)读取至特定结构体中gpio_dt_sepc my_gpio=GPIO_DT_SPEC_GET(DT_PATH(zephyr_user), my_gpios)gpio_dt_spec myled = GPIO_DT_SPEC_GET(DT_ALIAS(led0), gpios); //节点id,属性名gpio_dt_spec mybutton = GPIO_DT_SPEC_GET_OR(DT_ALIAS(sw0), gpios,{0}); // 节点id,属性名,默认值
以上是gpio-button作为特殊设备的直接获取方式,对于一般的外设如uart/spi等,可以用DEVICE_DT_GET()获取设备。
2.2.3.重新配置gpio参数
GPIO的默认配置来源于devicetree,我们可以用以下方式覆盖默认配置:
​ 参考文档:2.8.0/zephyr/include/zephyr/drivers/gpio.h
a.配置输入输出:
gpio_pin_configure_dt(&mybutton, GPIO_INPUT);gpio_pin_configure_dt(&myled, GPIO_OUTPUT);
b.设置/获取IO口状态
gpio_pin_toggle_dt(&myled);gpio_pin_get_dt(&mybutton);gpio_pin_set_dt(&myled, 1);
c.配置中断
gpio_pin_interrupt_configure_dt()gpio_init_callback(&button_cb_data, button_pressed, BIT(button.pin));gpio_add_callback_dt() => gpio_add_callback(spec->port, callback);gpio_add_callback(button.port, &button_cb_data);
d.其他配置
gpio_remove_callback_dt()gpio_get_pending_int()3. GPIO & GPIOTE Event
gpio作为通用输入输出端口,用来对IO口进行读写和清空等操作,能通过配置+检测管脚的电平产生中断,也可以被其他外设配置和使用。GPIO模块的重要功能:
​ sense:系统进入sleep模式后(也称system OFF模式),只能通过IO口等特殊唤醒源来唤醒并产生复位。
​ Detect:sense除了可以唤醒sleep模式,还可以用来产生中断,即detect功能。DETECT类似一个中断标志位,是每个端口所有IO口进行或操作的结果,所以DETECT信号状态会受同一port下所有IO口的影响,只要有一个外部IO口有效,那么DETECT信号就一直为true,只有所有IO口状态都clear时,DETECT信号才会重新变成低。
​ ncs底层提供了将GPIO配置成一个特殊gpio device(如button,led) ),以便而=对其进行中断配置,通过gpio_dt_spec获取其GPIO配置。
gpiote则是具有task/event 的外设,作用就是让每个GPIO也具有传统意义上的task和event的功能,gpiote外设使用GPIO后,将会覆盖对GPIO直接的操作和配置。根据GPIO的特性,我们可以将GPIOTE的事件配置为<u>PORT EVENT 和Pin EVENT</u>。
<u>PORT EVNET</u> 是基于GPIO DETECT原理,是GPIO的sense特性,当所有外设和CPU都处于空闲状态时,此功能可用于在System ON模式下将CPU从WFI或WFE类型睡眠中唤醒,这意味着在System ON模式下功耗最低.但可能检测不到宽度仅为1us的脉冲(同一port上的任意pin脚都有可能使DETECT信号为高,产生PORT EVENT,,之后第二个pin上即便有SETECT信号变化也不再产生event,再次使用需要清空所有DETECT);
<u>Pin EVENT</u>是基于event中断(电流相对于Port Event高),是将每个GPIO口的沿变化配置到不同的GPIOTE通道,各自触发相应的IN EVENT,具有更高的事件精度。
GPIOTE输入中断,既可以是Pin Event,也可以用Port Event。FOR NRF54L15:
• GPIOTE20: 8 个channels 和 2 种中断, 使用 GPIO port P1 • GPIOTE30: 4 个channels 和 2 种中断, 使用 GPIO port P0 • 安全的GPIOTE通道可以配置安全和非安全的GPIO引脚 • 非安全GPIOTE通道只能配置非安全GPIO引脚
3.1 GPIOTE Pin Event
ncs/zephyr/samples/basic/button展示的是GPIO Pin Event的配置方法
注意,不推荐拿这个代码去处理button。因为这个是最底层的GPIO中断,并没有按键消抖功能,有button的应用需求可以用lbs里的button模块来做,一般只需要简单的引脚替换和硬件上细微改动。



楼主热帖
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则

小黑屋|手机版|我爱蓝牙网 - 52Bluetooth

GMT+8, 2025-9-4 17:09 , Processed in 0.109211 second(s), 13 queries , Gzip On, MemCached On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表