Análisis de GPIOTE desarrollado por nRF52832

1. Principio GPIOTE

1. Concepto
1) GPIO de nRF52832 solo se puede usar como entrada general y habilitación de salida. Si no se puede interrumpir cuando se usa como entrada, este efecto debe lograrse a través de GPIOTE;
2) GPIOTE (tareas y eventos GPIO) Introducir tareas y eventos sobre la base de GPIO;
3) Operar IO a través de tareas y eventos, las tareas son para salida, puede hacer que IO produzca diferentes acciones, y los eventos son para entrada, los cambios de estado de IO establecerán el registro de eventos, Generando así una interrupción de evento.

2. Principio
1) GPIOTE de nRF52832 tiene 8 canales en total, cada canal se puede asignar a un pin y el pin asignado se puede configurar como modo de tarea o modo de evento;
2) Cada canal de GPIOTE tiene SET, CLR y OUT Tarea, en la que la tarea SET hace que la salida del pin sea de alto nivel, la tarea CLR hace que la salida del pin sea de bajo nivel, la tarea OUT puede realizar operaciones de establecimiento, borrado y alternancia en el pin a través de la configuración;
3) eventos GPIOTE para cada canal Se puede configurar en tres estados de entrada: flanco ascendente, flanco descendente y cualquier transición de nivel;
4) las tareas y eventos se configuran a través del registro CONFIG [n] (n = 0 ~ 7), cada registro CONFIG [n] se puede configurar con uno Número correspondiente OUT [n] (n = 0 ~ 7) registro de tareas e IN [n] registro de eventos;
5) Cuando se configura un pin a través del registro CONFIG se controla mediante el registro de tareas SET, CLR y OUT o el registro de eventos IN, el El pin solo puede ser escrito por el módulo GPIOTE, la escritura GPIO normal no es válida;
6) Cuando se desencadenan tareas conflictivas al mismo tiempo en el mismo canal GPIOTE, el nivel de ejecución de estas tareas de mayor a menor es: OUT-> el CLR -> el SET;
7) GPIOTE Además de ocho canales, que comprende además una cosa PORT. , Eventos PORT son eventos generados por una pluralidad de pines GPIO detectar la señal.

2. Registro GPIOTE (n = 0 ~ 7)

1. Registro de la tarea
OUT OUT [n]: escribe en el pin especificado por CONFIG [n] .PSEL, la acción del pin está determinada por la configuración en CONFIG [n] .POLARITY

2. Registro de tareas
TASKS_SET TASKS_SET [n]: escribe en el pin especificado por CONFIG [n] .PSEL, la acción del pin es generar un alto nivel

3. Registro de tarea
TASKS_CLR TASKS_CLR [n]: escribe en el pin especificado por CONFIG [n] .PSEL, la acción del pin se emite baja

4. EVENT_IN registro de eventos
EVENT_IN [n]: CONFIG [n]. Evento generado por el pin especificado por PSEL

5. Registro general
1) INTENSET: activar interrupción
2) INTENCLR: desactivar interrupción
3) CONFIG [n]: configuración de OUT [n], SET [n], CLR [n] y IN [n]

Tres, análisis de programación

Versión del SDK: nRF5_SDK_15.2.0_9412b96

1. Proceso de salida GPIOTE
1) Inicialice el módulo GPIOTE
2) Inicialice el pin de salida GPIOTE
3) Si desea habilitar el modo de tarea

2. Proceso de entrada GPIOTE
1) Inicialice el módulo GPIOTE
2) Configure el pin como entrada GPIOTE
3) Habilite el modo de evento

