是否需要将AVR寄存器和端口初始化为零?


9

在我的代码的初始化例程中,我用于执行以下操作:

clr    r0  ; will always stay zero

和:

out    PORTA, r0; initialize ports
out    DDRA, r0
out    PORTB, r0
...

这真的有必要吗?还是可以确定重置后自动完成此操作?特别是,我是否可以默认将所有端口设置为输入,以便在不执行任何代码时外部电压没有问题?

Answers:


6

复位后,AVR的I / O端口设置为INPUT /三态/ Hi-Z(DDRx = 0x00)。大多数微控制器(如果不是全部?)都有此行为。插入引脚是最安全的状态。因此,可以,您可以依靠端口将其自动设置为输入。

ATmega16的一些摘录准确地表明:

在此处输入图片说明

复位条件生效时,即使时钟未运行,端口C引脚也处于三态。


1
这正是我一直在寻找的东西:)
Stefan Paul Noack 2012年

据我所记得,如果将输入悬空,则会在其上产生随机噪声,因此初始状态可以为零,可以,但是在第一个时钟周期后它可能会变为非零。
miceuz '04 -4-10

@miceuz关键是不要让输出处于未知状态。它们可以具有已连接到所述微控制器在外部电路上的不期望的影响
m.Alin

1
@miceuz您是指端口输入寄存器,对吗?它们的初始状态为N / A(这很有意义,因为它们仅反映施加在引脚上的内容)。但是我指的是数据方向寄存器。我只是想确保我不会意外将端口设置为输出,可能会与施加到该引脚的电压发生冲突。
Stefan Paul Noack

噢,真的,对不起噪声..
miceuz

4
  • 不管数据手册说什么,端口初始化总是一个好主意。

  • 如果数据表什么也没说,那么这是一个至关重要的想法。


如果您关心程序运行时将发生的情况,则仅需要定义端口数据内容。

如果您不关心结果,则不必设置端口数据位:-)。

如果制造商在数据表中明确说过设置或清除了端口数据位,则可能是它们,但无论如何都要自己进行初始化还是一个非常好的主意。“边界条件”是大多数事情出错的地方-例如循环的开始,循环的结束,循环缓冲区包装圆点,...。处理器启动与硬件等效。在一个充满噪音,故障和人员的现实世界中,尽可能多地负责程序的命运是一个好主意。端口初始化是其中的简单部分。


完全同意。我只是想,可能没有跳转到硬件重置,而是有可能跳到了程序启动,或者-间接跳转出错时最近发生的事情-程序计数器溢出并再次达到0x0000。谁知道那之后港口将处于什么状态...
Stefan Paul Noack 2012年

1

复位后,寄存器和SRAM都不会初始化,只有一些外设寄存器才会初始化。您应该初始化您使用的东西。


您是否知道或链接到丢失的外围寄存器?我UCSRC在数据表中找到了一些“初始值” 。I / O端口,尤其是数据方向如何?
Stefan Paul Noack '04年

2
I / O端口设置为输入。全部在数据表中。
莱昂·海勒2012年

@LeonHeller哦,谢谢,现在我明白了。在寄存器说明中。我不知所措...
Stefan Paul Noack 2012年

@ noah1989,Leon是正确的,外围寄存器的初始值总是在寄存器的可视化下方指定(或任何带有单个位名称的图像称为:))。
avakar
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.