工程实践_GPIO介绍

一.GPIO简介

GPIO(General-Purpose IO ports),也就是通用IO口。在嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对于这些设备/电路有的需要CPU为之提供控制手段,有的则需要被CPU用作输入信号。而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,比如灯亮与灭。对于这些设备/电路的控制,使用传统的串行口或并行口都不合适。所以在微控制芯片上一般都会提供一个“通用可编程IO接口”,也就是GPIO。

GPIO接口至少有两个寄存器,即“通用IO控制寄存器”与“通用IO数据寄存器”。数据寄存器的各位都直接引到芯片外部,而对数据寄存器中每一位的作用,即每一位的信号流通方向是输入还是输出,则可以通过控制寄存器中对应位独立的加以设置。这样,有无GPIO接口也就成为微控制器区别于微处理器的一个特征。

在实际的MCU中,GPIO是有多种形式的。比如,有的数据寄存器可以按照位寻址,有些却不能按照位寻址,这在编程时就要区分了。比如传统的8051系列,就区分成可位寻址和不可位寻址两种寄存器。另外,为了使用的方便,很多MCU把glue logic等集成到芯片内部,增强了系统的稳定性能,比如GPIO接口除去两个标准寄存器必须具备外,还提供上拉寄存器,可以设置IO的输出模式是高阻,还是带上拉的电平输出,或者不带上拉的电平输出。这在电路设计中,外围电路就可以简化不少。

注意:对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的。如果系统结构支持独立的IO地址空间,并且是端口映射,就必须使用汇编语言完成实际对设备的控制,因为C语言并没有提供真正的“端口”的概念。如果是内存映射,那就方便多了。

我们一个例子:
比如像寄存器(地址假定为0x48000000)写入数据0x01,那么可以进行如下设置:

#define A(volatile unsigned long *)0x48000000)

'''
A = 0x01;

'''

这实际上就是内存映射机制的方便性了。其中volatile关键字是嵌入式系统开发的一个重要特点。

将上述表达式进行分析,首先(volatile unsigned long *)0x048000000的意思是把0x048000000强制转换成volatile unsigned long类型的指针,我们可以记为p,那么就是#define A *p,也就是A为P指针指向位置的内容了。这里是通过内存寻址访问到寄存器A,可以读/写操作。

接下来我们看看嵌入式C语言编程中是如何来操作这些内存寻址的寄存器的:

#define CTL_REG_READ(addr) (*(volatile unsigned long *)(addr))
#define CTL_REG_WRITE(addr, val) (*(volatile unsigned long *)(addr)=(var))
发布了95 篇原创文章 · 获赞 37 · 访问量 3407

猜你喜欢

转载自blog.csdn.net/Rocky6688/article/details/103955330