本人采用的是WaveShare的BLE400扩展板和Core51822核心板链接,例程中的Evaluation Board PCA10001上的程序可以完全不加修改移植到此板上。
顾名思义,此例程的功能就是两个灯交替闪烁。
首先从main()函数看起
int main(void) { // Configure LED-pins as outputs nrf_gpio_cfg_output(LED_0); nrf_gpio_cfg_output(LED_1); // LED 0 and LED 1 blink alternately. while(true) { nrf_gpio_pin_clear(LED_0); nrf_gpio_pin_set(LED_1); nrf_delay_ms(500); nrf_gpio_pin_clear(LED_1); nrf_gpio_pin_set(LED_0); nrf_delay_ms(500); } }首先是初始化LED控制引脚nrf_gpio_cfg_output,打开此函数所在头文件nrf_gpio.h找到函数nrf_gpio_cfg_output
static __INLINE void nrf_gpio_cfg_output(uint32_t pin_number) { /*lint -e{845} // A zero has been given as right argument to operator '|'" */ NRF_GPIO->PIN_CNF[pin_number] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos); }NRF_GPIO,PIN_CNF 找到这两个的定义,在nRF51.h中,可以看到NRF_GPIO是一个NRF_GPIO_Type类型的指针,指向NRF_GPIO_BASE地址
#define NRF_GPIO_BASE 0x50000000UL #define NRF_GPIO ((NRF_GPIO_Type *) NRF_GPIO_BASE)在nRF51.h中,主要定义了外设地址映射,nRF51系列的地址映射如下图: 详情见nRF51 Series Reference Manual。 继续分析,NRF_GPIO->PIN_CNF[pin_number]是通过控制PIN_CNF[pin_number]寄存器设置pin_number引脚的状态(有关寄存器信息查阅nRF51 Series Reference Manual)。移位符号<<后的参数是要设置的引脚属性(如GPIO_PIN_CNF_PULL_Pos是设置引脚上拉还是下拉),而<<前的参数是要设置的属性值(如GPIO_PIN_CNF_PULL_Disable是不设置上拉或下拉)。更多有关属性的定义在nrf51_bitfields.h中。同时在nRF51 Series Reference Manual中可以找到引脚属性。 再往下是主循环while(1),nrf_gpio_pin_clear(LED_0)清空LED_0引脚的输出,通过控制OUTCLR寄存器的值
static __INLINE void nrf_gpio_pin_clear(uint32_t pin_number) { NRF_GPIO->OUTCLR = (1UL << pin_number); }nrf_gpio_pin_set(LED_1)同理,然后通过延时实现led交替闪烁。 LED_0定义在boards/pca10001.h中
像nrf_gpio_cfg_output这种函数不知是不是库函数,在nRF51 SDK中并没有找到