在我的代码的初始化例程中,我用来执行以下操作:
clr r0 ; will always stay zero
和:
out PORTA, r0; initialize ports
out DDRA, r0
out PORTB, r0
...
这真的有必要吗?或者我可以确定这是在重置时自动完成的吗?特别是,我可以依靠默认将所有端口设置为输入,以便在不执行代码时外部电压没有问题吗?
在我的代码的初始化例程中,我用来执行以下操作:
clr r0 ; will always stay zero
和:
out PORTA, r0; initialize ports
out DDRA, r0
out PORTB, r0
...
这真的有必要吗?或者我可以确定这是在重置时自动完成的吗?特别是,我可以依靠默认将所有端口设置为输入,以便在不执行代码时外部电压没有问题吗?
AVR 的 I/O 端口在复位时设置为 INPUT / Tri-State / Hi-Z (DDRx = 0x00)。大多数微控制器(如果不是全部?)都有这种行为。这是引脚处于最安全的状态。所以是的,您可以依靠端口自动设置为输入。
ATmega16 的一些摘录正好表明:
当复位条件变为有效时,端口 C 引脚处于三态,即使时钟未运行也是如此。
不管数据表说什么,端口初始化总是一个好主意。
如果数据表什么也没说,那么这是一个非常重要的想法。
如果您关心程序运行时会发生什么,您只需要定义端口数据内容。
如果您不关心结果,则不必设置端口数据位:-)。
如果制造商在数据表中明确说明端口数据位已设置或清除,那么它们可能是但无论如何自己初始化它们仍然是一个非常好的主意。“边界条件”是大多数事情出错的地方 - 例如循环开始,循环结束,循环缓冲区环绕点,......。处理器启动是硬件等价物。在一个充满噪音、故障和人员的现实世界中,尽可能多地掌握程序的命运是一个非常好的主意。端口初始化是其中的一个简单部分。
寄存器和 SRAM 都不会在复位时初始化,只有一些外围寄存器。你应该初始化你使用的东西。