1、nrfx_err_t nrfx_gpiote_init
函数代码如下 :
nrfx_err_t nrfx_gpiote_init(void) { nrfx_err_t err_code; if (m_cb.state != NRFX_DRV_STATE_UNINITIALIZED) { err_code = NRFX_ERROR_INVALID_STATE; NRFX_LOG_WARNING("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } uint8_t i; for (i = 0; i < MAX_PIN_NUMBER; i++) { if (nrf_gpio_pin_present_check(i)) { pin_in_use_clear(i); } } for (i = 0; i < (GPIOTE_CH_NUM + NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS); i++) { channel_free(i); } memset(m_cb.configured_pins, 0, sizeof(m_cb.configured_pins)); NRFX_IRQ_PRIORITY_SET(nrfx_get_irq_number(NRF_GPIOTE), NRFX_GPIOTE_CONFIG_IRQ_PRIORITY); NRFX_IRQ_ENABLE(nrfx_get_irq_number(NRF_GPIOTE)); nrf_gpiote_event_clear(NRF_GPIOTE_EVENTS_PORT); nrf_gpiote_int_enable(GPIOTE_INTENSET_PORT_Msk); m_cb.state = NRFX_DRV_STATE_INITIALIZED; err_code = NRFX_SUCCESS; NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; }
![图片[1]-5、nRF52xx蓝牙学习(nrf_gpiote.c库函数学习)-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2025/11/20251112115041700-91762919441.png?v=1762919441)
(1)nrfx_gpiote_init
函数不接收参数,返回值类型为 nrfx_err_t,这是一个用于表示错误码的类型。
(2)nrfx_err_t err_code;
定义一个nrfx_err_t类型的变量err_code.
nrfx_err_t是一个枚举类型,在nrfx_errors.h中其定义如下:
typedef enum { NRFX_SUCCESS = (NRFX_ERROR_BASE_NUM + 0), ///< Operation performed successfully. NRFX_ERROR_INTERNAL = (NRFX_ERROR_BASE_NUM + 1), ///< Internal error. NRFX_ERROR_NO_MEM = (NRFX_ERROR_BASE_NUM + 2), ///< No memory for operation. NRFX_ERROR_NOT_SUPPORTED = (NRFX_ERROR_BASE_NUM + 3), ///< Not supported. NRFX_ERROR_INVALID_PARAM = (NRFX_ERROR_BASE_NUM + 4), ///< Invalid parameter. NRFX_ERROR_INVALID_STATE = (NRFX_ERROR_BASE_NUM + 5), ///< Invalid state, operation disallowed in this state. NRFX_ERROR_INVALID_LENGTH = (NRFX_ERROR_BASE_NUM + 6), ///< Invalid length. NRFX_ERROR_TIMEOUT = (NRFX_ERROR_BASE_NUM + 7), ///< Operation timed out. NRFX_ERROR_FORBIDDEN = (NRFX_ERROR_BASE_NUM + 8), ///< Operation is forbidden. NRFX_ERROR_NULL = (NRFX_ERROR_BASE_NUM + 9), ///< Null pointer. NRFX_ERROR_INVALID_ADDR = (NRFX_ERROR_BASE_NUM + 10), ///< Bad memory address. NRFX_ERROR_BUSY = (NRFX_ERROR_BASE_NUM + 11), ///< Busy. NRFX_ERROR_ALREADY_INITIALIZED = (NRFX_ERROR_BASE_NUM + 12), ///< Module already initialized. NRFX_ERROR_DRV_TWI_ERR_OVERRUN = (NRFX_ERROR_DRIVERS_BASE_NUM + 0), ///< TWI error: Overrun. NRFX_ERROR_DRV_TWI_ERR_ANACK = (NRFX_ERROR_DRIVERS_BASE_NUM + 1), ///< TWI error: Address not acknowledged. NRFX_ERROR_DRV_TWI_ERR_DNACK = (NRFX_ERROR_DRIVERS_BASE_NUM + 2) ///< TWI error: Data not acknowledged. } nrfx_err_t;
(3)m_cb
m_cb是一个静态变量,定义如下 :
static gpiote_control_block_t m_cb;
其类型为结构体变量gpiote_control_block_t,该类型是在nrfx_gpiote.c中定义的:
typedef struct { nrfx_gpiote_evt_handler_t handlers[GPIOTE_CH_NUM + NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS]; int8_t pin_assignments[MAX_PIN_NUMBER]; int8_t port_handlers_pins[NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS]; uint8_t configured_pins[((MAX_PIN_NUMBER)+7) / 8]; nrfx_drv_state_t state; } gpiote_control_block_t;
这段代码使用 typedef 关键字定义了一个名为 gpiote_control_block_t 的结构体类型。这个结构体主要用于存储和管理 Nordic Semiconductor 的 GPIO(通用输入输出)任务和事件(GPIOTE)驱动的相关配置信息和状态。
结构体成员详细解释
nrfx_gpiote_evt_handler_t handlers[GPIOTE_CH_NUM + NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS];
- 成员类型:
nrfx_gpiote_evt_handler_t类型的数组。nrfx_gpiote_evt_handler_t应该是一个函数指针类型,用于指向处理 GPIOTE 事件的回调函数。 - 数组大小:数组的大小为
GPIOTE_CH_NUM + NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS。GPIOTE_CH_NUM可能表示 GPIOTE 模块的通道数量,NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS可能表示低功耗事件的数量。 - 作用:该数组用于存储每个通道和低功耗事件对应的事件处理函数指针,以便在相应的事件发生时调用。
int8_t pin_assignments[MAX_PIN_NUMBER];
- 成员类型:
int8_t类型的数组。int8_t是一个有符号的 8 位整数类型。 - 数组大小:数组的大小为
MAX_PIN_NUMBER,表示系统中可用的最大引脚数量。 - 作用:该数组用于记录每个引脚的分配情况。数组的每个元素对应一个引脚,元素的值可以表示该引脚的使用状态或分配给哪个通道等信息。
int8_t port_handlers_pins[NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS];
- 成员类型:
int8_t类型的数组。 - 数组大小:数组的大小为&n





没有回复内容