请教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-08 10:43
忘了说编译器和IDE,编译器是PICC30, IDE是MPLABIDE
cht-rtos
2楼-- · 2020-02-08 15:27
RCON的值怎么得到的?貌似有SWR出现,不能排除是address error引起的,进一步跟踪
zchong
3楼-- · 2020-02-08 16:47
 精彩回答 2  元偷偷看……
shawn_17
4楼-- · 2020-02-08 22:04
【2楼】 cht-rtos
积分:103
派别:
等级:------
来自:
RCON的值怎么得到的?貌似有SWR出现,不能排除是address error引起的,进一步跟踪
回复:
在watch 窗口, Add SFR即可


【3楼】 zchong
积分:911
派别:
等级:------
来自:中国·南京
在中断函数中打印一些信息,不同的中断打印不同的信息,很快就能查到是哪个引起的复位了  
   
回复:你是说在中断里通过串口发出调试信息吧?
另外,zchong,能留下联系方式吗?我的QQ: 309155886
shawn_17
5楼-- · 2020-02-09 01:43
有个现象是这样:
void __attribute__((__interrupt__, no_auto_psv)) _U2RXInterrupt ( void )
{
    INT8U TempData = 0;
    IFS1bits.U2RXIF = 0;
    TempData = U2RXREG;
    if ( U2STA & 0X02 )
    {//U2RX出错
        U2STA &= (~0X02);
    }
    else
    {
        if ( (UART_GSM_ACK_TYPE_MSG == g_UARTGsm.AckType) )
        {//只针对读取短信
            if ( ':' == TempData )
            {
                if ( 'L' == g_UARTGsm.RxBuff[g_UARTGsm.Index - 1] )
                {
                    if ( 'G' == g_UARTGsm.RxBuff[g_UARTGsm.Index - 2] )
                    {
                        if ( 'M' == g_UARTGsm.RxBuff[g_UARTGsm.Index - 3] )
                        {
                            if ( 'C' == g_UARTGsm.RxBuff[g_UARTGsm.Index - 4] )
                            {//同步记录起始位置,防止接收到GSM多条记录同时返回时,程序判别不了记录起始和结束位置
                                g_UARTGsm.Index = 5;
                            }
                        }
                    }

                }
            }
        }

        if ( 'K' == TempData )
        {
            if ( g_UARTGsm.Index > 1 )
            {
                if ( 'O' == g_UARTGsm.RxBuff[g_UARTGsm.Index - 1] )
                {
                    g_UARTGsm.Recv = TRUE;
                }
            }
        }

        if ( g_UARTGsm.Index > (UART_GSM_BUFF_LEN - 1) )
        {//防止内存溢出
            g_UARTGsm.Index = UART_GSM_BUFF_LEN - 2;
        }
        g_UARTGsm.RxBuff[g_UARTGsm.Index++] = TempData;
    }
    LED_DATA_INVERT ();
}
改成以下就可以
void __attribute__((__interrupt__, no_auto_psv)) _U2RXInterrupt ( void )
{
    INT8U TempData = 0;
    IFS1bits.U2RXIF = 0;
    TempData = U2RXREG;
    if ( U2STA & 0X02 )
    {//U2RX出错
        U2STA &= (~0X02);
    }
    else
    {
        //if ( (UART_GSM_ACK_TYPE_MSG == g_UARTGsm.AckType) )
        //{//只针对读取短信
            //if ( ':' == TempData )
            //{
                //if ( 'L' == g_UARTGsm.RxBuff[g_UARTGsm.Index - 1] )
                //{
                    //if ( 'G' == g_UARTGsm.RxBuff[g_UARTGsm.Index - 2] )
                    //{
                        //if ( 'M' == g_UARTGsm.RxBuff[g_UARTGsm.Index - 3] )
                        //{
                            //if ( 'C' == g_UARTGsm.RxBuff[g_UARTGsm.Index - 4] )
                            //{//同步记录起始位置,防止接收到GSM多条记录同时返回时,程序判别不了记录起始和结束位置
                                //g_UARTGsm.Index = 5;
                            //}
                        //}
                    //}

                //}
            //}
        //}

        if ( 'K' == TempData )
        {
            if ( g_UARTGsm.Index > 1 )
            {
                if ( 'O' == g_UARTGsm.RxBuff[g_UARTGsm.Index - 1] )
                {
                    g_UARTGsm.Recv = TRUE;
                }
            }
        }

        if ( g_UARTGsm.Index > (UART_GSM_BUFF_LEN - 1) )
        {//防止内存溢出
            g_UARTGsm.Index = UART_GSM_BUFF_LEN - 2;
        }
        g_UARTGsm.RxBuff[g_UARTGsm.Index++] = TempData;
    }
    LED_DATA_INVERT ();
}

晕哦,怎么把它编辑工整一些呢?
zchong
6楼-- · 2020-02-09 02:24
重定向下面几个函数
void __attribute__((__interrupt__)) _OscillatorFail(void);
void __attribute__((__interrupt__)) _AddressError(void);
void __attribute__((__interrupt__)) _StackError(void);
void __attribute__((__interrupt__)) _MathError(void);
trap一下异常到底是哪个

另把出错的代码部分重新整一份上来,变量的声明一并给出

注意隐性的强制类型转换

一周热门 更多>