[技术问答]

N76E003 看门狗

[复制链接]
3508|22
手机看帖
扫描二维码
随时随地手机跟帖
15228869197|  楼主 | 2018-7-2 14:52 | 显示全部楼层 |阅读模式

void Enable_WDT_Reset_Config(void)
{
          set_IAPEN;
    IAPAL = 0x04;
    IAPAH = 0x00;
    IAPFD = 0x0F;
    IAPCN = 0xE1;
    set_CFUEN;
    set_IAPGO;                                  //trigger IAP
                while((CHPCON&SET_BIT6)==SET_BIT6);          //check IAPFF (CHPCON.6)
    clr_CFUEN;
    clr_IAPEN;
}
void main (void)
{

  Set_All_GPIO_Quasi_Mode;

        clr_GPIO1;
        Timer0_Delay1ms(50);                                        //toggle I/O to show MCU Reset
        set_GPIO1;
        Timer0_Delay1ms(50);
        clr_GPIO1;
        Timer0_Delay1ms(50);
        set_GPIO1;
        Timer0_Delay1ms(50);

        
//----------------------------------------------------------------------------------------------
// WDT Init !!! ENABLE CONFIG WDT FIRST !!!
// Warning:
// Always check CONFIG WDT enable first, CONFIG not enable, SFR can't enable WDT reset
// Please call Enable_WDT_Reset_Config() function to enable CONFIG WDT reset
//----------------------------------------------------------------------------------------------

                Enable_WDT_Reset_Config();

          TA=0xAA;TA=0x55;WDCON=0x07;                                                //Setting WDT prescale
                set_WDCLR;                                                                                                                //Clear WDT timer
                while((WDCON|~SET_BIT6)==0xFF);                                //confirm WDT clear is ok before into power down mode
                EA = 1;
                set_WDTR;                                                                                                                        //WDT run
               
    while(1)
                {

                        clr_GPIO1;
                        Timer0_Delay1ms(500);
                        set_GPIO1;
                        Timer0_Delay1ms(500);
                        clr_GPIO1;
                        Timer0_Delay1ms(500);
                        set_GPIO1;
                        Timer0_Delay1ms(500);
                        set_PD;
                }
}
自从烧了官方例程的看门狗复位程序后,烧其他的程序也会一直复位,改什么解决,  把 IAPFD = 0xFF,也没效果
heisexingqisi| | 2018-7-2 22:53 | 显示全部楼层
看看配置字,是不是没有改回来。

使用特权

评论回复
heisexingqisi| | 2018-7-2 23:00 | 显示全部楼层
N76E003具有几个硬件配置字节,设置这些配置位配置硬件选项,如安全位,系统时钟位等等。这些硬件配置位可通过编程器/烧录器或ICP、IAP来配置。有些特定的配置位定义的功能,也可以通过特殊寄存器位重新配置。因此,需要加载这些配置位到相应的寄存器位。这些加载发生在复位之后。软件复位会加载部分配置位至特殊功能寄存器相应的位,这些寄存器位也可以通过用户的软件控制及修改。其他复位将不改变这些寄存器位的值。

使用特权

评论回复
heisexingqisi| | 2018-7-2 23:01 | 显示全部楼层
微信图片_20180702230042.png

使用特权

评论回复
15228869197|  楼主 | 2018-7-3 09:37 | 显示全部楼层
heisexingqisi 发表于 2018-7-2 22:53
看看配置字,是不是没有改回来。

IAPFD = 0xFF,这一句不是把CONFIG4配置成全1吗,但是没效果

使用特权

评论回复
15228869197|  楼主 | 2018-7-3 09:38 | 显示全部楼层

IAPFD = 0xFF,是这样吗,把CONFIG4配置成全1,但是没效果

使用特权

评论回复
小S咯| | 2018-7-3 09:54 | 显示全部楼层
15228869197 发表于 2018-7-3 09:38
IAPFD = 0xFF,是这样吗,把CONFIG4配置成全1,但是没效果

应该是没用的,config要烧录时选的

使用特权

评论回复
IoTCatcher| | 2018-7-3 11:08 | 显示全部楼层
本帖最后由 IoTCatcher 于 2018-7-3 11:12 编辑

试下KEIL配置WDT disable



WDT_DISABLE.png

使用特权

