gpiote
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信号上升沿产生
gpiote的常用函数
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)
gpiote示例程序(需要配置sdkconfig.h开启gpiote)
#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);
}
}
事实上nrf52832的gpiote类似于stm32的exit