请教PIC24F莫名出现软复位问题,特别有请网友zchong

2020-02-08 09:12发布

如题,采用PIC24J64GA006,出现了莫名其妙的复位,确定WDT已经关闭
以下是网友zchong的帖子,有提到PIC24F SWR复位的问题
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3429546&bbs_page_no=1&search_mode=1&search_text=PIC24&bbs_id=9999
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3425474&bbs_id=1028
但是经调试,我发现我的程序一旦复位后,INTCON1 = 0X0000,RCON = 0X00C3; 没有出现zchong提到的Addr err引起的SWR,很奇怪的问题
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
shawn_17
1楼-- · 2020-02-09 03:27
多谢zchong的帮助,现将上面异常中断ISR加入后,跟踪到的确发生了AddrErr
虽然我在_AddressError的ISR里清除了ADDRERR了(INTCNT1.3),但是程序还是不断进入ISR里,感觉就是_AddressError的ISR IF没有清掉,没有找到它的IF寄存器说明

///////////////////////////////////////////////////////////////////////////////
// _AddressError ISR
void __attribute__((__interrupt__, no_auto_psv)) _AddressError(void)
{
        if ( INTCON1 & (1 << 3) )
        {
                INTCON1 &= (~(1 << 3));
        }
}
shawn_17
2楼-- · 2020-02-09 06:04
 精彩回答 2  元偷偷看……
shawn_17
3楼-- · 2020-02-09 11:07
问题已经解决,现将原因和大家分享一下:
本来定义了数组g_RecordManage.Addr[2][2];但是在遍历数组时写成了如下
for ( i = 0; i < 2; i++ )
{
    for (j = 0; j < 2; j++) //这里写成了for (j = 0; j < 2; i++), 导致下面的数组访问越界,因此出现了AddrErr trap
    {
        //这里访问数组g_RecordManage.Addr[j]
    }
}

总结如下:
1. 注意内存不要越界,防止内存溢出
2. 对于TRAP引起的SWR,可以加入对应的ISR,这个在下面的Demo Code中可以参考
3. 现象和本质的区别。本来看到是UART RX ISR中一段代码导致了ADDR ERR,但是不是这样,由于加入了这段代码,才会导致应用层去处理上面的这个函数,因此UART RX代码的问题也只不过是浮云

以下是PIC官网关于SWR的一篇帖子,希望对大家有用
http://www.microchip.com/forums/tm.aspx?m=394648
在这里谢谢网友zchong 的帮助,贴上一个关于TRAP的Demo code:
PIC24F trap的处理机制ourdev_597522YY9GD9.rar(文件大小:129K) (原文件名:Trap Handler.rar)
shawn_17
4楼-- · 2020-02-09 16:36
问题解决,结贴闪人
cy_ygs
5楼-- · 2020-02-09 22:24
不错,顶顶顶

一周热门 更多>