NRF52840 processus d'apprentissage (deux) bouton 02 interruption d'événement

Temps en 2021 Nian 1 Yue 25 Ri , maison de vacances d'hiver, une bonne école pour apprendre

 

Carte de développement : pièce de tête Snow's 100 NRF52840 EVAL KIT

Outil de téléchargement: JINLK V11 (de préférence JLINK V9 ou supérieur, certaines personnes utilisent JLINK OB, d'autres téléchargeurs STLINK, DAP ne sont pas recommandés)

Numéro de version: environnement de programmation KEIL5, CMSIS est 5.3.0, CMSIS de NRF52840 est 8.35.0

Matériel de référence: NRF52840-Eval-Kit-Schematic.pdf (Schematic)

nRF5_SDK_17.0.2_d674dde (routine officielle)

nRF5_SDK_17.0.0_offline_doc (document officiel)

Chapitre du bouton Qingfeng NRF52832

 

Fonction de réalisation: bouton lumineux

 

Schéma du bouton

Les ports IO sont 11 et 18, dont 18 est le bouton RESET. Maintenant, je n'annulerai pas la fonction de réinitialisation de 18, et je ne l'utiliserai pas pour le moment

Configurez IO comme entrée ascendante, puis lorsque le bouton est enfoncé, il est de niveau 0, lorsque le bouton n'est pas enfoncé ou relâché, il est de niveau haut

Utilisez nrf_gpio_cfg_input pour configurer comme mode d'entrée

Code

       nrf_gpio_cfg_input (11, NRF_GPIO_PIN_PULLUP);

 

Parce qu'il n'y a qu'un seul bouton, j'ai trois boutons indépendants à l'extérieur, IO est 24, 20, 17 et l'autre extrémité est connectée à la terre.

L'interruption externe GPIOTE est utilisée, GPIO est une broche d'entrée et de sortie à usage général, et T / E représente la broche pour le réglage de la tâche ou de l'interruption

Ajouter des fichiers

Plus précisément, trouvez-le dans E: \ nRF52840 \ nRF5_SDK_17.0.2_d674dde \ modules \ nrfx \ drivers \ src

GPIOTE n'a que 8 canaux, qui sont tous gérés par les 8 registres de CONFIG [0 ~ 7]

code montrer comme ci-dessous:

NRF_GPIOTE->CONFIG[0] =  (GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos)
                           | (KEY0 << GPIOTE_CONFIG_PSEL_Pos)  
                           | (GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos);

Configurer le premier canal NRF_GPIOTE-> CONFIG [0]

Où (GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos) est

Où (KEY0 << GPIOTE_CONFIG_PSEL_Pos) est

Où GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos); est

 

 

Autrement dit, définissez le mode événement (EVENT), la broche est KEY0, puis haut-> bas, c'est-à-dire que le front descendant déclenche l'interruption

 

Puis activez l'interruption

NRF_GPIOTE->INTENSET  = GPIOTE_INTENSET_IN0_Set << GPIOTE_INTENSET_IN0_Pos;// 使能中断CONFIG[0]:

Fonction d'interruption:

void GPIOTE_IRQHandler(void)
{
    if ((NRF_GPIOTE->EVENTS_IN[0] == 1) &&   (NRF_GPIOTE->INTENSET & GPIOTE_INTENSET_IN0_Msk))
    {
        NRF_GPIOTE->EVENTS_IN[0] = 0; //中断事件清零
		 if(nrf_gpio_pin_read(KEY0)== 0)
		 {
			nrf_gpio_pin_toggle(LED0);
		 }			
    }
}

 

Le code complet est le suivant:


#include <stdbool.h>
#include <stdint.h>
#include "nrf_delay.h"
#include "nrf_gpio.h"
#include "nrf_gpiote.h"


uint32_t LED0,LED1,LED2,LED3;
uint32_t KEY0,KEY1,KEY2,KEY3;



/**
 * @brief Function for application main entry.
 */
