主题 : 玩转NanoPi 2 裸机编程——04-按键检测 复制链接 | 浏览器收藏 | 打印
级别: 论坛版主
UID: 103400
精华: 0
发帖: 434
金钱: 2235 两
威望: 447 点
贡献值: 0 点
综合积分: 868 分
注册时间: 2014-04-24
最后登录: 2016-10-10
楼主  发表于: 2015-12-16 10:57

 玩转NanoPi 2 裸机编程——04-按键检测

以下内容转自: http://weibo.com/p/1001603917155212107692

像玩51单片机一样玩NanoPi2——按键检测

直接贴上main.c文件代码

/*像玩51单片机一样玩NanoPi2

按键检测实验

----by DikaVimenkey

功能:两个按键,每个按键控制一个LED


两个按键,一个LED灯,一个板载UserLED

UserLED GPIOB12

LED         接        GPIOB28

按键1接        GPIOB29

按键2接 GPIOB30


VCC的接口只有2个,再加上扩展板子上的一个,所以只接了三个*/


#include"gpio.h"

/*延时函数,没有确定的时间*/

void delay(unsignedint time)

{

while(time--);

}


void main(void)

{

/*初始化GPIOB*/

/*设置端口复用*/

GPIOBALTFN0 &= ~(0x3<<24);//清位,GPIOB12

GPIOBALTFN0 |= (0x2<<24);//置位,GPIOB12为GPIO模式

GPIOBALTFN1 &=~((0X3<<24)|(0x3<<26)|(0x3<<28));//清位,GPIOB28、29、30

GPIOBALTFN1 |=((1<<24)|(1<<26)|(1<<28));//置位,

//设置GPIOB28、29、30为GPIO模式

/*设置GPIOB模式*/

GPIOBOUTENB &=~(0x3<<29);                //设置GPIOB12为输出模式=1

GPIOBOUTENB |=((1<<28)|(1<<12));//设置GPIOB28为输出模式=1

//设置GPIOB29为输入模式=0

//设置GPIOB30为输入模式=0

/*预置GPIOB状态*/

GPIOBOUT &=~((1<<28)|(0<<12));//先置GPIOB28为低电平,让LED灭,

  //GPIOB12为高,UserLED灭

/*初始化检测输入的寄存器*/

GPIOBDETMODE1 &=~((0X3<<26)|(0x3<<28));//GPIOB29设置为低电平检测

//GPIOB30设置为低电平检测

GPIOBDETMODEEX &=~((1<<29)|(1<<30));//GPIOB29、30扩展位要置零

GPIOBINTENB &=~((1<<29)|(1<<30));//关闭检测中断

/*以上三行代码可以不写,如果需要按键中断的时候,就要写*/

/*初始化完毕*/


while(1)

{        

/*UserLED*/

if((GPIOBPAD& (1<<29)) ==(1<<29))        

{

delay(3000);                  

if((GPIOBPAD& (1<<29)) == (1<<29))

{

GPIOBOUT|= (1<<12);


}

delay(3000);

}

else

{

GPIOBOUT&= ~(1<<12);

}

/*LED*/

if((GPIOBPAD& (1<<30)) ==(1<<30))        

{

delay(3000);                  

if((GPIOBPAD& (1<<30)) == (1<<30))

{

GPIOBOUT&= ~(1<<28);

}

delay(3000);

}

else

{

GPIOBOUT|= (1<<28);

}

}

}


Main.c代码结束


程序注释已经很明白,不再过多解释。


如何GPIO输入呢?在处理器的数据手册中已经写明。



在使用GPIO输入的时候,需要先设置GPIO的端口复用为GPIO模式,然后在GPIOxOUTENB寄存器中设置GPIO为输入模式。这样才能用。


GPIOxDETMODE0/1的用途是设置端口检测模式,高电平/低电平/上升沿/下降沿。

GPIOxDET是中断标志位

GPIOxPAD是端口的状态,通过读取它来检测是高还是低电平

GPIOxINTENB是输入中断使能寄存器。






感谢   倚海听风

解决了编译代码链接时的报错。

将start.s文件的内容修改如下

.text

.global _start

_start:        

bstart

.word0x00000000

.word0x00000000

.word0x00000000

.word0x00000000

.word0x00000000

.word0x00000000

.word0x00000000

start:

bmain
级别: 新手上路
UID: 123653
精华: 0
发帖: 15
金钱: 75 两
威望: 15 点
贡献值: 0 点
综合积分: 30 分
注册时间: 2016-03-21
最后登录: 2016-07-01
1楼  发表于: 2016-05-30 14:15
gpio.h 在哪里啊