评论回复
15228869197|  楼主 | 2018-7-3 11:16 | 显示全部楼层
小S咯 发表于 2018-7-3 09:54
应该是没用的,config要烧录时选的

额,那为什么IAPFD=0x0F,就设置成功了,打开了看门狗呢

使用特权

评论回复
15228869197|  楼主 | 2018-7-3 11:16 | 显示全部楼层
IoTCatcher 发表于 2018-7-3 11:08
试下KEIL配置WDT disable

额,谢谢,我试试

使用特权

评论回复
598330983| | 2018-7-3 15:34 | 显示全部楼层
配置字是在烧录工具里设置的,或Keil的者烧录选项里。

使用特权

评论回复
15228869197|  楼主 | 2018-7-3 16:07 | 显示全部楼层
598330983 发表于 2018-7-3 15:34
配置字是在烧录工具里设置的,或Keil的者烧录选项里。

这个我知道,没有通过烧录工具和keil设置,直接是程序里通过IAP操作,IAPFD=0x0F,设置了CONFIG4,打开了看门狗,但是再改成IAPFD=0xFF,却关闭不了了,是怎么回事呢

使用特权

评论回复
解决了没,听说关闭只能通过烧录时候选择的配置字

使用特权

评论回复
15228869197|  楼主 | 2018-7-5 09:21 | 显示全部楼层
天灵灵地灵灵 发表于 2018-7-4 22:40
解决了没,听说关闭只能通过烧录时候选择的配置字

还没有,不知道为什么软件里关闭不了

使用特权

评论回复
wangshujun| | 2018-7-13 19:01 | 显示全部楼层
15228869197 发表于 2018-7-3 09:38
IAPFD = 0xFF,是这样吗,把CONFIG4配置成全1,但是没效果

flash可以通过编程从1到0,但是不能反过来,只有擦除才能从0到1
比如原来数据是ff,你可以写55进去,得到的就是55,但是你继续写aa得到的会是00,可以看作是一个按位的或操作

使用特权

评论回复
598330983| | 2018-7-15 17:36 | 显示全部楼层
wangshujun 发表于 2018-7-13 19:01
flash可以通过编程从1到0,但是不能反过来,只有擦除才能从0到1
比如原来数据是ff,你可以写55进去,得到 ...

这位大侠分析的正点。

使用特权

评论回复
15228869197|  楼主 | 2018-7-17 09:43 | 显示全部楼层
wangshujun 发表于 2018-7-13 19:01
flash可以通过编程从1到0,但是不能反过来,只有擦除才能从0到1
比如原来数据是ff,你可以写55进去,得到 ...

有点明白了,谢谢

使用特权

评论回复
lomo1316| | 2018-7-17 10:28 | 显示全部楼层
我们遇到了同一个问题,应该是keil里面的配置字被设置为了开启看门狗,即使选择了关闭,好像再次打开,选择项还是开启看门狗的,不知道你的是不是这种情况

使用特权

评论回复
lomo1316| | 2018-7-17 11:03 | 显示全部楼层
过程示例如下:
1、Keil设置为关闭看门狗,此时CONFIG4 =  0xFF;
2、程序修改CONFIG4 =  0x0F,此时CONFIG4 =  0x0F;
3、程序修改CONFIG4 =  0xFF,此时CONFIG4 =  0x0F;
4、擦除所有CONFIG,此时CONFIG4 =  0xFF;

所以,要想通过配置字关闭打开的看门狗后,只能使用擦除所有Config的方法,但此时所有config都恢复为缺省值,这样Config0/1/2就要提前备份,擦除完毕后,还需要重新写入各个配置字。修改其他配置字可能也需要类似的方法,我这只是实际实验的结果,不保证理论上完全正确。
如果能擦除指定地址的配置字,就不用这么麻烦了。

使用特权

评论回复
lomo1316| | 2018-7-17 11:11 | 显示全部楼层
wangshujun 发表于 2018-7-13 19:01
flash可以通过编程从1到0,但是不能反过来,只有擦除才能从0到1
比如原来数据是ff,你可以写55进去,得到 ...

大侠说得非常正确,实时上确实这样,先写0x55,再写0xAA,得到的实际值就是0x00,只能擦除后,才能得到0xFF

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

16

帖子

0

粉丝