大部分的在深圳的网友明天都能收到货了,最后20个预定的网友明天也会发出了。大家别急,教程也是一点一点写出来的,到手时正好能用上。 
 
上次,写了一个开发环境配置和资料的教程,地址在这里: 
http://www.amobbs.com/forum.php? ... page%3D1#pid7188038 
 
需要相关资料的,和遇到开发环境配置问题的网友可以在那个帖子里面提出问题。 
 
另外,很多网友私下找我们询问一些技术细节的问题,我们只能尽力而为了。因为几百个网友每人都要求我们一对一的指导的话,我们也要累趴下的:) 
 
好了,开始第二课! 
 
1 跑马灯 
对于学习单片机编程的人来说,“跑马灯”这个词再熟悉不过了,它基本是我们入门的第一个例子。 
本章我们就以“跑马灯”为例子,讲解nRF51822软件编程的第一课:GPIO。 
开始前还要唠叨一句,记得用nRFgo Studio擦除整个芯片哦,因为原来出厂有蓝牙程序的,不擦除不能下新的程序。 
 
1.1 nRF51822 AK board硬件介绍 
1.1.1 AK board (PCA10001)的LED资源 
AK board PCA10001上有两个按键和五个用户可编程的LED,它们被连接到nRF51822芯片的特定引脚上。请看 Table 1(或者开发板背面). 
 
Part        GPIO        Short 
Button0        P0.16         
Button1        P0.17         
LED 0        P0.18        SB6 
LED 1        P0.19        SB7 
LED 2        P0.20        SB8 
LED 3        P0.21        SB9 
LED 4        P0.22        SB10 
Table 1 按键和 LED 连接 
注意:此SB非彼SB,这里应该是short bridge的意思。板子上的某些GPIO被连到了特点的设备上(比如用于串口),但是同时也通过插针引出来了,如果你不想使用板载的功能,可以手动割断这个SB。 
这里再卖个关子,nRF51822有个很牛X的功能,类似于FPGA,这颗芯片的任意一个引脚可以配置成任意一个功能。以后的课程中会提到。 
 
1.1.2 AK board LED原理图 
按键是低电平有效的,就是说按下按键后,IO的输入端会被连接到地。按键没有外部的上拉电阻,所以如果要使用P0.16 和 P0.17 引脚上的两个按键,需要使能引脚的内部上拉电阻。 
 
 
LED是高电平有效的,就是说写一个逻辑的 (‘1’) 到相应的输出引脚,将点亮LED。 
可能了解电子的朋友看到下面这个图都会问:为什么是“共阴极”设计,而不是一般的“共阳极”设计呢? 
其实因为我们学习的这颗nRF51822芯片最大的一个特性就是低功耗,而这种低功耗必定是芯片经常处于“睡眠”状态。在“睡眠”状态下,引脚电平都是低,LED只有设计成“共阴极”设计才能更省电。 
 
 
1.1.3 AK board (PCA10001)LED三维图 
 
 
1.2.1 nRF51822的GPIO框图 
 
 
1.3.1 nRF51822的GPIO寄存器简介 
Register        Offset        Description 
保留        0x000        保留位[321] 
OUT        0x504        写GPIO端口,bit0对应pin0,bit1对应pin1... 
OUTSET        0x508        set单一GPIO端口,写“1”到0x00只能将pin0拉高,对其他pin无效 
OUTCLR        0x50C        clear单一GPIO端口,写“1”到0x00只能将pin0拉低,对其他pin无效 
IN        0x510        读GPIO端口,bit0对应pin0,bit1对应pin1... 
DIR        0x514        设置GPIO端口方向,类同于OUT 
DIRSET        0x518        设置GPIO端口方向,类同于OUTSET 
DIRCLR        0x51C        设置GPIO端口方向,类同于OUTCLR 
保留        0x520        保留位[120] 
PIN_CNF[0]        0x700        pin0的配置,详见后续内容 
....                 
PIN_CNF[31]        0x77C        pin31的配置,详见后续内容 
 
1.3.3 GPIO的PIN_CNF[x]寄存器简介 
ID        Field        Description 
A        DIR        设置pin[x]的方向,与DIR(0x514)等寄存器关联,修改其中一个另外一个自动改变 
B        INPUT        设置pin[x]的INPUT缓冲,为了省电可以写“1”断开缓冲,但是使用前必须写“0”连接上 
C        PULL        设置pin[x]的上下拉电阻,使用标准值为13kΩ的内部电阻 
D        DRIVE        设置pin[x]的驱动强度,std. drive, 0.5 mA,high-drive, 5 mA 
E        DRIVE        设置pin[x]的电平感知,写“1”感知高电平,写“0”感知低电平 
 
1.4 官方blink代码样例 
使用官方例程即可点亮LED0和LED1的blink程序(安装SDK后,源代码位于<keil path>\ARM\Device\Nordic\nRF51822\Board\PCA10001\blinky_example\) 
main函数请看: 
- int main(void)
 - {
 -   uint8_t output_state = 0;
 -   // Configure LED-pins as outputs
 -   // 设置LED_START到LED_STOP的引脚为输出
 -   nrf_gpio_range_cfg_output(LED_START, LED_STOP);
 -   while(true)
 -   {
 -     // 点亮LED
 -     nrf_gpio_port_write(LED_PORT, 1 << (output_state + LED_OFFSET));
 -     output_state = (output_state + 1) & BLINKY_STATE_MASK;
 -     nrf_delay_ms(100);
 -   }
 - }
 
 
  
[color=rgb(51, 102, 153) !important]复制代码 
 
相关宏定义位于头文件"pca10001.h"内: 
- #ifndef PCA10001_H
 - #define PCA10001_H
 - #define LED_START      18
 - #define LED0           18
 - #define LED_STOP       19
 - #define LED1           19
 - #define LED_PORT       NRF_GPIO_PORT_SELECT_PORT2
 - #define LED_OFFSET     2
 - #define BUTTON_START   16
 - #define BUTTON0        16
 - #define BUTTON_STOP    17
 - #define BUTTON1        17
 - #define RX_PIN_NUMBER  11
 - #define TX_PIN_NUMBER  9
 - #define CTS_PIN_NUMBER 10
 - #define RTS_PIN_NUMBER 8
 - #define HWFC           true
 - #define BLINKY_STATE_MASK   0x01
 - #endif
 
 
  
[color=rgb(51, 102, 153) !important]复制代码 
 
 
1.5 编译、下载与演示 
1.        在Keil μVision中打开 Blinky 工程, 或者 双击blinky.uvproj 文件。 
2.        从 Select Target 下拉列表中选择 nRF51822_xxaa(256K),然后点击Build 或者按键盘上的F7编译 Blinky 工程。 
3.        点击Load 图标, 下载并运行 Blinky 演示程序。 LED 0 和 LED 1 应该开始连续的闪烁了。 
 |