IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 嵌入式学习笔记之GPIO详解 -> 正文阅读

[嵌入式]嵌入式学习笔记之GPIO详解

一、 什么是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)进行与操作,就得到该端口的低电平,高电平也是一样的道理。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-29 09:31:07  更:2021-08-29 09:33:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 7:41:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计