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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值