NRF51822——GPIOTE学习笔记

前言:

为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长。

NRF51822——GPIOTE学习笔记_第1张图片


1.概述

nRF5x系列处理器将GPIO的中断快速触发做成一个单独的模块GPIOTE,即提供了GPIO中断功能,也设计了task和event 的方式来访问GPIO的功能。

task:任务,执行某一特定的功能,比如:翻转GPIO——任务模式。

event:事件,来源于GPIO的输入,定时器的匹配中断等可以触发中断的外设产生——事件模式。事件模式可作为中断触发使用。

task和event主要是为了和PPI模块配合使用,PPI模块可以将event和task分别绑定在它的两端。当event发生时,task自动触发,这种方式不需要cpu的参与,减轻了负荷,也降低了功耗。

2.GPIOTE类别

如下图,Task和Event均可分为三类:

NRF51822——GPIOTE学习笔记_第2张图片

任务:置位,清零,翻转

事件:上升沿,下降沿,任何变化

3.GPIOTE配置

task任务通过OUT[0]–OUT[3]设置三种触发状态;

event 事件可以通过检测信号产生PORT enevt事件,也能产生 IN[n] event事件;

NRF51822——GPIOTE学习笔记_第3张图片

GPIOTE提供了四个通道,四个通道通过GONFIG[0]——CONFIG[3]来配置,这四个通道可通过单独设置,分别和普通的GPIO绑定。当需要使用GPIOTE中断功能时可以设置相关寄存器的相应位让某个通道做为event,同时配置event触发动作。比如绑定的GPIO有上升沿或者下降沿触发event,然后配置中断使能寄存器,配置让其event时触发中断。

NRF51822——GPIOTE学习笔记_第4张图片

硬件中断导致处理器通过一个上下文切换来保存执行状态(以程序计数器和程序状态字信息为主);

软件中断通常作为CPU指令集的一个指令,以可编程的方式直接指示这种上下文切换,并将处理导向一段中断处理代码。

3.nRF51822中断配置

(1)中断嵌套设置;

(2)外部GPIOTE中断函数设置。

4.中断方式按键驱动

void EXIT_KEY_Init(void)
{
	nrf_gpio_cfg_input(KEY3,NRF_GPIO_PIN_PULLUP);
	
	NVIC_EnableIRQ(GPIOTE_IRQn);	//中断设置嵌套
	NRF_GPIOTE->CONFIG[0] =  (GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos)
                           | (22 << GPIOTE_CONFIG_PSEL_Pos)  
                           | (GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos);//中断配置
	NRF_GPIOTE->INTENSET  = GPIOTE_INTENSET_IN0_Set << GPIOTE_INTENSET_IN0_Pos;//使能中断类型				  
}

void GPIOTE_IRQHandler(void)
{
	if(nrf_gpio_pin_read(KEY3) == 0)
	{
		if((NRF_GPIOTE->EVENTS_IN[0] == 1) && 
        (NRF_GPIOTE->INTENSET & GPIOTE_INTENSET_IN0_Msk))
		{
			NRF_GPIOTE->EVENTS_IN[0] = 0; //中断事件清零
			  LED2_Toggle();//led翻转
		}
	}
}

通道配置:

NRF51822——GPIOTE学习笔记_第5张图片

5.GPIO组件应用

//中断回调函数
void in_pin_hangler(nrf_drv_gpiote_pin_t pin,nrf_gpiote_polarity_t action)
{
	nrf_drv_gpiote_out_toggle(LED_1);
}

void gpio_init(void)
{
	ret_code_t err_code;
	
	err_code = nrf_drv_gpiote_init();	//初始化GPIOTE组件
	APP_ERROR_CHECK(err_code);
	
	//配置GPIOTE输出时事件
	nrf_drv_gpiote_out_config_t out_config = GPIOTE_CONFIG_OUT_SIMPLE(0);
	//输出事件初始化
	err_code = nrf_drv_gpiote_out_init(LED_1,&out_config);
	APP_ERROR_CHECK(err_code);
	
	//配置GPIOTE输入事件
	nrf_drv_gpiote_in_config_t in_config = GPIOTE_CONFIG_IN_SENSE_TOGGLE(1);
	in_config.pull = NRF_GPIO_PIN_PULLUP;
	//输入事件初始化
	err_code = nrf_drv_gpiote_in_init(KEY1,&in_config,in_pin_hangler);
	APP_ERROR_CHECK(err_code);
	//配置中断输入事件使能
	nrf_drv_gpiote_in_event_enable(KEY1,1);
}

参考:

1.nRF51822外设应用[2]:GPIOTE的应用-按键检测

你可能感兴趣的:(NRF51822专栏)