Rocker 发表于 2007-8-30 08:28:57

请教:在ICC中如何实现对AVR单片机的软复位

想通过一个按键和一个I/O口实现复位,目的是想增强抗干扰能力。

david1234 发表于 2007-8-30 08:32:04

关闭中断,启动watchdog,等待watchdog复位.

Rocker 发表于 2007-8-30 08:49:32

谢谢,除看门狗呢,还有没有其他办法?

Rocker 发表于 2007-8-30 08:58:30

void (*reset)(void)=0x0000;

...

int main(void)

{

...

reset();

...

}



在其他帖子上看到的,但看不懂什么意思啊。

Rocker 发表于 2007-9-13 10:49:35

这个函数在复位时,不对单片机的所有资源进行复位吗?包括i/o.我接了一个小灯,复位时还是保持高电平

stm32_boy 发表于 2009-10-30 12:02:04

mark

machao 发表于 2009-10-30 13:28:34

首先要明白AVR的复位要做什么事情,以及过程如何。然后看你的代码才能决定如何实现AVR的软件复位。

注意,下面的讨论不包括BOOTLOAD方式。

AVR的复位(上电复位)有一个重要的事情:就是将决大部分的寄存器复位成复位初始值,然后从$0000读取第一条指令,开始执行代码。

3楼方式是让AVR从直接跳到$0000开始执行,这只是实现了上电复位的第2步,而此时寄存器的值并不是复位的初始值,因此样的复位与硬件的RESET复位还是有差别的。只有当你的代码在开始部分有对所有寄存器都做过初始化设置的话,这样的方式才等效硬件复位。

比较彻底的软件复位是利用AVR的watchdog,因为watchdog本身可以实现真正的硬件复位。

hithyy 发表于 2009-10-30 18:42:39

马老师讲的透彻。

szgr 发表于 2009-10-30 19:36:59

不知道楼主如何利用一个按键和I/O口增强抗干扰能力???
要用按键复位,直接接到复位线上好了。

dssz 发表于 2011-11-20 01:23:23

回复【3楼】Rocker
void (*reset)(void)=0x0000;
...
int main(void)
{
...
reset();
...
}
在其他帖子上看到的,但看不懂什么意思啊。
-----------------------------------------------------------------------

void (*reset)(void)=0x0000;//函数指针定义,指针值为0,即函数开始地址为0
...
int main(void)
{
...
reset();//调用函数指针
...
}

lauyual 发表于 2011-11-20 01:26:22

又受教了

lauyual 发表于 2011-11-20 01:26:35

又受教了

xmlai 发表于 2011-11-20 11:31:59

还不如用三5加521实现呢!这样还简单呢!

zhcj66 发表于 2014-2-11 15:29:04

machao 发表于 2009-10-30 13:28
首先要明白AVR的复位要做什么事情,以及过程如何。然后看你的代码才能决定如何实现AVR的软件复位。

注意, ...

我也比较支持看门狗这种做法,走个死循环 让狗咬死 哈哈 简单实用 一了百了,无后顾之忧{:lol:}
页: [1]
查看完整版本: 请教:在ICC中如何实现对AVR单片机的软复位