#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





没有回复内容