文章目录
前言
近期以普中DSPTMS320F28335开发板为基础,学习了F28335的片上外设GPIO的相关内容。
F28335的共有176个管脚,其中有88个为GPIO管脚,这88个GPIO口又可分为3组,即A组(GPIO0-GPIO31)、B组(GPIO32-GPIO63)、C组(GPIO64~GPIO87)。本文将以A组GPIO为例,对F28335的GPIO的结构、相关寄存器、引脚复用情况以及使用过程中的具体注意事项予以详细说明。
1. GPIO的结构
图1给出了A组GPIO0-GPIO27的内部结构图,其余A组(GPIO28-GPIO31)、B组、C组的GPIO结构图与此大体相似,只是有细微的不同,在之后予以详细说明。
从图中可以看到,每一个GPIO的内部结构可分为9部分。
1.1 上拉部分
如图1中的①所示,这一部分由GPIO上拉失能寄存器(GPxPUD,x=A,B,C)控制,其中0为上拉,1为不上拉。上电复位后,GPIO0-GPIO11默认不上拉,其余的GPIO全部为上拉。经过实际测量,GPIO在不上拉或者输出低电平时,电压为0V;在上拉或者输出高电平时,电压为3.3V左右。
1.2 复用功能选择部分
如图1中的②所示,每一组GPIO有两个复用寄存器,即GPxMUX1/2(x=A,B,C),这两个复用寄存器均是32位的,因此每两位控制一个GPIO功能的选择,一个GPIO最多复用为4种功能(参考F28335的数据手册)。上电复位后所有GPIO默认为通用输入输出口。
GPxMUX1/2中GPIO的复用结果送到图1中的第3、4、7部分。
1.3 方向控制部分
如图1中的④、⑤所示,这一部分主要控制GPIO工作于输出状态。上电复位后,④部分选择器默认输出为0,而⑤部分复位引脚为低电平,导致图1中⑤部分或门输出1,这就使得GPIO工作于输入状态,即上电复位后,所有的GPIO工作于输入状态。
当电路稳定时,只有当GPIO为通用输入输出口时,才可设置方向寄存器GPxDIR(x=A,B,C),其中0配置GPIO为输入,1配置GPIO为输出,这一点也可以从逻辑框图④、⑤中看到;当GPIO复用为其它功能时,此时GPxDIR失效,GPIO是否作为输出由外设输出使能决定。
1.4 输出选择部分
如图1中的③所示,这一部分主要用于GPIO配置为输出时输出相应的数据。当GPIO配置为通用输入输出口且为输出模式时,数据寄存器GPxSET、GPxCLEAR、GPxTOGGLE、GPxDAT(x=A,B,C)均可用;当GPIO复用为其它功能且为输出模式时,GPIO输出的数据由③中选择器的外设输出部分决定。
1.5 输入量化部分
如图1中的⑥所示,当GPIO配置为通用输入输出口且为输入模式时,⑥中的量化部分(阴影部分)可以配置使用,通过控制寄存器GPxCTRL(x=A,B)来控制采样周期(若主频为150MHz,则一个采样周期为6.67ns),通过量化选择寄存器GPxQSEL1/2寄存器来控制采样次数(默认为一个采样周期);当GPIO复用为其它功能时,此时输入的数据既可以走同步也可以走异步。
注意:C组GPIO无此部分。
1.6 输入选择部分
如图1中的⑦所示,当GPIO配置为通用输入输出口时,⑥中输出的数据保存在数据寄存器GPxDAT(x=A,B,C)中;当GPIO复用为其它功能时,此时输入的数据输出到⑦中选择器的其它路径。
1.7 低功耗配置部分
如图1中的⑧所示。
注意:C组GPIO无此部分。
1.8 中断配置部分
如图1中的⑨所示。
注意:C组GPIO无此部分。
2. GPIO相关的寄存器
2.1 GPIO控制寄存器
2.2 GPIO数据寄存器
2.3 GPIO中断和低功耗寄存器
3. GPIO复用情况
3.1 A组GPIO复用情况
3.2 B组GPIO复用情况
3.3 C组GPIO复用情况
4. 其它注意情况
4.1 不同GPIO内部结构对比
图8给出了A组GPIO28-GPIO31的结构图,与图1中A组其它GPIO的结构进行对比可以发现第③、④、⑦部分不同。
可以看到第③、④、⑦部分均与GPAMUX1/2有关,通过查阅A组GPIO复用情况(图5)可以发现:GPIO0-GPIO27中每一个GPIO都可以复用为4个功能(包括三个外设和一个通用输入输出口);而GPIO28-GPIO31仅可以复用为3个功能,这就导致了A组下不同GPIO结构的不同。
另外,GPIO复用为不同的外设时,外设的工作特性也是导致GPIO结构不同的原因之一。
上述分析对于B组和C组GPIO同样适应。
4.2 数据寄存器使用注意事项
从图3可以看到,GPIO的数据寄存器主要有GPxDAT、GPxSET、GPxCLEAR以及GPxTOGGLE(x=A、B、C)四类,在使用时需要注意以下事项:
- GPxDAT寄存器显示了GPIO引脚当前的高低电平状态,与该引脚处于哪个模式(输入、输出)以及复用为哪个功能无关。只要读GPxDAT相应的位就可以获取到相应GPIO引脚的状态;
- 当GPIO复用为除通用输入输出口的其它功能时,操作GPxSET、GPxCLEAR以及GPxTOGGLE(x=A、B、C)没有意义,此时GPxDAT只用作指示GPIO引脚的电平状态;
- 当引脚配置为GPIO输出时,写入GPxDAT、GPxSET、GPxCLEAR以及GPxTOGGLE中的值将设置相应的GPIO引脚为高或低(通过GPxDAT改变引脚电平和通过GPxSET、GPxCLEAR以及GPxTOGGLE改变引脚电平实质上是一样的);当引脚配置为GPIO输入时,GPxDAT、GPxSET、GPxCLEAR以及GPxTOGGLE(x=A、B、C)均可以写入,但是写入的值将被锁存,并不会将电平反应到引脚上,直到将GPIO配置为输出时;
- 从GPxDAT寄存器中读取的值只反映当前GPIO引脚的电平状态,而不是GPxDAT寄存器的输出锁存器的状态。例如:当GPIO15处于输入状态并上拉时,GPADAT的GPIO15位,读回来的是1;向GPADAT的GPIO15位写入0,再次读GPADAT的GPIO15位,读回来的是仍然是1。因此为了避免将引脚从输入更改为输出时电平的突变现象,需要事先初始化GPxDAT或者GPxSET、GPxCLEAR、GPxTOGGLE(x=A、B、C)寄存器。
- 上电复位后将重置GPxDAT寄存器所有位为0,读GPxSET、GPxCLEAR以及GPxTOGGLE(x=A、B、C)只能返回0。
4.3 输入量化
A组和B组GPIO具有输入量化功能,对于一个输入信号,GPx_CTRL寄存器控制该信号的采样周期,GPxQSEL1/2寄存器控制该信号的采样次数。
当采样次数为3或者6时,只有当输入信号稳定时长(全0或者全1)超过3次采样或6次采样的时间时,量化部分才能输出最终的GPIO的电平,否则将重新计时。
可见,输入信号的量化可以滤去毛刺信号同时可以减小输入信号波动所带来的影响,但是正常情况下(非量化情况且配置GPIO为输入时)GPIO引脚的电平信号是实时读取的,因此量化所带来的后果是我们需要经一定的延时才能读到GPIO引脚的状态。
总结
本文详细说明了3组GPIO的内部结构,给出了与GPIO相关的寄存器以及它们的复用情况,最后对使用GPIO过程中遇到的一些特殊情况作了总结。
接下来我将对GPIO作为通用输入输出口控制LED、继电器、电机等外设时遇到的问题作一个说明!