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
原创粉丝点击