查看: 1416|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
沙发
发表于 2016-4-9 20:37:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大部分的在深圳的网友明天都能收到货了,最后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 应该开始连续的闪烁了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表