overheat 发表于 2013-12-13 21:32:01

[nRF51822 AK II 教程]第二课,跑马灯(GPIO)。

本帖最后由 overheat 于 2013-12-13 21:52 编辑

大部分的在深圳的网友明天都能收到货了,最后20个预定的网友明天也会发出了。大家别急,教程也是一点一点写出来的,到手时正好能用上。

上次,写了一个开发环境配置和资料的教程,地址在这里:
http://www.amobbs.com/forum.php?mod=viewthread&tid=5562455&pid=7188038&page=1&extra=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        保留位
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        保留位
PIN_CNF        0x700        pin0的配置,详见后续内容
....               
PIN_CNF        0x77C        pin31的配置,详见后续内容

1.3.3 GPIO的PIN_CNF寄存器简介
ID        Field        Description
A        DIR        设置pin的方向,与DIR(0x514)等寄存器关联,修改其中一个另外一个自动改变
B        INPUT        设置pin的INPUT缓冲,为了省电可以写“1”断开缓冲,但是使用前必须写“0”连接上
C        PULL        设置pin的上下拉电阻,使用标准值为13kΩ的内部电阻
D        DRIVE        设置pin的驱动强度,std. drive, 0.5 mA,high-drive, 5 mA
E        DRIVE        设置pin的电平感知,写“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);
}
}
相关宏定义位于头文件"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_NUMBER11
#define TX_PIN_NUMBER9
#define CTS_PIN_NUMBER 10
#define RTS_PIN_NUMBER 8
#define HWFC         true

#define BLINKY_STATE_MASK   0x01

#endif

1.5 编译、下载与演示
1.        在Keil μVision中打开 Blinky 工程, 或者 双击blinky.uvproj 文件。
2.        从 Select Target 下拉列表中选择 nRF51822_xxaa(256K),然后点击Build 或者按键盘上的F7编译 Blinky 工程。
3.        点击Load 图标, 下载并运行 Blinky 演示程序。 LED 0 和 LED 1 应该开始连续的闪烁了。

zgxcom123 发表于 2013-12-13 22:36:34

赞!!!!!!!

topdog 发表于 2013-12-13 22:51:27

overheat 发表于 2013-12-13 22:52:59

topdog 发表于 2013-12-13 22:51
我的板子昨天就到了,我也开始了4.0——!!
悄悄的问下,有么有双模的,
不兼容3.0以下不是个好方法。


双模的都比较贵,一般在手机和电脑里面采用的。听说过高通有的。

ijlc1314 发表于 2013-12-13 22:53:20

进来学习,E文不好,看数据手册有点吃力

topdog 发表于 2013-12-13 23:07:47

techh 发表于 2013-12-14 11:56:39

这样的教程不错

kevin_me 发表于 2013-12-14 13:05:25

留名,今天板子能到,都是usb调试器要晚一点。

fulitun 发表于 2013-12-14 13:20:32

板子还没有到,已经是第二课了{:cry:}

overheat 发表于 2013-12-14 14:22:38

别急,可能赶上1212物流压力比较大。这两天的课程都是上手基础课。

elunlang2000 发表于 2013-12-14 22:59:43

板子还没有到,查了查,周六周天不派送,唉。。。。。。。。。。

qiqirachel 发表于 2013-12-15 11:37:29

板子到手了,好薄啊,怕一不小心给掰断了 !!~~~~~~~~~~~~~~~

饭牛牛 发表于 2013-12-15 17:03:08

qiqirachel 发表于 2013-12-15 11:37
板子到手了,好薄啊,怕一不小心给掰断了 !!~~~~~~~~~~~~~~~

我也是, 第一感觉就是: 哇, 这开发板好薄.

kevin_me 发表于 2013-12-15 21:42:25

留个名 ……

techh 发表于 2013-12-16 09:37:01

板子收到了,哈哈

sokou 发表于 2013-12-16 13:03:30

板子到了。可以试这个程序了。

lzl000 发表于 2013-12-17 20:40:05

顶一个,之前没看到,还以为没更新呢
页: [1]
查看完整版本: [nRF51822 AK II 教程]第二课,跑马灯(GPIO)。