3. Las funciones de la biblioteca relacionados
// archivo de cabecera: nrf_drv_gpiote.h
. 1) ret_code_t nrf_drv_gpiote_init (void)
Función: La inicialización del módulo GPIOTE
2) ret_code_t nrf_drv_gpiote_out_init (nrf_drv_gpiote_pin_t pin,
nrf_drv_gpiote_out_config_t const * p_config) Función: pin de salida de inicialización GPIOTE, un pin de salida En la configuración inicial, la acción del pin (nivel bajo a nivel alto, nivel alto a nivel bajo o estado de alternancia) y el estado de inicialización (nivel alto o nivel bajo)
3) vacío nrf_drv_gpiote_out_uninit (nrf_drv_gpiote_pin_t pin)
función: la liberación GPIOTE pin de salida
4) vacío nrfx_gpiote_out_task_enable (pin nrfx_drv_gpiote_pin_t)
función: permitir GPIOTE modo de misión pin de salida
5) vacío nrfx_gpiote_out_task_disable (pin nrfx_drv_gpiote_pin_t)
función: Desactivar GPIOTE modo de misión pin de salida
6) activadas imprimación tarea de conducir Función de pie
1> nrf_drv_gpiote_set_task_trigger (nrf_drv_gpiote_pin_t pin)
función: recibir la tarea GPIOTE SET del disparador, después de disparar, el pin correspondiente genera un alto nivel
Función 2> nrf_drv_gpiote_clr_task_trigger (nrf_drv_gpiote_pin_t pin)
: la tarea GPIOTE CLR se recibe después de la activación, el pin correspondiente genera un nivel bajo después de la activación
3> nrf_drv_gpiote_out_task_trigger (nrf_drv_gpiote
después de que la tarea está activada, el PIN se encuentra en el punto de activación de la tarea Volteo del estado de salida

7) ret_code_t nrf_drv_gpiote_in_init (nrf_drv_gpiote_pin_t pin,
nrf_drv_gpiote_in_config_t const * p_config, evt_handler nrf_drv_gpiote_evt_handler_t) Función: pin de entrada de inicialización GPIOTE,
. 8) vacío nrfx_gpiote_in_event_enable (nrfx_drv_gpiote_pin_t PIN, el INT_ENABLE BOOL)
Función: entrada de habilitación GPIOTE pin

4. Escritura de código
1) Ejemplo de proceso de salida GPIOTE

#include "boards.h"
#include "nrf_delay.h"
#include "nrf_drv_gpiote.h"

int main(void)
{
	ret_code_t err_code;
	//初始化GPIOTE模块
	err_code = nrf_drv_gpiote_init();
	APP_ERROR_CHECK(err_code);
	//定义GPIOTE输出初始化结构体并赋值
	nrf_drv_gpiote_out_config_t config = GPIOTE_CONFIG_OUT_TASK_TOGGLE(true);
	//初始化GPIOTE输出引脚
	err_code = nrf_drv_gpiote_out_init(LED_1,&config);
	APP_ERROR_CHECK(err_code);
	//使能任务模式
	nrf_drv_gpiote_out_task_enable(LED_1);
	
	while(true)
	{	//触发任务
		nrf_drv_gpiote_out_task_trigger(LED_1);
		nrf_delay_ms(150);
	}
	return 0;
}

2) Ejemplo de proceso de entrada GPIOTE

#include "boards.h"
#include "nrf_drv_gpiote.h"

//事件回调函数
void in_pin_handler(nrf_drv_gpiote_pin_t pin,nrf_gpiote_polarity_t action)
{
	if (pin == BUTTON_1)
		nrf_gpio_pin_toggle(LED_1);
	
	if (action == NRF_GPIOTE_POLARITY_HITOLO)
		nrf_gpio_pin_toggle(LED_2);
	else if (action == NRF_GPIOTE_POLARITY_LOTOHI)
		nrf_gpio_pin_toggle(LED_3);
	else if (action == NRF_GPIOTE_POLARITY_TOGGLE)
		nrf_gpio_pin_toggle(LED_4);
}

int main(void)
{
	ret_code_t err_code;
	//初始化开发板上的LED灯
	bsp_board_init(BSP_INIT_LEDS);
	//初始化GPIOTE模块
	err_code = nrf_drv_gpiote_init();
	APP_ERROR_CHECK(err_code);
	//配置下降沿产生事件
	//nrf_drv_gpiote_in_config_t config = GPIOTE_CONFIG_IN_SENSE_HITOLO(true);
	//配置上升沿产生事件,false表示
	nrf_drv_gpiote_in_config_t config = GPIOTE_CONFIG_IN_SENSE_LOTOHI(false);//true表示高精度,false表示低精度
	//配置任意电平变化产生事件
	//nrf_drv_gpiote_in_config_t config = GPIOTE_CONFIG_IN_SENSE_TOGGLE(true);
	//配置引脚为内部上拉
	config.pull = NRF_GPIO_PIN_PULLUP;
	//配置引脚为GPIOTE输入
	err_code = nrf_drv_gpiote_in_init(BUTTON_1,&config,in_pin_handler);
	APP_ERROR_CHECK(err_code);
	//使能事件模式
	nrf_drv_gpiote_in_event_enable(BUTTON_1,true);
	while(true)
	{
	
	}
	return 0;
}

 

Publicado 81 artículos originales · 21 elogios · 30,000+ visitas

Supongo que te gusta

Origin blog.csdn.net/qq_33575901/article/details/90041554
Recomendado
Clasificación