nRF51 SDK 例程分析——Blinky Example

来源:互联网 发布:求100以为的质数 java 编辑:程序博客网 时间:2024/06/05 23:43

本人采用的是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中并没有找到

0 0
原创粉丝点击