马上注册,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册 
×
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 Eventgpio作为通用输入输出端口,用来对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 Eventncs/zephyr/samples/basic/button展示的是GPIO Pin Event的配置方法 注意,不推荐拿这个代码去处理button。因为这个是最底层的GPIO中断,并没有按键消抖功能,有button的应用需求可以用lbs里的button模块来做,一般只需要简单的引脚替换和硬件上细微改动。
|