大部分的在深圳的网友明天都能收到货了,最后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 应该开始连续的闪烁了。
|