8、nRF52xx蓝牙学习(boards.h文件学习)-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug

8、nRF52xx蓝牙学习(boards.h文件学习)

 

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 位于其他端口,则不适用。

请登录后发表评论

    没有回复内容