boards.h文件的代码如下:
#ifndef BOARDS_H
#define BOARDS_H
#include "nrf_gpio.h"
#include "nordic_common.h"
#if defined(BOARD_NRF6310)
#include "nrf6310.h"
#elif defined(BOARD_PCA10000)
#include "pca10000.h"
#elif defined(BOARD_PCA10001)
#include "pca10001.h"
#elif defined(BOARD_PCA10002)
#include "pca10000.h"
#elif defined(BOARD_PCA10003)
#include "pca10003.h"
#elif defined(BOARD_PCA20006)
#include "pca20006.h"
#elif defined(BOARD_PCA10028)
#include "pca10028.h"
#elif defined(BOARD_PCA10031)
#include "pca10031.h"
#elif defined(BOARD_PCA10036)
#include "pca10036.h"
#elif defined(BOARD_PCA10040)
#include "pca10040.h"
#elif defined(BOARD_PCA10056)
#include "pca10056.h"
#elif defined(BOARD_PCA10100)
#include "pca10100.h"
#elif defined(BOARD_PCA10112)
#include "pca10112.h"
#elif defined(BOARD_PCA20020)
#include "pca20020.h"
#elif defined(BOARD_PCA10059)
#include "pca10059.h"
#elif defined(BOARD_WT51822)
#include "wt51822.h"
#elif defined(BOARD_N5DK1)
#include "n5_starterkit.h"
#elif defined (BOARD_D52DK1)
#include "d52_starterkit.h"
#elif defined (BOARD_ARDUINO_PRIMO)
#include "arduino_primo.h"
#elif defined (CUSTOM_BOARD_INC)
#include STRINGIFY(CUSTOM_BOARD_INC.h)
#elif defined(BOARD_CUSTOM)
#include "custom_board.h"
#else
#error "Board is not defined"
#endif
#if defined (SHIELD_BSP_INC)
#include STRINGIFY(SHIELD_BSP_INC.h)
#endif
#ifdef __cplusplus
extern "C" {
#endif
/**@defgroup BSP_BOARD_INIT_FLAGS Board initialization flags.
* @{ */
#define BSP_INIT_NONE 0 /**< No initialization of LEDs or buttons (@ref bsp_board_init).*/
#define BSP_INIT_LEDS (1 << 0) /**< Enable LEDs during initialization (@ref bsp_board_init).*/
#define BSP_INIT_BUTTONS (1 << 1) /**< Enable buttons during initialization (@ref bsp_board_init).*/
/**@} */
/**
* Function for returning the state of an LED.
*
* @param led_idx LED index (starting from 0), as defined in the board-specific header.
*
* @return True if the LED is turned on.
*/
bool bsp_board_led_state_get(uint32_t led_idx);
/**
* Function for turning on an LED.
*
* @param led_idx LED index (starting from 0), as defined in the board-specific header.
*/
void bsp_board_led_on(uint32_t led_idx);
/**
* Function for turning off an LED.
*
* @param led_idx LED index (starting from 0), as defined in the board-specific header.
*/
void bsp_board_led_off(uint32_t led_idx);
/**
* Function for inverting the state of an LED.
*
* @param led_idx LED index (starting from 0), as defined in the board-specific header.
*/
void bsp_board_led_invert(uint32_t led_idx);
/**
* Function for turning off all LEDs.
*/
void bsp_board_leds_off(void);
/**
* Function for turning on all LEDs.
*/
void bsp_board_leds_on(void);
/**
* Function for initializing the BSP handling for the board.
*
* @note This also initializes the USB DFU trigger library if @ref BOARDS_WITH_USB_DFU_TRIGGER is 1.
*
* @param[in] init_flags Flags specifying what to initialize (LEDs/buttons).
* See @ref BSP_BOARD_INIT_FLAGS.
*/
void bsp_board_init(uint32_t init_flags);
/**
* Function for converting pin number to LED index.
*
* @param pin_number Pin number.
*
* @return LED index of the given pin or 0xFFFFFFFF if invalid pin provided.
*/
uint32_t bsp_board_pin_to_led_idx(uint32_t pin_number);
/**
* Function for converting LED index to pin number.
*
* @param led_idx LED index.
*
* @return Pin number.
*/
uint32_t bsp_board_led_idx_to_pin(uint32_t led_idx);
/**
* Function for returning the state of a button.
*
* @param button_idx Button index (starting from 0), as defined in the board-specific header.
*
* @return True if the button is pressed.
*/
bool bsp_board_button_state_get(uint32_t button_idx);
/**
* Function for converting pin number to button index.
*
* @param pin_number Pin number.
*
* @return Button index of the given pin or 0xFFFFFFFF if invalid pin provided.
*/
uint32_t bsp_board_pin_to_button_idx(uint32_t pin_number);
/**
* Function for converting button index to pin number.
*
* @param button_idx Button index.
*
* @return Pin number.
*/
uint32_t bsp_board_button_idx_to_pin(uint32_t button_idx);
#define BSP_BOARD_LED_0 0
#define BSP_BOARD_LED_1 1
#define BSP_BOARD_LED_2 2
#define BSP_BOARD_LED_3 3
#define BSP_BOARD_LED_4 4
#define BSP_BOARD_LED_5 5
#define BSP_BOARD_LED_6 6
#define BSP_BOARD_LED_7 7
#define PIN_MASK(_pin) /*lint -save -e504 */ \
(1u << (uint32_t)((_pin) & (~P0_PIN_NUM))) \
/*lint -restore */
#define PIN_PORT(_pin) (((_pin) >= P0_PIN_NUM) ? NRF_P1 : NRF_GPIO)
#ifdef BSP_LED_0
#define BSP_LED_0_MASK PIN_MASK(BSP_LED_0)
#define BSP_LED_0_PORT PIN_PORT(BSP_LED_0)
#else
#define BSP_LED_0_MASK 0
#define BSP_LED_0_PORT 0
#endif
#ifdef BSP_LED_1
#define BSP_LED_1_MASK PIN_MASK(BSP_LED_1)
#define BSP_LED_1_PORT PIN_PORT(BSP_LED_1)
#else
#define BSP_LED_1_MASK 0
#define BSP_LED_1_PORT 0
#endif
#ifdef BSP_LED_2
#define BSP_LED_2_MASK PIN_MASK(BSP_LED_2)
#define BSP_LED_2_PORT PIN_PORT(BSP_LED_2)
#else
#define BSP_LED_2_MASK 0
#define BSP_LED_2_PORT 0
#endif
#ifdef BSP_LED_3
#define BSP_LED_3_MASK PIN_MASK(BSP_LED_3)
#define BSP_LED_3_PORT PIN_PORT(BSP_LED_3)
#else
#define BSP_LED_3_MASK 0
#define BSP_LED_3_PORT 0
#endif
#ifdef BSP_LED_4
#define BSP_LED_4_MASK PIN_MASK(BSP_LED_4)
#define BSP_LED_4_PORT PIN_PORT(BSP_LED_4)
#else
#define BSP_LED_4_MASK 0
#define BSP_LED_4_PORT 0
#endif
#ifdef BSP_LED_5
#define BSP_LED_5_MASK PIN_MASK(BSP_LED_5)
#define BSP_LED_5_PORT PIN_PORT(BSP_LED_5)
#else
#define BSP_LED_5_MASK 0
#define BSP_LED_5_PORT 0
#endif
#ifdef BSP_LED_6
#define BSP_LED_6_MASK PIN_MASK(BSP_LED_6)
#define BSP_LED_6_PORT PIN_PORT(BSP_LED_6)
#else
#define BSP_LED_6_MASK 0
#define BSP_LED_6_PORT 0
#endif
#ifdef BSP_LED_7
#define BSP_LED_7_MASK PIN_MASK(BSP_LED_7)
#define BSP_LED_7_PORT PIN_PORT(BSP_LED_7)
#else
#define BSP_LED_7_MASK 0
#define BSP_LED_7_PORT 0
#endif
#define LEDS_MASK (BSP_LED_0_MASK | BSP_LED_1_MASK | \
BSP_LED_2_MASK | BSP_LED_3_MASK | \
BSP_LED_4_MASK | BSP_LED_5_MASK | \
BSP_LED_6_MASK | BSP_LED_7_MASK)
#define BSP_BOARD_BUTTON_0 0
#define BSP_BOARD_BUTTON_1 1
#define BSP_BOARD_BUTTON_2 2
#define BSP_BOARD_BUTTON_3 3
#define BSP_BOARD_BUTTON_4 4
#define BSP_BOARD_BUTTON_5 5
#define BSP_BOARD_BUTTON_6 6
#define BSP_BOARD_BUTTON_7 7
#ifdef BSP_BUTTON_0
#define BSP_BUTTON_0_MASK (1<<BSP_BUTTON_0)
#else
#define BSP_BUTTON_0_MASK 0
#endif
#ifdef BSP_BUTTON_1
#define BSP_BUTTON_1_MASK (1<<BSP_BUTTON_1)
#else
#define BSP_BUTTON_1_MASK 0
#endif
#ifdef BSP_BUTTON_2
#define BSP_BUTTON_2_MASK (1<<BSP_BUTTON_2)
#else
#define BSP_BUTTON_2_MASK 0
#endif
#ifdef BSP_BUTTON_3
#define BSP_BUTTON_3_MASK (1<<BSP_BUTTON_3)
#else
#define BSP_BUTTON_3_MASK 0
#endif
#ifdef BSP_BUTTON_4
#define BSP_BUTTON_4_MASK (1<<BSP_BUTTON_4)
#else
#define BSP_BUTTON_4_MASK 0
#endif
#ifdef BSP_BUTTON_5
#define BSP_BUTTON_5_MASK (1<<BSP_BUTTON_5)
#else
#define BSP_BUTTON_5_MASK 0
#endif
#ifdef BSP_BUTTON_6
#define BSP_BUTTON_6_MASK (1<<BSP_BUTTON_6)
#else
#define BSP_BUTTON_6_MASK 0
#endif
#ifdef BSP_BUTTON_7
#define BSP_BUTTON_7_MASK (1<<BSP_BUTTON_7)
#else
#define BSP_BUTTON_7_MASK 0
#endif
#define BUTTONS_MASK (BSP_BUTTON_0_MASK | BSP_BUTTON_1_MASK | \
BSP_BUTTON_2_MASK | BSP_BUTTON_3_MASK | \
BSP_BUTTON_4_MASK | BSP_BUTTON_5_MASK | \
BSP_BUTTON_6_MASK | BSP_BUTTON_7_MASK)
/* This macro is supporting only P0 and should not be used if LEDs are on other ports. */
#define LEDS_OFF(leds_mask) do { ASSERT(sizeof(leds_mask) == 4); \
NRF_GPIO->OUTSET = (leds_mask) & (LEDS_MASK & LEDS_INV_MASK); \
NRF_GPIO->OUTCLR = (leds_mask) & (LEDS_MASK & ~LEDS_INV_MASK); } while (0)
/* This macro is supporting only P0 and should not be used if LEDs are on other ports. */
#define LEDS_ON(leds_mask) do { ASSERT(sizeof(leds_mask) == 4); \
NRF_GPIO->OUTCLR = (leds_mask) & (LEDS_MASK & LEDS_INV_MASK); \
NRF_GPIO->OUTSET = (leds_mask) & (LEDS_MASK & ~LEDS_INV_MASK); } while (0)
/* This macro is supporting only P0 and should not be used if LEDs are on other ports. */
#define LED_IS_ON(leds_mask) ((leds_mask) & (NRF_GPIO->OUT ^ LEDS_INV_MASK) )
/* This macro is supporting only P0 and should not be used if LEDs are on other ports. */
#define LEDS_INVERT(leds_mask) do { uint32_t gpio_state = NRF_GPIO->OUT; \
ASSERT(sizeof(leds_mask) == 4); \
NRF_GPIO->OUTSET = ((leds_mask) & ~gpio_state); \
NRF_GPIO->OUTCLR = ((leds_mask) & gpio_state); } while (0)
/* This macro is supporting only P0 and should not be used if LEDs are on other ports. */
#define LEDS_CONFIGURE(leds_mask) do { uint32_t pin; \
ASSERT(sizeof(leds_mask) == 4); \
for (pin = 0; pin < 32; pin++) \
if ( (leds_mask) & (1 << pin) ) \
nrf_gpio_cfg_output(pin); } while (0)
#ifdef __cplusplus
}
#endif
#endif
代码理解如下:
这是一个名为 BOARDS_H 的头文件代码,主要用于定义与开发板相关的配置、引脚操作函数声明以及一些常用的宏定义。
下面对其进行详细解释:
1. 头文件保护
#ifndef BOARDS_H
#define BOARDS_H
这是头文件保护宏,防止该头文件被重复包含,确保头文件中的内容在一个编译单元中只被处理一次。
2. 包含其他头文件
#include "nrf_gpio.h"
#include "nordic_common.h"
包含了 nrf_gpio.h 和 nordic_common.h 头文件,前者可能提供了与 Nordic 芯片 GPIO 操作相关的定义和函数声明,后者可能包含了 Nordic 相关的通用定义和工具函数。
3. 根据不同开发板包含对应头文件
#if defined(BOARD_NRF6310)
#include "nrf6310.h"
#elif defined(BOARD_PCA10000)
#include "pca10000.h"
#elif defined(BOARD_PCA10001)
#include "pca10001.h"
#elif defined(BOARD_PCA10002)
#include "pca10000.h"
#elif defined(BOARD_PCA10003)
#include "pca10003.h"
#elif defined(BOARD_PCA20006)
#include "pca20006.h"
#elif defined(BOARD_PCA10028)
#include "pca10028.h"
#elif defined(BOARD_PCA10031)
#include "pca10031.h"
#elif defined(BOARD_PCA10036)
#include "pca10036.h"
#elif defined(BOARD_PCA10040)
#include "pca10040.h"
#elif defined(BOARD_PCA10056)
#include "pca10056.h"
#elif defined(BOARD_PCA10100)
#include "pca10100.h"
#elif defined(BOARD_PCA10112)
#include "pca10112.h"
#elif defined(BOARD_PCA20020)
#include "pca20020.h"
#elif defined(BOARD_PCA10059)
#include "pca10059.h"
#elif defined(BOARD_WT51822)
#include "wt51822.h"
#elif defined(BOARD_N5DK1)
#include "n5_starterkit.h"
#elif defined (BOARD_D52DK1)
#include "d52_starterkit.h"
#elif defined (BOARD_ARDUINO_PRIMO)
#include "arduino_primo.h"
#elif defined (CUSTOM_BOARD_INC)
#include STRINGIFY(CUSTOM_BOARD_INC.h)
#elif defined(BOARD_CUSTOM)
#include "custom_board.h"
#else
#error "Board is not defined"
#endif
根据不同的 BOARD_* 宏定义,包含相应开发板的特定头文件。如果没有定义任何一个已知的开发板宏,则会产生编译错误,提示 Board is not defined。
4. 包含扩展板相关头文件
#if defined (SHIELD_BSP_INC)
#include STRINGIFY(SHIELD_BSP_INC.h)
#endif
如果定义了 SHIELD_BSP_INC 宏,则包含相应的扩展板头文件。
5. C++ 兼容声明
#ifdef __cplusplus
extern "C" {
#endif
如果是 C++ 编译环境,使用 extern "C" 声明,确保 C 语言风格的函数声明在 C++ 中具有正确的链接属性,以便 C++ 代码可以调用这些函数。
6. 开发板初始化标志宏定义
#define BSP_INIT_NONE 0 /**< No initialization of LEDs or buttons (@ref bsp_board_init).*/
#define BSP_INIT_LEDS (1 << 0) /**< Enable LEDs during initialization (@ref bsp_board_init).*/
#define BSP_INIT_BUTTONS (1 << 1) /**< Enable buttons during initialization (@ref bsp_board_init).*/
定义了三个宏,用于表示开发板初始化时的不同标志:
• BSP_INIT_NONE:表示不初始化 LED 和按键。
• BSP_INIT_LEDS:表示初始化时启用 LED。
• BSP_INIT_BUTTONS:表示初始化时启用按键。
7. LED 操作函数声明
bool bsp_board_led_state_get(uint32_t led_idx);
void bsp_board_led_on(uint32_t led_idx);
void bsp_board_led_off(uint32_t led_idx);
void bsp_board_led_invert(uint32_t led_idx);
void bsp_board_leds_off(void);
void bsp_board_leds_on(void);
声明了一系列与 LED 操作相关的函数:
• bsp_board_led_state_get:获取指定 LED 的状态(是否点亮)。
• bsp_board_led_on:点亮指定的 LED。
• bsp_board_led_off:熄灭指定的 LED。
• bsp_board_led_invert:反转指定 LED 的状态。
• bsp_board_leds_off:熄灭所有 LED。
• bsp_board_leds_on:点亮所有 LED。
8. 开发板初始化函数声明
void bsp_board_init(uint32_t init_flags);
声明了开发板初始化函数 bsp_board_init,接受一个 init_flags 参数,根据传入的标志决定初始化哪些部分(如 LED 和按键)。
9. 引脚与 LED 索引转换函数声明
uint32_t bsp_board_pin_to_led_idx(uint32_t pin_number);
uint32_t bsp_board_led_idx_to_pin(uint32_t led_idx);
声明了两个函数用于在引脚编号和 LED 索引之间进行转换:
• bsp_board_pin_to_led_idx:将引脚编号转换为 LED 索引。
• bsp_board_led_idx_to_pin:将 LED 索引转换为引脚编号。
10. 按键操作函数声明
bool bsp_board_button_state_get(uint32_t button_idx);
uint32_t bsp_board_pin_to_button_idx(uint32_t pin_number);
uint32_t bsp_board_button_idx_to_pin(uint32_t button_idx);
声明了一系列与按键操作相关的函数:
• bsp_board_button_state_get:获取指定按键的状态(是否按下)。 • bsp_board_pin_to_button_idx:将引脚编号转换为按键索引。
• bsp_board_button_idx_to_pin:将按键索引转换为引脚编号。
11. LED 和按键编号宏定义
#define BSP_BOARD_LED_0 0
#define BSP_BOARD_LED_1 1
#define BSP_BOARD_LED_2 2
#define BSP_BOARD_LED_3 3
#define BSP_BOARD_LED_4 4
#define BSP_BOARD_LED_5 5
#define BSP_BOARD_LED_6 6
#define BSP_BOARD_LED_7 7
#define BSP_BOARD_BUTTON_0 0
#define BSP_BOARD_BUTTON_1 1
#define BSP_BOARD_BUTTON_2 2
#define BSP_BOARD_BUTTON_3 3
#define BSP_BOARD_BUTTON_4 4
#define BSP_BOARD_BUTTON_5 5
#define BSP_BOARD_BUTTON_6 6
#define BSP_BOARD_BUTTON_7 7
定义了 LED 和按键的编号宏,从 0 到 7,用于标识不同的 LED 和按键。
12. 引脚掩码和端口宏定义
#define PIN_MASK(_pin) /*lint -save -e504 */ \
(1u << (uint32_t)((_pin) & (~P0_PIN_NUM))) \
/*lint -restore */
#define PIN_PORT(_pin) (((_pin) >= P0_PIN_NUM) ? NRF_P1 : NRF_GPIO)
• PIN_MASK:根据引脚编号生成引脚掩码,用于后续对引脚的操作。
• PIN_PORT:根据引脚编号判断引脚所属的端口(NRF_P1 或 NRF_GPIO)。
13. 每个 LED 的掩码和端口定义
#ifdef BSP_LED_0
#define BSP_LED_0_MASK PIN_MASK(BSP_LED_0)
#define BSP_LED_0_PORT PIN_PORT(BSP_LED_0)
#else
#define BSP_LED_0_MASK 0
#define BSP_LED_0_PORT 0
#endif
// 其他 LED 类似
根据是否定义了相应的 BSP_LED_X 宏,为每个 LED 生成掩码和端口定义。如果未定义,则掩码和端口都设为 0。
14. 所有 LED 和按键的总掩码宏定义
#define LEDS_MASK (BSP_LED_0_MASK | BSP_LED_1_MASK | \
BSP_LED_2_MASK | BSP_LED_3_MASK | \
BSP_LED_4_MASK | BSP_LED_5_MASK | \
BSP_LED_6_MASK | BSP_LED_7_MASK)
#define BUTTONS_MASK (BSP_BUTTON_0_MASK | BSP_BUTTON_1_MASK | \
BSP_BUTTON_2_MASK | BSP_BUTTON_3_MASK | \
BSP_BUTTON_4_MASK | BSP_BUTTON_5_MASK | \
BSP_BUTTON_6_MASK | BSP_BUTTON_7_MASK)
分别将所有 LED 和按键的掩码进行按位或操作,得到所有 LED 和按键的总掩码。
15. LED 控制宏定义
#define LEDS_OFF(leds_mask) do { ASSERT(sizeof(leds_mask) == 4); \
NRF_GPIO->OUTSET = (leds_mask) & (LEDS_MASK & LEDS_INV_MASK); \
NRF_GPIO->OUTCLR = (leds_mask) & (LEDS_MASK & ~LEDS_INV_MASK); } while (0)
#define LEDS_ON(leds_mask) do { ASSERT(sizeof(leds_mask) == 4); \
NRF_GPIO->OUTCLR = (leds_mask) & (LEDS_MASK & LEDS_INV_MASK); \
NRF_GPIO->OUTSET = (leds_mask) & (LEDS_MASK & ~LEDS_INV_MASK); } while (0)
#define LED_IS_ON(leds_mask) ((leds_mask) & (NRF_GPIO->OUT ^ LEDS_INV_MASK) )
#define LEDS_INVERT(leds_mask) do { uint32_t gpio_state = NRF_GPIO->OUT; \
ASSERT(sizeof(leds_mask) == 4); \
NRF_GPIO->OUTSET = ((leds_mask) & ~gpio_state); \
NRF_GPIO->OUTCLR = ((leds_mask) & gpio_state); } while (0)
#define LEDS_CONFIGURE(leds_mask) do { uint32_t pin; \
ASSERT(sizeof(leds_mask) == 4); \
for (pin = 0; pin < 32; pin++) \
if ( (leds_mask) & (1 << pin) ) \
nrf_gpio_cfg_output(pin); } while (0)
定义了一系列用于控制 LED 的宏:
• LEDS_OFF:熄灭指定的 LED。
• LEDS_ON:点亮指定的 LED。
• LED_IS_ON:判断指定的 LED 是否点亮。
• LEDS_INVERT:反转指定 LED 的状态。
• LEDS_CONFIGURE:将指定的引脚配置为输出模式,用于控制 LED。
16. C++ 兼容结束声明
#ifdef __cplusplus
}
#endif
如果是 C++ 编译环境,结束 extern "C" 声明。
17. 头文件保护宏结束
#endif
结束头文件保护宏,确保头文件内容只被包含一次。 总的来说,这个头文件为开发板的 GPIO 操作,特别是 LED 和按键的控制,提供了统一的接口和配置方式,方便在不同的开发板上进行应用开发。
以下是对 BOARDS_H 头文件中定义的函数和宏的功能详细说明:
函数 1. LED 操作函数
• bool bsp_board_led_state_get(uint32_t led_idx); ◦
功能:获取指定索引的 LED 当前状态。若 LED 处于点亮状态则返回 true,反之返回 false。 ◦ 参数:led_idx 是 LED 的索引,从 0 开始计数。
• void bsp_board_led_on(uint32_t led_idx); ◦
功能:点亮指定索引的 LED。 ◦ 参数:led_idx 是 LED 的索引,从 0 开始计数。
• void bsp_board_led_off(uint32_t led_idx); ◦
功能:熄灭指定索引的 LED。 ◦ 参数:led_idx 是 LED 的索引,从 0 开始计数。
• void bsp_board_led_invert(uint32_t led_idx); ◦
功能:反转指定索引 LED 的状态,即若 LED 点亮则熄灭,若熄灭则点亮。 ◦
参数:led_idx 是 LED 的索引,从 0 开始计数。
• void bsp_board_leds_off(void); ◦
功能:熄灭开发板上的所有 LED。
• void bsp_board_leds_on(void); ◦
功能:点亮开发板上的所有 LED。
2. 开发板初始化函数
• void bsp_board_init(uint32_t init_flags); ◦
功能:对开发板进行初始化操作,依据传入的 init_flags 参数来决定初始化哪些部分(如 LED 和按键)。
参数:init_flags 是初始化标志,可通过 BSP_INIT_NONE、BSP_INIT_LEDS、BSP_INIT_BUTTONS 等宏进行组合。
3. 引脚与 LED 索引转换函数
• uint32_t bsp_board_pin_to_led_idx(uint32_t pin_number); ◦
功能:把引脚编号转换为对应的 LED 索引。若传入的引脚编号无效,则返回 0xFFFFFFFF。 ◦
参数:pin_number 是引脚编号。
• uint32_t bsp_board_led_idx_to_pin(uint32_t led_idx); ◦
功能:将 LED 索引转换为对应的引脚编号。 ◦
参数:led_idx 是 LED 的索引,从 0 开始计数。
4. 按键操作函数
• bool bsp_board_button_state_get(uint32_t button_idx); ◦
功能:获取指定索引的按键当前状态。若按键被按下则返回 true,反之返回 false。 ◦
参数:button_idx 是按键的索引,从 0 开始计数。
• uint32_t bsp_board_pin_to_button_idx(uint32_t pin_number); ◦
功能:把引脚编号转换为对应的按键索引。若传入的引脚编号无效,则返回 0xFFFFFFFF。 ◦
参数:pin_number 是引脚编号。
• uint32_t bsp_board_button_idx_to_pin(uint32_t button_idx); ◦
功能:将按键索引转换为对应的引脚编号。 ◦
参数:button_idx 是按键的索引,从 0 开始计数。
宏 1. 开发板初始化标志宏
• #define BSP_INIT_NONE 0 ◦
功能:表示在初始化时不初始化 LED 和按键。
• #define BSP_INIT_LEDS (1 << 0) ◦
功能:表示在初始化时启用 LED。
• #define BSP_INIT_BUTTONS (1 << 1) ◦
功能:表示在初始化时启用按键。
2. 引脚掩码和端口宏
• #define PIN_MASK(_pin) (1u << (uint32_t)((_pin) & (~P0_PIN_NUM))) ◦
功能:根据传入的引脚编号 _pin 生成对应的引脚掩码,用于后续对引脚的操作。
• #define PIN_PORT(_pin) (((_pin) >= P0_PIN_NUM) ? NRF_P1 : NRF_GPIO) ◦
功能:依据传入的引脚编号 _pin 判断该引脚所属的端口,若引脚编号大于等于 P0_PIN_NUM 则属于 NRF_P1 端口,否则属于 NRF_GPIO 端口。
3. LED 和按键掩码宏
• #define LEDS_MASK (BSP_LED_0_MASK | BSP_LED_1_MASK | ... | BSP_LED_7_MASK) ◦ 功能:将所有 LED 的掩码进行按位或操作,得到所有 LED 的总掩码,用于对所有 LED 进行统一操作。
• #define BUTTONS_MASK (BSP_BUTTON_0_MASK | BSP_BUTTON_1_MASK | ... | BSP_BUTTON_7_MASK) ◦
功能:将所有按键的掩码进行按位或操作,得到所有按键的总掩码,用于对所有按键进行统一操作。
4. LED 控制宏
• #define LEDS_OFF(leds_mask) ◦
功能:熄灭由 leds_mask 指定的 LED。此宏仅支持 P0 端口,若 LED 位于其他端口则不适用。
• #define LEDS_ON(leds_mask) ◦
功能:点亮由 leds_mask 指定的 LED。此宏仅支持 P0 端口,若 LED 位于其他端口则不适用。
• #define LED_IS_ON(leds_mask) ◦
功能:判断由 leds_mask 指定的 LED 是否点亮。此宏仅支持 P0 端口,若 LED 位于其他端口则不适用。
• #define LEDS_INVERT(leds_mask) ◦
功能:反转由 leds_mask 指定的 LED 的状态。此宏仅支持 P0 端口,若 LED 位于其他端口则不适用。
• #define LEDS_CONFIGURE(leds_mask) ◦
功能:将由 leds_mask 指定的引脚配置为输出模式,用于控制 LED。此宏仅支持 P0 端口,若 LED 位于其他端口则不适用。
除了上述函数,BOARDS_H中还定义了哪些有用的功能?
除了前面提到的函数,BOARDS_H 头文件中还定义了很多其他有用的功能,主要通过宏定义和条件编译来实现,下面为你详细介绍:
1. 开发板特定头文件的包含
#if defined(BOARD_NRF6310)
#include "nrf6310.h"
#elif defined(BOARD_PCA10000)
#include "pca10000.h"
# ... 其他类似条件编译
#else
#error "Board is not defined"
#endif
• 功能:根据不同的 BOARD_* 宏定义,包含相应开发板的特定头文件。若未定义任何已知的开发板宏,会产生编译错误,提示用户需要定义开发板类型。这使得代码能够适配不同的硬件开发板,增强了代码的可移植性。
2. 扩展板头文件的包含 c #if defined (SHIELD_BSP_INC)
#include STRINGIFY(SHIELD_BSP_INC.h)
#endif
• 功能:如果定义了 SHIELD_BSP_INC 宏,就会包含对应的扩展板头文件。这为开发板添加扩展功能提供了便利,用户可以根据需要启用不同的扩展板。
3. 开发板初始化标志宏定义 c #define BSP_INIT_NONE 0
#define BSP_INIT_LEDS (1 << 0)
#define BSP_INIT_BUTTONS (1 << 1)
• 功能:这些宏用于表示开发板初始化时的不同标志。BSP_INIT_NONE 表示不初始化 LED 和按键;BSP_INIT_LEDS 表示初始化时启用 LED;BSP_INIT_BUTTONS 表示初始化时启用按键。可以通过位运算组合这些标志,灵活控制开发板的初始化过程。
4. LED 和按键编号宏定义 c #define BSP_BOARD_LED_0 0
#define BSP_BOARD_LED_1 1
# ... 其他 LED 编号宏
#define BSP_BOARD_BUTTON_0 0
#define BSP_BOARD_BUTTON_1 1
# ... 其他按键编号宏
• 功能:为开发板上的 LED 和按键定义了统一的编号,从 0 开始计数。这些编号可用于后续的 LED 和按键操作函数,提高了代码的可读性和可维护性。
5. 引脚掩码和端口宏定义 c #define PIN_MASK(_pin) (1u << (uint32_t)((_pin) & (~P0_PIN_NUM)))
#define PIN_PORT(_pin) (((_pin) >= P0_PIN_NUM) ? NRF_P1 : NRF_GPIO)
• PIN_MASK(_pin):根据传入的引脚编号 _pin 生成对应的引脚掩码。引脚掩码可用于位操作,方便对特定引脚进行控制。 • PIN_PORT(_pin):根据引脚编号判断引脚所属的端口。如果引脚编号大于等于 P0_PIN_NUM,则认为该引脚属于 NRF_P1 端口,否则属于 NRF_GPIO 端口。
6. 每个 LED 和按键的掩码和端口定义 c #ifdef BSP_LED_0
#define BSP_LED_0_MASK PIN_MASK(BSP_LED_0)
#define BSP_LED_0_PORT PIN_PORT(BSP_LED_0)
#else
#define BSP_LED_0_MASK 0
#define BSP_LED_0_PORT 0
#endif
# ... 其他 LED 类似
#ifdef BSP_BUTTON_0
#define BSP_BUTTON_0_MASK (1<<BSP_BUTTON_0)
#else
#define BSP_BUTTON_0_MASK 0
#endif
# ... 其他按键类似
• 功能:对于每个 LED 和按键,如果对应的宏(如 BSP_LED_0、BSP_BUTTON_0)被定义,则使用 PIN_MASK 和 PIN_PORT 宏生成对应的掩码和端口;否则,将掩码和端口都定义为 0。这为每个 LED 和按键提供了独立的掩码和端口信息,方便对单个元件进行操作。
7. 所有 LED 和按键的总掩码宏定义 c #define LEDS_MASK (BSP_LED_0_MASK | BSP_LED_1_MASK | ... | BSP_LED_7_MASK)
#define BUTTONS_MASK (BSP_BUTTON_0_MASK | BSP_BUTTON_1_MASK | ... | BSP_BUTTON_7_MASK)
• 功能:将所有 LED 和按键的掩码进行按位或操作,得到所有 LED 和按键的总掩码。这些总掩码可用于对所有 LED 或按键进行统一操作,例如同时点亮所有 LED 或检测所有按键的状态。
8. LED 控制宏定义 c #define LEDS_OFF(leds_mask) ...
#define LEDS_ON(leds_mask) ...
#define LED_IS_ON(leds_mask) ...
#define LEDS_INVERT(leds_mask) ...
#define LEDS_CONFIGURE(leds_mask) ...
• LEDS_OFF(leds_mask):熄灭由 leds_mask 指定的 LED。 • LEDS_ON(leds_mask):点亮由 leds_mask 指定的 LED。 • LED_IS_ON(leds_mask):判断由 leds_mask 指定的 LED 是否点亮。 • LEDS_INVERT(leds_mask):反转由 leds_mask 指定的 LED 的状态。 • LEDS_CONFIGURE(leds_mask):将由 leds_mask 指定的引脚配置为输出模式,用于控制 LED。 这些宏提供了便捷的方式来控制 LED 的状态,并且使用掩码进行操作,使得可以同时控制多个 LED。需要注意的是,这些宏仅支持 P0 端口,如果 LED 位于其他端口,则不适用。