GPIO

 首先应该理解什么是GPIOGPIO,英文全称为General-Purpose IO ports,也就是通用IO口。在嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要CPU为之提供控制手段,有的则被CPU用作输入信号。而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,比如灯亮与灭。对这些设备/电路的控制,使用传统的串行口或并行口都不合适。所以在微控制器芯片上一般都会提供一个通用可编程IO接口,即GPIO。接口至少有两个寄存器,即通用IO控制寄存器通用IO数据寄存器。数据寄存器的各位都直接引到芯片外部,而对这种寄存器中每一位的作用,即每一位的信号流通方向,则可以通过控制寄存器中对应位独立的加以设置。这样,有无GPIO接口也就成为微控制器区别于微处理器的一个特征。

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

      明白了这个道理,不同的MCU,提供的GPIO口的数目不同,可选择的glue logic也不同。所以,在了解共性的基础上去了解个性。

另外需要注意的是,对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的。如果系统结构支持独立的IO地址空间,并且是端口映射,就必须使用汇编语言完成实际对设备的控制,因为C语言并没有提供真正的端口的概念。如果是内存映射,那就方便的多了。举个例子,比如像寄存器A(地址假定为0x48000000)写入数据0x01,那么就可以这样设置了。

#define A (*(volatile unsigned long *)0x48000000)
...
     A = 0x01;
...

      这实际上就是内存映射机制的方便性了。其中volatile关键字是嵌入式系统开发的一个重要特点。这个就不再这里总结了。上述表达式拆开来分析,首先(volatile unsigned long *)0x48000000的意思是把0x48000000强制转换成volatile unsigned long类型的指针,暂记为p,那么就是#define A *p,即A为P指针指向位置的内容了。这里就是通过内存寻址访问到寄存器A,可以读/写操作。



ARM的GPIO设置主要

1,设置GPIO的ID,设置哪一个gpio;

2,设置GPIO的功能号,设置为那种模式,包括普通GPIO,特殊功能1,特殊功能2,。。。比如某个GPIO可以选择设置为普通gpio或者串口的输入,或者USB的D+功能之一,主要看datasheet的功能表

3,设置GPIO方向为输入还是输出

4,设置GPIO的驱动能力,1ma,2ma,3ma,4ma,5ma,6ma,7ma,8ma,16ma等等

5,设置GPIO的上拉的电压域为多少伏特(可选择,有些处理器没有这个功能)

6,可配置弱上拉电阻或下拉电阻。

7,设置输出电平为高电平还是低电平

8,处理器睡眠的时候的GPIO状态,高电平,低电平,float,或者保持状态

9,作为中断源的触发条件,上升沿,下降沿,上升和下降沿,高电平,低电平,

例如:SD卡中断可以设置上升沿,下降沿对应位都为1。这样插进卡和拔出卡就可以用同一个中断。不需要使用两个GPIO中断来实现。

调用request_irq把中断处理函数挂上去了,信号发生变化时,中断处理函数自然就被调用了。

如果一个GPIO对应于一个中断(一级中断),则相应的中断位就会被设置成1;如果一堆GPIO对应一个中断(二级中断),则,中断位被设置成1后还得查询那一个GPIO产生的中断。

10,某些GPIO可将CPU从深度睡眠模式中唤醒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值