赞
踩
1.gpiote不是简单的gpio,它是在gpio的基础上引入了task和event
(task对应的是输出,event对应的是输入)
2.gpiote具有8个通道(每个通道可以分配给1个引脚)
3.gpiote的task任务(输出):
1.SET:置位任务(1)
2.CLR:清除任务(0)
3.OUT:翻转任务
(任务优先级:OUT > CLR > SET)
4.gpiote的event触发方式(输入):
1.上升沿:NRF_GPIOTE_POLARITY_HITOLO
2.下降沿: NRF_GPIOTE_POLARITY_LOTOHI
3.任意沿: NRF_GPIOTE_POLARITY_TOGGLE
5.gpiote的port事件:通过多个gpio引脚detect信号上升沿产生
1.分配通道函数(无空闲就返回错误信息) 1.nrf_drv_gpiote_in_init() 2.nrf_drv_gpiote_out_init() 需要使用nrf_drv_gpiote_out_vonfig_t为任务分配gpio引脚 2.释放通道函数 1.nrf_drv_gpiote_in_uninit() 2.nrf_drv_gpiote_out_uninit() 输出: 3.任务使能gpiote(初始化后并没有开启) 1.nrfx_gpiote_out_task_enable(pin) 2.nrfx_gpiote_out_task_disable(pin) 4.触发后任务函数 1.nrf_drv_gpiote_set_task_trigger() :置位 2.nrf_drv_gpiote_clr_task_trigger() :清除 3.nrf_drv_gpiote_out_task_trigger() :翻转 输入: 5.事件使能 1.nrfx_gpiote_in_event_enable(pin,statu)
#include <stdbool.h> #include <stdint.h> #include "nrf_delay.h" #include "boards.h" #include "nrf_log.h" #include "nrf_log_ctrl.h" #include "nrf_log_default_backends.h" #include "nrf_drv_gpiote.h" static void log_init(void) { ret_code_t err = NRF_LOG_INIT(NULL); APP_ERROR_CHECK(err); NRF_LOG_DEFAULT_BACKENDS_INIT(); } //gpiote事件回调函数 void gpiote_event_handle(nrf_drv_gpiote_pin_t pin,nrf_gpiote_polarity_t action) { //通过gpio引脚判断事件发生 if(pin == 18) { nrf_gpio_pin_toggle(18); } //也可以通过gpiote触发信号判断事件发生 if(action == NRF_GPIOTE_POLARITY_HITOLO) { nrf_gpio_pin_toggle(18); } } int main(void) { log_init(); //gpiote初始化 ret_code_t err; err = nrf_drv_gpiote_init(); //只能初始化一次(共享资源) //输出任务 APP_ERROR_CHECK(err); nrf_drv_gpiote_out_config_t task_config = GPIOTE_CONFIG_OUT_TASK_TOGGLE(true); //定义gpiote电平翻转任务结构体 err = nrf_drv_gpiote_out_init(17,&task_config); //配置gpiote引脚17 APP_ERROR_CHECK(err); nrf_drv_gpiote_out_task_enable(17); //gpiote任务使能 //输入事件 nrf_drv_gpiote_in_config_t event_config = GPIOTE_CONFIG_IN_SENSE_HITOLO(true); //设置为下降沿模式触发 event_config.pull = NRF_GPIO_PIN_PULLUP; //设置gpio为上拉模式 err = nrf_drv_gpiote_in_init(13,&event_config,gpiote_event_handle); //初始化gpiote引脚13 APP_ERROR_CHECK(err); nrf_drv_gpiote_in_event_enable(13,true); //gpiote事件使能 //初始化普通gpio-p0.18 nrf_gpio_cfg_output(18); nrf_gpio_pin_set(18); NRF_LOG_INFO("GPIOTE example started"); NRF_LOG_FLUSH(); while(1) { nrf_drv_gpiote_out_task_trigger(17); //触发翻转任务 nrf_delay_ms(500); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。