本帖最后由 辉**歌 于 2016-5-18 09:34 编辑
1. 引言 在第4讲“我的‘潘多拉魔盒’4 — samba服务器搭建详细过程和GPIO开发初探”中采用了Python的GPIO库进行了流水灯的示例开发。但要完成我的项目“智能车多功能遥控器开发”,必须能够完成GPIO的输入输出操作,而流水灯只有输出操作,看了大多数烧友进行NanoPi的GPIO的开发示例也基本只有输出的例子,很少有涉及输入的开发的,而我要做遥控器的开发,遥控器上的按键是作为输入,必须得进行GPIO的输入开发。 开始使用Python进行输入开发时,由于现有python库对GPIO输入控制的底层驱动不健全,基本无法使用,而我的按键是最普通的按键和NanoPi wiki所提供示例的按键不一样。所以我决定放弃现有的不完整的python库,采用配置寄存器的方法在Geany环境中进行输入输出的开发。其原理主要是通过mmap()函数将寄存器的地址通过映射到用户层,然后在用户层即可操作寄存器,控制方法参考三星S5P4418用户手册,这是一个需要耐心的过程。 2. 硬件接线说明(1) 简易遥控器的硬件部分所需材料见表1: 表1 简易遥控器开发所需材料
(2) 按键及发光二极管接线如图1所示,控制的逻辑关系如表2所示。其中,按键主要连接GPIO的C组接口,LED灯连接GPIO的B组接口,具体的接口号见图1。 基本的控制关系是: 1) C11的按键按下时B30灯亮代表着小车前进,松下按键时灯灭代表停止前进; 2) C13的按键按下时B27灯亮代表着小车右转,松下按键时灯灭代表停止右转; 3) C7的按键按下时B29灯亮代表着小车左转,松下按键时灯灭代表停止左转; 4) C8的按键按下时B31灯亮代表着小车后退,松下按键时灯灭代表停止后退。
图1 按键及发光二极管接线说明
表2 按键控制的对应的LED灯代表小车的动作逻辑关系
(3) 硬件布局和接线完成实物见图2-3所示。
图2 接线实物效果
图3 对应GPIO接口
3. 软件程序开发本部分的开发主要参考三星S5P4418用户手册,很多同学可能刚看这个有点不知怎么去用这个手册,其实很简单,参考如下步骤就可以揭开它神秘的外纱。 1) 确定GPIO接口的复用功能函数 首先打开手册至 2.3.2Ball List Table: Sorted by Function 查看GPIOC13, 11, 8, 7复用功能函数均为 AlternateFunction 1. 意思是将GPIOC13, 11, 8, 7对应的引脚定义为GPIO的功能,而不是其他的功能(如UART功能,或TX功能,或PWM功能等)。
图4 GPIOC13, 11, 8, 7的复用功能函数为AlternateFunction 1 查看GPIOB31, 30, 29, 27的复用功能函数也均为AlternateFunction 1.如图5所示:
图5 GPIOB31, 30, 29, 27的复用功能函数也均为AlternateFunction 1 2) 确定GPIO引脚号与复用功能函数ALTFN寄存器的位号对应关系 打开手册至15.4.1.8GPIOxALTFN0 可查得GPIOx13引脚号对应GPIOXALTFN0寄存器的第27和第26位(Bit[27:26], 以第0位开始),如过这两位设置为[0 1]则为GPIOx13引脚选择ALT Function1的功能,即GPIO功能,也就是将该引脚定义为GPIO引脚。 同理将GPIOC11, 8,7对应GPIOXALTFN0寄存器的位置分别设置01即可,如图6-7所示;将和GPIOB31,30,29,27对应GPIOXALTFN1寄存器的位置分别设置01即可,如图8所示。
图6 将GPIOXALTFN0寄存器的第27和第26位分别设置为0和1
图7 将GPIOXALTFN0寄存器的第[23:22],[17:16],[15:14]位分别设置为0和1
图8 GPIOB31,30,29,27对应GPIOXALTFN1寄存器
3) 设置输入输出使能寄存器GPIOXOUTENB 打开手册至15.4.1.2GPIOxOUTENB 如图9所示,可见GPIOxOUTENB寄存器有32位,每一位代表相应的GPIOxPin引脚号Pin的值,如第31位为GPIOx31引脚,若将其设置为1则该引脚定义为输出,若设置为0则定义为输入。
图9输出/入使能 4) 设置输入检测模式寄存器GPIOxDETMODE0和GPIOxDETMODEEX 打开手册至15.4.1.3GPIOxDETMODE0 将检所使用的GPIO的C组引脚C13,11,8,7测模式设置为高电平检测,也就是将对应的GPIOxDETMODE0寄存器的对应位设置为01,而将GPIOxDETMODEEX的对应位全设置为0. 如图10-11所示。
图10 输入电平检测模式寄存器设置
图11 检测模式扩展寄存器设置 具体程序细节如下: //C13=[27:26],C11=[23:22],C8=[17:16],C7=[15:14], 检测模式设置为 01 GPIOCDETMODE0 &=~((0x2<<26)|(0x2<<22)|(0x2<<16)|(0x2<<14)); // C13=bit[13],C11=[11],C8=[8],C7=[7] = 0 检测模式拓展为设置为0 GPIOCDETMODEEX &=~((0x1<<13)|(0x1<<11)|(0x1<<8)|(0x1<<7));
5) 初始化输出寄存器 参见手册15.4.1.1 GPIOxOUT 将GPIO的B组引脚B31,30,29,27初始输出为0。如图12所示,具体程序细节如下: GPIOBOUT &= ~((0x1<<31)|(0x1<<30)|(0x1<<29)|(0x1<<27));
图12 输出寄存器初始化设置
6) 主循环,检测到按键高电平就点亮对应LED灯 这里主要是检测只读状态寄存器GPIOxPAD,参考手册15.4.1.7 GPIOxPAD的说明,如图13所示。读取C13,11,8,7引脚对应GPIOxPAD寄存器的位,若为1则说明输入的是高电平,若为0则说明是输入的是低电平。
图13 GPIOxPAD状态寄存器读取说明 具体程序细节如下: if(GPIOCPAD & (0x1<<13)) // 判断C13引脚是否有高电平输入 { usleep(100000); GPIOBOUT&= ~(0x1<<27); // 若有高平输入,则让B27的灯亮 } else { GPIOBOUT|= (0x1<<27); // 若无高平输入,则B27的灯灭 } 其它按键对应LED灯的程序与之类似,最终的完整程序见图14和附件。
图14 头文件和基地址定义
图15 打开芯片C组GPIO寄存器物理内存文件并映射为虚拟地址
图16 将B组GPIO寄存器物理内存文件映射为虚拟地址
图17 设置GPIO输入输出功能和电平检测模式
图18 主循环检测按键输入判断对应LED输出代表相应的小车动作
图19 前进和后退的控制
图20 左转控制和运行结束和关闭寄存器文件
最后运程结果如图所示:
图21 前进控制前灯亮
图22 后退控制后灯亮
图23 右转控制右灯亮
图24 左转控制左灯亮
4. 总结 至此,本节内容结束,遥控器也初具模样,通过寄存器配置的方式实现了基本的输入输出控制。下一步将进行无线串口 通信功能的开发,由于最近比较忙可能更新会稍晚一些,但一定会尽心尽力完成。中间可能会穿插一些小的玩法,比如通过网页登陆NanoPi M2远程操控,实现NanoPi真正意义的物联网价值。
2
评分
-
查看全部评分
|
|
|
|