10、nRF52xx蓝牙学习(GPIOTE事件模式中断组件)-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug

10、nRF52xx蓝牙学习(GPIOTE事件模式中断组件)

 

由于驱动组件库是可以直接调用的,那么编程者的任务就只有编写主函数 main。
#include <stdbool.h> #include "nrf.h" #include "nrf_drv_gpiote.h" #include "app_error.h" #include "boards.h" /* #ifdef BSP_BUTTON_0: 这是一个条件编译指令,其作用是检查 BSP_BUTTON_0 这个宏是否已经被定义。BSP 一般代表板级支持包(Board Support Package),BSP_BUTTON_0 可能是板子上某个按钮所对应的引脚编号。 #define PIN_IN BSP_BUTTON_0:若 BSP_BUTTON_0 已被定义,此指令会将 PIN_IN 定义为 BSP_BUTTON_0 的值。如此一来,后续代码里就能用 PIN_IN 来代表输入引脚。  #ifndef PIN_IN:该指令用于检查 PIN_IN 这个宏是否未被定义。 #error "Please indicate input pin":要是 PIN_IN 未被定义,编译器会停止编译,并输出错误信息 “Please indicate input pin”,以此提示开发者要明确指定输入引脚。  */ #ifdef BSP_BUTTON_0//检查 BSP_BUTTON_0 这个宏是否已经被定义,(在pca10056中有定义)     #define PIN_IN BSP_BUTTON_0//若 BSP_BUTTON_0 已被定义,此指令会将 PIN_IN 定义为 BSP_BUTTON_0 的值 #endif #ifndef PIN_IN//要是 PIN_IN 未被定义     #error "Please indicate input pin" #endif  #ifdef BSP_LED_0     #define PIN_OUT BSP_LED_0 #endif #ifndef PIN_OUT     #error "Please indicate output pin" #endif  /**   GPIOTE中断处理 	 	in_pin_handler,这是一个回调函数,通常用于处理 GPIO(通用输入输出)引脚事件。当 GPIO 引脚发生特定事件时,该函数会被调用。  	nrf_drv_gpiote_pin_t pin:表示触发事件的 GPIO 引脚编号。nrf_drv_gpiote_pin_t 是一个自定义的数据类型,用于表示 GPIO 引脚。  	nrf_gpiote_polarity_t action:表示触发事件的极性,比如上升沿触发、下降沿触发等。nrf_gpiote_polarity_t 也是一个自定义的数据类型,用于表示极性。    	函数体  if(nrf_gpio_pin_read(PIN_IN) == 0) // 按键防抖 {     nrf_gpio_pin_toggle(PIN_OUT); } 按键防抖检查: nrf_gpio_pin_read(PIN_IN):调用 nrf_gpio_pin_read 函数读取 PIN_IN 引脚的电平状态。PIN_IN 是之前代码中通过预处理指令定义的输入引脚。  if(nrf_gpio_pin_read(PIN_IN) == 0):检查 PIN_IN 引脚的电平是否为低电平(通常按键按下时引脚电平为低)。这里的判断起到了简单的按键防抖作用, 因为按键按下时可能会产生抖动,通过检查引脚电平是否持续为低,可以减少误触发的可能性。    ?引脚状态切换: nrf_gpio_pin_toggle(PIN_OUT):如果 PIN_IN 引脚的电平为低,调用 nrf_gpio_pin_toggle 函数切换 PIN_OUT 引脚的电平状态。 PIN_OUT 是之前代码中通过预处理指令定义的输出引脚。也就是说,当输入引脚检测到按键按下时,会切换输出引脚的电平,通常用于控制 LED 灯的亮灭。 总结 这段代码定义了一个 GPIO 引脚事件处理函数,当输入引脚检测到按键按下(低电平)时,会切换输出引脚的电平状态,实现了简单的按键控制功能,同时包含了基本的按键防抖逻辑。  */ void in_pin_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)//nrfx_gpiote_pin_t 其实就是uint32_t的意思,是为了便于理解,才这样取了一个别名 {     if(nrf_gpio_pin_read(PIN_IN)== 0)//按键防抖 	 { 	  nrf_gpio_pin_toggle(PIN_OUT);//led反转 	 } } /** 配置GPIOTE初始化    */ static void gpio_init(void) {     nrf_gpio_cfg_output(PIN_OUT);//设置led引脚为输出 	  ret_code_t err_code;//typedef ret_code_t nrfx_err_t;//typedef 原类型 新类型名;      err_code = nrf_drv_gpiote_init();     APP_ERROR_CHECK(err_code);       nrf_drv_gpiote_in_config_t in_config = GPIOTE_CONFIG_IN_SENSE_TOGGLE(true);     in_config.pull = NRF_GPIO_PIN_PULLUP;      err_code = nrf_drv_gpiote_in_init(PIN_IN, &in_config, in_pin_handler);     APP_ERROR_CHECK(err_code);      nrf_drv_gpiote_in_event_enable(PIN_IN, true); }  /** 主函数,循环等待中断  */ int main(void) {     gpio_init();      while (true)     {         // Do nothing.     } }

