为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长。
nRF5x系列处理器将GPIO的中断快速触发做成一个单独的模块GPIOTE,即提供了GPIO中断功能,也设计了task和event 的方式来访问GPIO的功能。
task:任务,执行某一特定的功能,比如:翻转GPIO——任务模式。
event:事件,来源于GPIO的输入,定时器的匹配中断等可以触发中断的外设产生——事件模式。事件模式可作为中断触发使用。
task和event主要是为了和PPI模块配合使用,PPI模块可以将event和task分别绑定在它的两端。当event发生时,task自动触发,这种方式不需要cpu的参与,减轻了负荷,也降低了功耗。
如下图,Task和Event均可分为三类:
任务:置位,清零,翻转
事件:上升沿,下降沿,任何变化
task任务通过OUT[0]–OUT[3]设置三种触发状态;
event 事件可以通过检测信号产生PORT enevt事件,也能产生 IN[n] event事件;
GPIOTE提供了四个通道,四个通道通过GONFIG[0]——CONFIG[3]来配置,这四个通道可通过单独设置,分别和普通的GPIO绑定。当需要使用GPIOTE中断功能时可以设置相关寄存器的相应位让某个通道做为event,同时配置event触发动作。比如绑定的GPIO有上升沿或者下降沿触发event,然后配置中断使能寄存器,配置让其event时触发中断。
硬件中断导致处理器通过一个上下文切换来保存执行状态(以程序计数器和程序状态字信息为主);
软件中断通常作为CPU指令集的一个指令,以可编程的方式直接指示这种上下文切换,并将处理导向一段中断处理代码。
(1)中断嵌套设置;
(2)外部GPIOTE中断函数设置。
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翻转
}
}
}
通道配置:
//中断回调函数
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的应用-按键检测