Chinaunix首页 | 论坛 | 博客
  • 博客访问: 605621
  • 博文数量: 165
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1554
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-23 22:57
个人简介

我本仁慈,奈何苍天不许

文章分类

全部博文(165)

文章存档

2018年(1)

2016年(33)

2015年(5)

2014年(34)

2013年(92)

分类: 嵌入式

2016-07-21 14:11:42

原文地址:nrf51822裸机教程-GPIO 作者:ifndef


nordic BLE 交流群498676838


首先看看一下相关的寄存器说明
 

Out寄存器 输出设置寄存器

每个比特按顺序对应每个引脚,bit0对应的就是 引脚0

该寄存器用来设置 引脚作为输出的时候的 输出电平为高还是低。


与输出设置相关的 还有另外两个寄存器

OUTSETOUTCLR

OUTSET用来设置某个引脚的输出为高电平

OUTCLR用来设置某个引脚的输出为低电平

这两个寄存器同OUT寄存器一样 每个位按顺序对应每个引脚。但有个特别的地方在于OUTSET和OUTCLR两个寄存器的每个bit都是写1有效,写0无效。



比如在引脚都被设置为输出的情况下:

将OUTSET赋值为0x03那么引脚0和引脚1将输出高电平,其他引脚不收影响(输出电平不变)

将OUTCLR赋值为0x80那么引脚7将输出低电平,其他引脚电平不收影响。


这样的特性也是为什么有设设置输出的寄存器 OUT后还要引入OUTSET和OUTCLR寄存器的原因。

比如你需要将引脚3的输出电平设置为高,那么如果只有OUT寄存器的情况下,你需要先读出OUT寄存器然后修改值再写会。原因在于你只需要修改引脚2而不需要改变其他引脚的状态

 A = OUT;

A |= 0x04;

OUT = A;

但是有OUTSET寄存器的话就和方便,只需要OUTSET = 0x04就可以设置引脚2输出高电平同时不改变其他引脚的状态。

同样要单独设置某个引脚输出低电平时用OUTCLR寄存器就可以了


DIR寄存器用来设置引脚是作为输入引脚还是输出引脚

如上的输出控制寄存器,DIR 同样也有两个单独设置输入还是输入的寄存器DIRSET和DIRCLR

作用和上面说的也是一样,这里不赘述


最后剩下 PIN_CNF寄存器。 每个引脚都有其对应的 PIN_CNF寄存器。

主要是设置一些 更具体的设置。像是最为输入时的是否有上拉/下拉电阻。驱动的强度(我都是直接用S0S1,没有单独测试每个强度的区别),以及引脚作为输入时设置的 input buffer。

有一个比较特殊的设置是SENSE,这个是一个深度睡眠唤醒机制。

深度睡眠时普通的中断是无法将处理器从睡眠状态唤醒的。51822从深度睡眠状态唤醒可以通过 PIN_CNF 中的这个SENSE来设置某个引脚可以产生DETECT signal来作为深度睡眠唤醒引脚。(另外的唤醒方式还有LPCOMP模块产生的ANADETECT signal 以及复位)


比如,将PIN_CNF[4]寄存器设置为输入脚,并且其中的SENSE位的值设置3,那么引脚4就作为深度睡眠的唤醒脚,并且在引脚4的电平变为低的时候就会将处理器从深度睡眠状态中唤醒。


如果只是简单的设置一个引脚作为输入可以直接使用DIR相关的函数设置某个引脚作为输出就可以了

比如如下实现


//Pin_num从0开始

Void config_pin_output(uint8_t pin_num){

    If ( pin_num >= 0 && pin_num <= PIN_MAX){

        DIRSET = 1 << pin_num;

}

}



如果是设置引脚作为输入引脚需要设置PIN_CNF寄存器。

比如只是设置某个引脚作为简单的输入功能。

Void config_pin_input(uint8_t pin_num){

    If ( pin_num >= 0 && pin_num <= PIN_MAX){

        PIN_CNF[pin_num] = (1 << 0)         //做输入

                            |(0 << 1)     //座输入时需设置Connect input buffer

                                                                 |(0 <<2)                //使能上拉

                                                                 |(0 << 8)               //标准的电平”0”和电平’”1”

                                                                 |(0 <<16)             //普通输入引脚,不产生DETECT signa

}

}




nordic 的SDK中提供了很多GPIO相关的设置函数,均在nrf_gpio.h头文件中以内联函数形式定义了。


我是用的开发工具是keil5,用的sdk是9.0.下面演示创建一个nrf51的工程的步骤

选择keil中的project->new project

选择你的设备对应的芯片。我的板子是 51422_xxac

之后会弹出如下界面。

这里我们只是写一个很简单的按键点灯程序,没有用到SDK中提供的其他相关工程。所以下面勾选一个CMSIS下的COREdevice下的startup,以及nRF_Drivers下的nrf_gpio就行了。这样工程就会自动添加设备的 .s启动文件以及相关配置


如果需要的话,可以设置工程产生  .hex

之后工程结构如下:

然后新建文件 main.c 编写如下代码

 

#include "nrf_gpio.h"

 

//定义自己板子上的 按键 和 led灯 的引脚

#define BUTTON_PIN      17

#define LED_PIN               21

 

int main(void){

 

         nrf_gpio_pin_pull_t config = NRF_GPIO_PIN_PULLUP;

        

         nrf_gpio_cfg_output(LED_PIN);

         nrf_gpio_cfg_input(BUTTON_PIN, config);

        

         while(1){

                   if ( nrf_gpio_pin_read(BUTTON_PIN) == 0 ){

                            nrf_gpio_pin_clear(LED_PIN);                            //按下按键就点灯

                   }else{

                            nrf_gpio_pin_set(LED_PIN);                                //没按键就灭灯

                   }

         }

         return 0;

}

 

编译后下载就可以了






阅读(695) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~