int main(void)
{
	LED0 =  NRF_GPIO_PIN_MAP(0,13);
	LED1 =  NRF_GPIO_PIN_MAP(0,14);
	LED2 =  NRF_GPIO_PIN_MAP(1,9);
	LED3 =  NRF_GPIO_PIN_MAP(0,16);

	KEY0 =  NRF_GPIO_PIN_MAP(0,11);
	KEY1 =  NRF_GPIO_PIN_MAP(0,24);
	KEY2 =  NRF_GPIO_PIN_MAP(0,20);
	KEY3 =  NRF_GPIO_PIN_MAP(0,17);

	nrf_gpio_cfg_output(LED0);
	nrf_gpio_cfg_output(LED1);
	nrf_gpio_cfg_output(LED2);
	nrf_gpio_cfg_output(LED3);

	nrf_gpio_pin_set(LED0);
	nrf_gpio_pin_set(LED1);
	nrf_gpio_pin_set(LED2);
	nrf_gpio_pin_set(LED3);
	
	nrf_gpio_cfg_input(KEY0,NRF_GPIO_PIN_PULLUP );
	nrf_gpio_cfg_input(KEY1,NRF_GPIO_PIN_PULLUP );
	nrf_gpio_cfg_input(KEY2,NRF_GPIO_PIN_PULLUP );
	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)
                           | (KEY0 << GPIOTE_CONFIG_PSEL_Pos)  
                           | (GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos);
						   
	 // 设置事件模式(EVENT),引脚为KEY0,然后高->低,即下降沿触发中断	 
    NRF_GPIOTE->INTENSET  = GPIOTE_INTENSET_IN0_Set << GPIOTE_INTENSET_IN0_Pos;// 使能中断类型:


    NRF_GPIOTE->CONFIG[1] =  (GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos)
                           | (KEY1 << GPIOTE_CONFIG_PSEL_Pos)  
                           | (GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos);
						   
	 // 设置事件模式(EVENT),引脚为KEY1,然后高->低,即下降沿触发中断	 
    NRF_GPIOTE->INTENSET  = GPIOTE_INTENSET_IN1_Set << GPIOTE_INTENSET_IN1_Pos;// 使能中断类型:


    NRF_GPIOTE->CONFIG[2] =  (GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos)
                           | (KEY2 << GPIOTE_CONFIG_PSEL_Pos)  
                           | (GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos);
						   
	 // 设置事件模式(EVENT),引脚为KEY2,然后高->低,即下降沿触发中断 
    NRF_GPIOTE->INTENSET  = GPIOTE_INTENSET_IN2_Set << GPIOTE_INTENSET_IN2_Pos;// 使能中断类型:


    NRF_GPIOTE->CONFIG[3] =  (GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos)
                           | (KEY3 << GPIOTE_CONFIG_PSEL_Pos)  
                           | (GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos);
						   
	 // 设置事件模式(EVENT),引脚为KEY3,然后高->低,即下降沿触发中断	 
    NRF_GPIOTE->INTENSET  = GPIOTE_INTENSET_IN3_Set << GPIOTE_INTENSET_IN3_Pos;// 使能中断类型:


	while(1)
	{
//		if(0 == nrf_gpio_pin_read(KEY0))
//		{
//			nrf_delay_ms(10); //xiaodou
//			if(0 == nrf_gpio_pin_read(KEY0))
//			{
//				nrf_gpio_pin_toggle(LED0);
//				
//				while(0 == nrf_gpio_pin_read(KEY0)); //songshou
//			}
//		}
				
	}
	
}

void GPIOTE_IRQHandler(void)
{
    if ((NRF_GPIOTE->EVENTS_IN[0] == 1) &&   (NRF_GPIOTE->INTENSET & GPIOTE_INTENSET_IN0_Msk))
    {
        NRF_GPIOTE->EVENTS_IN[0] = 0; //中断事件清零
		 if(nrf_gpio_pin_read(KEY0)== 0)
		 {
			nrf_gpio_pin_toggle(LED0);
		 }			
    }
    if ((NRF_GPIOTE->EVENTS_IN[1] == 1) &&   (NRF_GPIOTE->INTENSET & GPIOTE_INTENSET_IN1_Msk))
    {
        NRF_GPIOTE->EVENTS_IN[1] = 0; //中断事件清零
		 if(nrf_gpio_pin_read(KEY1)== 0)
		 {
			nrf_gpio_pin_toggle(LED1);
		 }			
    }
    if ((NRF_GPIOTE->EVENTS_IN[2] == 1) &&   (NRF_GPIOTE->INTENSET & GPIOTE_INTENSET_IN2_Msk))
    {
        NRF_GPIOTE->EVENTS_IN[2] = 0; //中断事件清零
		 if(nrf_gpio_pin_read(KEY2)== 0)
		 {
			nrf_gpio_pin_toggle(LED2);
		 }			
    }
    if ((NRF_GPIOTE->EVENTS_IN[3] == 1) &&   (NRF_GPIOTE->INTENSET & GPIOTE_INTENSET_IN3_Msk))
    {
        NRF_GPIOTE->EVENTS_IN[3] = 0; //中断事件清零
		 if(nrf_gpio_pin_read(KEY3)== 0)
		 {
			nrf_gpio_pin_toggle(LED3);
		 }			
    }
}

 

Ce type d'interruption est très difficile à écrire, car il s'agit d'un registre d'exploitation et la stabilité est également très mauvaise. Continuez à interrompre dans la section suivante

Je suppose que tu aimes

Origine blog.csdn.net/jwdeng1995/article/details/113107290
conseillé
Classement