nrf51822裸机教程-GPIO

时间:2021-08-31 14:24:40

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

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 >=  && pin_num <= PIN_MAX){
        DIRSET =  << pin_num;
    }
} 

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

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

Void config_pin_input(uint8_t pin_num){
    If ( pin_num >=  && pin_num <= PIN_MAX){
        PIN_CNF[pin_num] =    ( << )        //做输入
                            |( << )        //座输入时需设置Connect input buffer
                            |( <<)        //使能上拉
                            |( << )        //标准的电平”0”和电平’”1”
                            |( <<)        //普通输入引脚,不产生DETECT signa
    }
} 

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

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

选择keil中的project->new project

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

nrf51822裸机教程-GPIO

之后会弹出如下界面。

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

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

nrf51822裸机教程-GPIO

之后工程结构如下:
nrf51822裸机教程-GPIO

然后新建文件 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);
    )
    {
         ){
            nrf_gpio_pin_clear(LED_PIN);        //按下按键就点灯
        }else{
            nrf_gpio_pin_set(LED_PIN);            //没按键就灭灯
        }
    }
    ;
}     

编译后下载就可以了

nrf51822裸机教程-GPIO的更多相关文章

  1. nrf51822裸机教程-UART

    art硬件模块通常都有内置的硬件接收buff,比如51822的硬件uart模块图如下 因为通常接收到uart数据时都会做一些处理.比如保存到数据,或者对数据做一些判断之类的. 如果uart的波特率设置 ...

  2. nrf51822裸机教程-PWM

    先简单介绍一下PWM的原理. 原理很简单. 假设COUNTER是个从0开始递增的计数器.  我们设置两个值 counter0 和counter1 在 COUNTER 计数到counter0的值时候翻转 ...

  3. nrf51822裸机教程-PPI

    Programmable Peripheral Interconnect即可编程外设互联 系统,该模块是51822 提供的一个特性. 目的是为了让51822 的外围模块可以不通过处理器而自动相互作用. ...

  4. nrf51822裸机教程-GPIOTE

    GPIO通常都会具有中断功能,上一讲的GPIO中并没有涉及到中断的相关寄存器. 51822将GPIO的中断相关做成了一个单独的模块GPIOTE,这个模块不仅提供了GPIO的中断功能,同时提供了 通过t ...

  5. nrf51822裸机教程-IIC

    关于IIC总线的核心有以下几点: :时钟线高电平期间必须保持数据线不变. :时钟线低电平期间可以改变数据. :时钟线和数据线上都要接上拉电阻,以使总线不工作时,两根线的电平都处于高电平状态. :每个传 ...

  6. nrf51822裸机教程-RTC

    RTC0被协议栈使用了.所以在跑蓝牙程序的情况下.RTC0不能使用. RTC相关寄存器如下: EVTEN,EVTENSET,EVTENCLR. 这三个寄存器用来设置是否使能某个事件.(TICK,OVR ...

  7. nrf51822裸机教程-SPI&lpar;主&rpar;

    关于SPI总线的介绍这里就不细说了,网上有很多介绍SPI总线时序的. SPI总线的本质就是一个环形总线结构,在时钟驱动下两个双向移位寄存器进行数据交换. 所以SPI总线的特色就是:传输一字节数据的同时 ...

  8. nrf51822裸机教程-硬件timer

    该讲介绍51822的Timer/Counter模块工作在timer模式下(定时器模式,还可以工作为计数器模式) 如何操作 51822的Timer/Counter结构如下图所示 Timer模块从PCLK ...

  9. nrf52裸机学习——GPIO操作

    /** * @brief Function for writing a value to a GPIO pin. * * Note that the pin must be configured as ...

随机推荐

  1. Schedule 学习

    现在做的项目都有用到Schedule,现在用一点时间来总结. 一.首先要到Nuget中下载Quartz.net. 二.下载下来了,你需要对它进行配置,使它能给你正常的使用. 三.在Global.asa ...

  2. 利用Jurassic在&period;net下运行js函数

    static void Main(string[] args) { var eng = new Jurassic.ScriptEngine(); eng.Evaluate("function ...

  3. 使用&lt&semi;c&colon;if&gt&semi;标签处理页面数据

    使用${feeList.feeType}来取值的时候,因为定义的是数值,刚好看到<c:if>标签的使用,套用代码如下 <td> <c:if test="${fe ...

  4. NuGet打包推送批处理以及MSBuild(通用版)

    使用时注意每个批处理里面的依赖工具路径指向 源码:https://github.com/easonjim/NuGetRun bug提交:https://github.com/easonjim/NuGe ...

  5. javascript 读取内联之外的样式&lpar;style、currentStyle、getComputedStyle区别介绍&rpar; &lpar;转载&rpar;

    样式表有三种方式: 内嵌样式(inline Style) :是写在Tag里面的,内嵌样式只对所有的Tag有效.   (也称作“内联样式”) 内部样式(internal Style Sheet):是写在 ...

  6. WinSock网络编程基础(3)server

    上一篇讲的是简单的发送数据的客户端的实现.接下来讲的是如何实现收发数据服务器.这里说的服务器其实就是一个进程,它需要等待任意数量的客户端与之建立起连接,以便响应它们的请求. 服务器必须在已知的名称上监 ...

  7. python--函数式登录程序

    # Author:Tim Gu def login(username,password): """这个login函数用于用户登录的验证 :param username:用 ...

  8. linux --&gt&semi; fork&lpar;&rpar;详解

    fork()详解 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个 ...

  9. 深入解读MySQL8&period;0 新特性 :Crash Safe DDL

    前言 在MySQL8.0之前的版本中,由于架构的原因,mysql在server层使用统一的frm文件来存储表元数据信息,这个信息能够被不同的存储引擎识别.而实际上innodb本身也存储有元数据信息.这 ...

  10. C&num; 操作Session、Cookie,Url 编码解码工具类WebHelper

    using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text ...