GPIO tasks and events (GPIOTE)
GPIO tasks and events (GPIOTE)
1.GPIOTE模块也是设计成减少了CPU占用的Task Event模式,使得事件可以不经过CPU就能得到响应。
Event引脚的触发源有:上升沿,下降沿等任何改变
Task引脚的操作方式有:置位,清0,反转
Event和task之间可以靠PPI连接在一起
2.一旦把某个引脚分配给Task(OUT[n])或Event(IN[n]),那么该引脚就只能被GPIOTE模块写操作,正常的GPIO写入时无效的。
3.当GPIOTE通道被配置用于操作一个任务引脚n,那么该引脚n的初值需要在CONFIG[n]寄存器的OUTINIT区域中设定。
4.GPIOE的事件触发源可以不仅仅只是某个引脚,还可以是某个port(nRF51把32个引脚分为4个port),同属一个port的任意一个引脚只要被检测到上升沿发生都会触发Port Event。
5.GPIOTE中断的使用。
/**
* @brief Function for configuring: pin 0 for input, pin 8 for output,
* and configures GPIOTE to give an interrupt on pin change.
*/
static void gpio_init(void)
{
nrf_gpio_cfg_input(BUTTON_0, BUTTON_PULL);
nrf_gpio_cfg_output(LED_0);nrf_gpio_pin_write(LED_0, BUTTON_0);// Enable interrupt:
NVIC_EnableIRQ(GPIOTE_IRQn);
//配置工作模式为event
//选择一个引脚作为event来源
//配置该event的触发源为翻转
NRF_GPIOTE->CONFIG[0] = (GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos)
| (0 << GPIOTE_CONFIG_PSEL_Pos)
| (GPIOTE_CONFIG_POLARITY_Toggle << GPIOTE_CONFIG_POLARITY_Pos);
//开启4路GPIOTE通道中的IN0通道的中断
NRF_GPIOTE->INTENSET = GPIOTE_INTENSET_IN0_Set << GPIOTE_INTENSET_IN0_Pos;
}/** @brief Function for handling the GPIOTE interrupt which is triggered on pin 0 change.
*/
void GPIOTE_IRQHandler(void)
{
// Event causing the interrupt must be cleared.
if ((NRF_GPIOTE->EVENTS_IN[0] == 1) && //判断中断是否来自GPIOTE通道0
(NRF_GPIOTE->INTENSET & GPIOTE_INTENSET_IN0_Msk))
{
NRF_GPIOTE->EVENTS_IN[0] = 0;
}
nrf_gpio_pin_toggle(LED_0);
}/**
* @brief Function for application main entry.
*/
int main(void)
{
gpio_init();
while (true)
{
// Do nothing.
}
}
浙公网安备 33010602011771号