为什么我首先需要设置一个值,然后再设置嵌入式处理器中的GPIO方向?


16

我有一个全职的固件工程师职位。最近,我接到了一项任务,以检查GPIO配置并根据需要更改设置。我发现一些引脚配置错误,因此自然而然地我重新配置了它们,但是我被告知我按错误的顺序进行了配置。这是我在说的:

之前:
GPIO1.direction = INPUT;

之后:
GPIO1.direction = OUTPUT;
GPIO1.value = 0;

但是,在代码审查期间,我被告知我需要将初始化顺序更改为以下内容:

GPIO1.value = 0;
GPIO1.direction =输出;

换句话说,先设置值,然后再设置引脚的方向。我还被告知,这是现代处理器上的方式,因为它们使用两个寄存器,一个用于输入,一个用于输出,但是旧处理器仅使用一个寄存器,因此操作顺序无关紧要。
(注意:现代= ARM Cortex M3及更高版本,老= Intel 8051)

我要求在工作中提供更好的解释,但没有得到很好的答案。这就是为什么我决定在这里问。

所以这是我的问题:

  1. 为什么初始化顺序在新处理器上很重要?
  2. 为什么在旧处理器上初始化的顺序无关紧要?
  3. 他们在现代处理器中谈论什么两个寄存器?
  4. 他们在旧处理器上谈论什么单一寄存器?

如果有人可以提供某种图表,那会更好。


1
“现代”和“旧”处理器过于模糊,无法给出有用的答案。不同的架构具有不同的寄存器设置。不知道您在说什么,就无法对它们进行明智的评论。
尼克·约翰逊

@ IgnacioVazquez-Abrams不,不是真的。会议室中有很多经验丰富的工程师,他们说,如果按照我的方法来做,您会遇到故障。
flashburn 2015年

@NickJohnson Modern = ARM Cortex M4及更高版本,旧=
Intel8051。– flashburn

@BrianDrummond哈哈。非常好的解释。但是旧的处理器呢,例如8051。为什么这对他们来说无关紧要?
flashburn 2015年

2
使用数据表链接可以更轻松地回答第4季度。
pjc50

Answers:


22

最初的8051使用所谓的伪双向输出端口(带上拉的漏极开路),因此实际上没有端口方向设置。

当然,对于现代真正的双向输出端口,最好在启用端口引脚进行输出之前设置一个已知值,因为否则,您可能会在输出端产生瞬态,这可能会导致不良后果。

例如,在这里查看我的答案。

编辑:这是(相对)现代CMOS 微控制器的I / O引脚结构:

在此处输入图片说明

在许多其他微控制器中,TRIS(TRIState)被称为DDR(数据方向寄存器)。在这种情况下,如果TRIS锁存器输出为高电平,则两个晶体管均处于“关断”状态,但仍可读取端口。

对于较新的Microchip micro芯片,这里的I / O引脚结构稍微复杂一些。

在此处输入图片说明

同样,TRIS锁存器禁用输出。其中包括一个LAT锁存器,可帮助避免读取-修改-写入问题。在PIC系列上,您应该只写LAT寄存器(并从PORT寄存器读取)。

这是原始的8051和CMOS 8051经典I / O端口引脚内部电路(来自此来源):

在此处输入图片说明

还有一点额外的复杂性,就是有一个与上拉并联的加速晶体管,该晶体管被短暂地导通以克服外部电容。如您所见,根本没有TRIS / DDR控制。正常操作中使用的上拉MOSFET是“弱”的-它们足够小(低Idss),因此连接到该引脚的外部输出可以将伪双向端口线拉低。


感谢您的解释。我已经有一段时间没有使用硬件了,所以我很难从描述中理解解释。您介意提供图片吗?假设引脚配置硬件在现代处理器上的外观与在8051上的外观如何?我真的很感激。
flashburn

您所说的硬件是什么?芯片的内部GPIO电路?
Spehro Pefhany 2015年

没错 某种形式的图表将非常有帮助。
flashburn

16

如果先设置方向,则该引脚将短暂配置为输出其当前输出值是多少。如果先设置该值,则不会发生。

因此,按照建议的方式进行操作,可以避免输出上的毛刺,该毛刺的范围从无害到严重,具体取决于引脚所连接的对象。


谢谢。那么旧处理器又如何呢?旧= Intel 8051
flashburn

我对8051不熟悉。根据您的同事所说,如果同一个寄存器同时配置方向和值,则没关系,因为编译器会将两次写操作优化为一个。
尼克·约翰逊

2
同样出于上述原因,对于旧处理器来说,以这种“新”方式进行操作可能仍然是一个好习惯。不同的处理者可能有不同的要求,不同的供应商可能会提供比其他人更好的建议,并且不同的公司/雇主/团队可能对这些细节有不同的政策。
billt 2015年

2
的确……总是假设DIO已连接到厄运轨道激光上;)
迈克尔

4

假设默认方向为输入(即High-Z,这很有意义,因为我们不希望MCU在连接的线路上强加任何值),则设置端口的顺序是可取的,但不是必需的。实际上,当您的应用程序要求启动时端口的值不会是必需的,例如说1。然后,将值设置为0,然后更改方向。在这种情况下,应避免在设置方向和值之间可能出现瞬时“毛刺”,这可能会导致该引脚上的尖峰。对于具有这种逻辑的所有处理器,不仅是新处理器,都是如此。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.