一、 什么是gpio
gpio,英文全称为general-purpose io ports,也就是通用io口。在嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要cpu为之提供控制手段,有的则需要被cpu用作输入信号。而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,比如灯亮与灭。对这些设备/电路的控制,使用传统的串行口或并行口都不合适。所以在微控制器芯片上一般都会提供一个“通用可编程io接口”,即gpio。接口至少有两个寄存器,即“通用io控制寄存器”与“通用io数据寄存器”。数据寄存器的各位都直接引到芯片外部,而对这种寄存器中每一位的作用,即每一位的信号流通方向,则可以通过控制寄存器中对应位独立的加以设置。这样,有无gpio接口也就成为微控制器区别于微处理器的一个特征。
二、 gpio之lcd控制编程
s3c2440有130个i/o端口,分为a-j共9组:gpa、gpb、gpj,可以通过设置寄存器来确定某个引脚用于输入、输出还是特殊功能。比如:可以设置gph6作为输入、输出、或者用于串口。
1、通过寄存器来操作gpio引脚
1)gpxcon寄存器它用于配置引脚的功能端口a与端口b-j在功能上有所不同,gpacon中每一位对应一根引脚(共23根引脚)当某位为0时,对应引脚为输出,此时在gpadat中相应位写入0或1,让此引脚输出低电平或高电平;当某位被设为1时,对应引脚为地址线或用于地址控制,此时gpadat保留不用。gpacon通常被设为全1,以便访问外部存储设备端口b-j在寄存器操作上完全相同,pxcon中每两位控制一根引脚,00表示输入,01表示输出,10表示特殊功能,11保留不用。
2)gpxdat寄存器它用于读写引脚,当引脚被设为输入时,读此寄存器得到对应引脚的电平状态是高还是低;当引脚被设为输出时,写此寄存器相应位可令此引脚输出高低电平。
3)gpxup寄存器gpxup,某位为1时,相应引脚无内部上拉电阻;为1时,相应引脚使用内部上拉电阻上拉电阻、下拉电阻的作用在于,当gpio引脚出于第三态(非高低电平,而是高阻态,即相当于没接芯片)时,它的电平状态由上拉电阻和下拉电阻确定。
gpio控制lcd编程实例:
[cpp] view plain copy print?
#include
void delay(int times)
{
int i;
for(;times》0;times--)
for(i=0;i《400;i++);
}
int main(void)
{
int i;
gpbcon =10000000000; /*配置gpb5为输出 (参考图1)*/
gpbup =~100000; /*配置gpb5上拉电阻使能(参考图2)*/
for(i=0;i《10000;i++)
{
/* led1亮 */
gpbdat = ~100000; /*gpb5低电平*/
delay(1000);
/* led1灭 */
gpbdat = 100000; /*gpb5高电平*/
delay(1000);
}
}
...
其实上面的例子存在一个非常重要的问题,就是在配置某引脚的时候把其他引脚的值也进行了修改。在实际应用中,有可能其他引脚正在执行某操作,而我们这样进行配置的时候,修改掉其他引脚可能引发不可收拾的后果,那我们应该如何操作呢?
三、 引脚配置的按位“与”和按位“或”操作
先来看看上述代码用按位“与”和按位“或”操作修改之后的效果再来讲解:
[cpp] view plain copy print?
#include
#define gpf5_out (1《《(5*2))
#define gpf5_msk (3《《(5*2))
void delay(int times)
{
int i;
for(;times》0;times--)
for(i=0;i《400;i++);
}
int main(void)
{
int i;
gpbcon &=~(gpf5_msk); /*gpb5数据清零*/
gpfcon |= gpf5_out; /*配置gpb5为输出 (参考图1)*/
for(i=0;i《10000;i++)
{
/* led1亮 */
gpbdat &= ~(1《《5); /*gpb5低电平*/
delay(1000);
/* led1灭 */
gpbdat |= (1《《5); /*gpb5高电平*/
delay(1000);
}
}
先来分析两个宏定义:
#define gpf5_out (1《《(5*2))
#define gpf5_msk (3《《(5*2))
分别将gpf5_out定义为1左移10、变为:1000,0000,000,gpf5_msk定义为3(即二进制11)左移10、变为:1100,0000,0000。
语句gpbcon &=~(gpf5_msk): /*gpb5数据清零*/:gpf5_msk进行非操作变成:0011,1111,1111,任何数与其进行与操作,最高两位(的出来的结果均为00xx,xxxx,xxxx,x为未知),这样就可以达到对应位清零效果。
语句gpfcon |= gpf5_out:任何数与gpf5_out(1000,0000,000)进行或操作,最高位必为1,变成1xxx,xxxx,xxx。加上前面未显示出来的0,就可以将该引脚的端口5配置为输入引脚即01。
同理,将gpbdat配置为低电平可以使其与1左移5的非(100000 -》01111)进行与操作,就得到该端口的低电平,高电平也是一样的道理。
手机,数码相机和可冲印照片最大尺寸对照表
FPGA增强了数码相册功能
lcd为什么叫瞎眼屏
苹果iPad mini Pro曝光:支持5G网络
HSD插头插座在设备上使用时的注意事项
嵌入式学习电路学习之gpio的那些事
Modbus转以太网模块在某污水处理系统中的应用
刷脸时代,工控机如何应用在人脸识别系统中?
基于LabVIEW开发的免费半开源的测试软件“简易测试”
宁畅R620服务器刷新24项SPEC世界纪录
关于ARM架构与x86的概述以及应用的全面解析
谁投资了法拉第未来 贾跃亭背后金主系香港放债公司
华为紧急大量备货 闪存出货容量暴涨
半导体技术:测序的未来
LC低通滤波器基本原理是什么
罗罗将打造出一款全球最快的全电动飞机
日本计划到2022年全面掌握全固态电池相关技术
蔡司三坐标测量仪尺寸检测设备
高清,地面数字电视选屏是关键
机加工自动化生产线的优势