程序理解:

1、


#ifdef BSP_BUTTON_0

#define PIN_IN BSP_BUTTON_0
#endif
#ifndef PIN_IN
#error “Please indicate input pin”
#endif

#ifdef BSP_LED_0
#define PIN_OUT BSP_LED_0
#endif
#ifndef PIN_OUT
#error “Please indicate output pin”
#endif


#ifdef BSP_BUTTON_0:

这是一个条件编译指令,其作用是检查 BSP_BUTTON_0 这个宏是否已经被定义(经查询发现在pca10056.h中有定义)。BSP 一般代表板级支持包(Board Support Package),BSP_BUTTON_0 可能是板子上某个按钮所对应的引脚编号。

#define PIN_IN BSP_BUTTON_0:

若 BSP_BUTTON_0 已被定义,此指令会将 PIN_IN 定义为 BSP_BUTTON_0 的值。如此一来,后续代码里就能用 PIN_IN 来代表输入引脚。

#ifndef PIN_IN:

该指令用于检查 PIN_IN 这个宏是否未被定义。

#error “Please indicate input pin”:

要是 PIN_IN 未被定义,编译器会停止编译,并输出错误信息 “Please indicate input pin”,以此提示开发者要明确指定输入引脚。

2、配置GPIOTE初始化


static void gpio_init(void)
{
nrf_gpio_cfg_output(PIN_OUT);//设置led引脚为输出
ret_code_t err_code;//typedef ret_code_t nrfx_err_t;//typedef 原类型 新类型名;

    err_code = nrf_drv_gpiote_init();
APP_ERROR_CHECK(err_code);

    nrf_drv_gpiote_in_config_t in_config = GPIOTE_CONFIG_IN_SENSE_TOGGLE(true);
in_config.pull = NRF_GPIO_PIN_PULLUP;

    err_code = nrf_drv_gpiote_in_init(PIN_IN, &in_config, in_pin_handler);
APP_ERROR_CHECK(err_code);

    nrf_drv_gpiote_in_event_enable(PIN_IN, true);
}


(1)nrf_gpio_cfg_output函数是nrf_gpio.h中定义的一个函数,其作用是将指定的引脚配置为输出模式。

(2)ret_code_t err_code是定义一个ret_code_t类型的变量err_code,

ret_code_t 是一个自定义的数据类型,通常用于表示函数执行的返回状态码。ret_code_t有一个别名是nrfx_err_t,查询有下面的信息:

/typedef  ret_code_t   nrfx_err_t

nrfx_err_t是一个枚举类型,其内容如下:

typedef enum {     NRFX_SUCCESS                    = (NRFX_ERROR_BASE_NUM + 0),  ///< Operation performed successfully.     NRFX_ERROR_INTERNAL             = (NRF
请登录后发表评论

    没有回复内容