NRF51822 GPIO
来源:互联网 发布:淘宝天天特价是正品吗 编辑:程序博客网 时间:2024/06/05 15:58
引脚的使用是最普遍也是最简单的,无非是配置,写(置位、置零、翻转),读,引脚中断。
GPIO简介
- 51822有31个引脚(可惜我的电路板引出来的只有很少的几个),分别是P0.0-P0.30,可以通过管脚配置寄存器PIN_CNF[n] register (n=0..30),对每个管脚进行单独的配置。配置的参数包括:
- Direction 方向(输入、输出)
- Drive strength 驱动方式(开漏输出、推挽输出等)
- Enabling of pull-up and pull-down resistors 允许上/下拉电阻
- Pin sensing
- Input buffer disconnect
- Analog input (for selected pins) 模拟输入(只对特定的AD引脚)
GPIO操作
初始化
#include "nrf_gpio.h"
这个库文件已经封装的很好了,初始化很简单,设置输出或者输入,简单明了。
#define LED_0 8 // led1 引脚P0.8#define LED_1 9 // led2 引脚P0.9#define LED_2 10 // led3 引脚P0.10#define key1 22 //key1 引脚P0.22#define key2 21 //key2 引脚P0.21void led_init(void){ // Configure LED-pins as outputs nrf_gpio_cfg_output(LED_0); nrf_gpio_cfg_output(LED_1); nrf_gpio_cfg_output(LED_2); // Configure KEY-pins as inputs nrf_gpio_cfg_input(key1,NRF_GPIO_PIN_PULLUP);//设置管脚上拉输入 nrf_gpio_cfg_input(key2,GPIO_PIN_CNF_PULL_Pulldown);//设置管脚下拉输入}
引脚写操作
nrf_gpio_pin_set(LED_0); //输出高电平nrf_gpio_pin_clear(LED_0); //输出低电平nrf_gpio_pin_toggle(LED_0); //电平翻转
引脚读操作
if( nrf_gpio_pin_read(KEY_1)== 0 )
上拉引脚电平为零的时候就是按键按下接地的时候。
GPIOTE
GPIO Tasks and Events
Tasks and Events
- nRF51822的寄存器和一般的单片机有所差别,nRF51822的寄存器分为下面的三种类型。
- Task :任务寄存器,可以由程序或事件触发。
- Event:事件寄存器,事件可以产生中断或触发任务。
- Register:普通寄存器,和一般单片机的寄存器一样。
- Task和event使得操作片上外设十分方便简洁,只需进行少量的配置,即可轻松运用各种外设。同时,Task和event能有效减少CPU的占用时间,降低CPU的负荷。
GPIOTE简介
- 由于在大多数情况下GPIO的状态变化都会触发应用程序执行一些动作。为了方便nRF51官方把该流程封装成了GPIOTE,全称:The GPIO Tasks and Events (GPIOTE) 。
- 共有四个GPIOTE通道。
GPIOTE功能
- Task可以执行
- 置位
- 清除
- 翻转
- Event事件有(可用于中断)
- 上升沿
- 下降沿
- 任意电平跳变
- Tasks和Events通过CONFIGn配置,每个CONFIG[n]寄存器对应一组OUT[n] 任务寄存器和IN[n]事件寄存器。OUT[n]用于写管脚,IN[n]由管脚状态变化触发。
- 当把某个管脚分配给OUT[n]任务或IN[n]事件后,该管脚就只能被GPIOTE模块写操作,正常的GPIO写入无效。
- 一旦配置OUT[n]任务或IN[n]事件控制某个管脚,那么该管脚的输出值只能通过GPIOTE模块操作,使用GPIO的寄存器操作会被忽略。
- 当GPIOTE通道被配置用于操作一个任务管脚时,CONFIG[n]寄存器中的OUTINIT决定了该管脚脚的初始值。可以通过配置OUTINIT来设置管脚初始化状态为高电平或是低电平。
GPIO中断
- 步骤
- 中断初始化
- 中断使能
- 中断优先级设置
中断示例
void EXIT_Init(void) //中断初始化{ //1、将相应的终端输入IO管脚设置为输入模式 nrf_gpio_cfg_input(key1,NRF_GPIO_PIN_PULLUP);//设置管脚位上拉输入 //2、通过CONFIG[n]设置GPIOTE通道 NRF_GPIOTE->CONFIG[0] = (0x02UL << 16) // (GPIOTE_CONFIG_POLARITY_HiToLo<<GPIOTE_CONFIG_POLARITY_Pos) //触发方式POLARITY | (key1<< 8UL) // | (key1<<GPIOTE_CONFIG_PSEL_Pos) //关联任务OUT[n]或者事件IN[n]的引脚PSEL | (0x01); // | (GPIOTE_CONFIG_MODE_Event<<GPIOTE_CONFIG_MODE_Pos); //模式 //3、通过INTENSET寄存器进行使能中断 NRF_GPIOTE->INTENSET = GPIOTE_INTENSET_IN0_Set << GPIOTE_INTENSET_IN0_Pos;// 使能中断类型: NVIC_EnableIRQ(GPIOTE_IRQn);//使能GPIOTE中断 //NVIC_SetPriority(GPIOTE_IRQn,3);//设置中断优先级}void GPIOTE_IRQHandler(void) //中断服务函数{ //1、判断中断类型(是否是所需的中断以及是否使能过) if ((NRF_GPIOTE->EVENTS_IN[0] == 1) && (NRF_GPIOTE->INTENSET & GPIOTE_INTENSET_IN0_Msk)) { //2、对中断标志进行清零,以便程序下次能够正常进入中断 NRF_GPIOTE->EVENTS_IN[0] = 0; //中断事件清零. //3、进行中断处理 LED2_Toggle();//led翻转 }}
代码说明
- 需添加头文件
#include "nrf51.h"
- main函数中只需要初始化EXIT_Init函数即可。
led_init();EXIT_Init();
扩展阅读(深度挖掘中断)
- nRF51822外部中断学习总结 - jet007_007的博客 - 博客频道 - CSDN.NET http://blog.csdn.net/jet007_007/article/details/51535875
0 0
- NRF51822 GPIO
- NRF51822 GPIO
- nrf51822裸机教程-GPIO
- NRF51822
- nRF51822
- gpio
- gpio
- GPIO
- GPIO
- GPIO
- GPIO
- GPIO
- GPIO
- GPIO
- GPIO
- GPIO
- gpio
- GPIO
- 关于KVC
- Spring Boot 静态资源处理
- 【研究分析】告诉你一个真实的 OpenStack:都谁在用,用来干什么?
- 笛卡尔积算法的Java实现
- 01背包--限制--hdu3466
- NRF51822 GPIO
- js文件被浏览器缓存的思考
- 如何实现在Alert提示框之后跳转页面(笔记)
- nginx配置防盗链及伪静态
- JavaWeb---JSTL标签库(core标签库)
- swt 做界面时部分要点
- Java_集合—Collection—Map
- 接口与端口的区别
- IOS NSMutableString可变字符串