nrf51822裸机教程-GPIO
首先看看一下相关的寄存器说明
Out寄存器 输出设置寄存器
每个比特按顺序对应每个引脚,bit0对应的就是 引脚0
该寄存器用来设置 引脚作为输出的时候的 输出电平为高还是低。
与输出设置相关的 还有另外两个寄存器
OUTSET和OUTCLR
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的
之后会弹出如下界面。
这里我们只是写一个很简单的按键点灯程序,没有用到SDK中提供的其他相关工程。所以下面勾选一个CMSIS下的CORE,device下的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); ) { ){ nrf_gpio_pin_clear(LED_PIN); //按下按键就点灯 }else{ nrf_gpio_pin_set(LED_PIN); //没按键就灭灯 } } ; }
编译后下载就可以了
nrf51822裸机教程-GPIO的更多相关文章
- nrf51822裸机教程-UART
art硬件模块通常都有内置的硬件接收buff,比如51822的硬件uart模块图如下 因为通常接收到uart数据时都会做一些处理.比如保存到数据,或者对数据做一些判断之类的. 如果uart的波特率设置 ...
- nrf51822裸机教程-PWM
先简单介绍一下PWM的原理. 原理很简单. 假设COUNTER是个从0开始递增的计数器. 我们设置两个值 counter0 和counter1 在 COUNTER 计数到counter0的值时候翻转 ...
- nrf51822裸机教程-PPI
Programmable Peripheral Interconnect即可编程外设互联 系统,该模块是51822 提供的一个特性. 目的是为了让51822 的外围模块可以不通过处理器而自动相互作用. ...
- nrf51822裸机教程-GPIOTE
GPIO通常都会具有中断功能,上一讲的GPIO中并没有涉及到中断的相关寄存器. 51822将GPIO的中断相关做成了一个单独的模块GPIOTE,这个模块不仅提供了GPIO的中断功能,同时提供了 通过t ...
- nrf51822裸机教程-IIC
关于IIC总线的核心有以下几点: :时钟线高电平期间必须保持数据线不变. :时钟线低电平期间可以改变数据. :时钟线和数据线上都要接上拉电阻,以使总线不工作时,两根线的电平都处于高电平状态. :每个传 ...
- nrf51822裸机教程-RTC
RTC0被协议栈使用了.所以在跑蓝牙程序的情况下.RTC0不能使用. RTC相关寄存器如下: EVTEN,EVTENSET,EVTENCLR. 这三个寄存器用来设置是否使能某个事件.(TICK,OVR ...
- nrf51822裸机教程-SPI(主)
关于SPI总线的介绍这里就不细说了,网上有很多介绍SPI总线时序的. SPI总线的本质就是一个环形总线结构,在时钟驱动下两个双向移位寄存器进行数据交换. 所以SPI总线的特色就是:传输一字节数据的同时 ...
- nrf51822裸机教程-硬件timer
该讲介绍51822的Timer/Counter模块工作在timer模式下(定时器模式,还可以工作为计数器模式) 如何操作 51822的Timer/Counter结构如下图所示 Timer模块从PCLK ...
- nrf52裸机学习——GPIO操作
/** * @brief Function for writing a value to a GPIO pin. * * Note that the pin must be configured as ...
随机推荐
- Hark的数据结构与算法练习之堆排序
前言 堆排序我是看了好半天别人的博客才有了理解,然后又费了九牛二虎之力才把代码写出来,我发现我的基础真的很差劲啊……不过自己选的路一定要坚持走下去.我试着把我的理解描述出来,如有不妥之处希望大家可以指 ...
- Hark的数据结构与算法练习之归并排序
算法说明: 归并排序的思路就是分而治之,将数组中的数字递归折半进行排序. 递归到最底层就只剩下有两个数字进行比较,再从底层往下进行排序合并.最终得出结果. 同样,语言描述可能对于不知道这个算法的人来说 ...
- libyuv 编译 for android
libyuv is an open source project that includes is an instrumentation framework for building dynamic ...
- node基础 --工具
npm //Node.js Package Manager 查询版本号:npm --version/npm version 查询模块:npm search <name> 查看模块相关信息 ...
- HDU1247 Hat’s Words(Trie树)
常规做法是枚举每个字符串每个位置,时间复杂度O(n*len*len),(建字典树O(n*len)). 然而我看这题第一眼想的是时间复杂度O(n*len)的算法..就是建正反两棵字典树,每个字符串跑分别 ...
- 三十分钟掌握STL
这是本小人书.原名是<using stl>,不知道是谁写的.不过我倒觉得很有趣,所以化了两个晚上把它翻译出来.我没有对翻译出来的内容校验过.如果你没法在三十分钟内觉得有所收获,那么赶紧扔了 ...
- TYVJ P1083 分糖果 Label:bfs
描述 童年的我们,将和朋友分享美好的事物作为自己的快乐.这天,C小朋友得到了Plenty of candies,将要把这些糖果分给要好的朋友们.已知糖果从一个人传给另一个人需要1 秒的时间,同一个小朋 ...
- 解决xubuntu的thunar第一次启动慢
装了Xubuntu后,一直都挺好,只不过就是有一个问题老困扰我,就是每次开机打开thunar都是极慢的.... 一直没注意,原来也一直找不到问题,后来今天一搜,唷呵...找到了. 解决方法 thuna ...
- 【wikioi】1553 互斥的数(hash+set)
http://wikioi.com/problem/1553/ 一开始我也知道用set来判a[i]/p是否在集合中,在的话就直接删掉. 但是我没有想到要排序,也没有想到当存在a,b使得a/p==b时到 ...
- 设置TOMCAT的JVM虚拟机内存大小
你知道如何设置TOMCAT的JVM虚拟机内存大小吗,这里和大家分享一下,JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序.这个初始内存和最大内存在一定程度都会影响程序的性能. 设置 ...