打印
[牛人杂谈]

Cortex-M0 lockup状态和原因

[复制链接]
2812|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
现实的世界如此复杂,对于嵌入式系统而言, 有些异常,辅以一定的代码处理,可以恢复;有些异常,代码自身不一定有能力从异常中恢复。一个健全的系统,需要考虑各种异常的情况,甚至不能恢复的异常也需要考虑。

当Cortex-M0/M3遇到严重的异常时,它会将自己的PC指针置于某个地址处,并锁死自己。下面列举可能锁死的原因(译自ARMv6-M Architecture Reference Manual B1.5.15)

原因
发生时机
行为
锁死时的PC地址
启动时读向量表错误
启动时不能读SP或PC
锁死在优先级-1
0xFFFFFFFE
进入NMI中断时,读向量表错误
不能读NMI的中断向量
锁死在优先级-2
0xFFFFFFFE
进入HardFault中断时,读向量表错误
不能读HardFault的中断向量
锁死在优先级-1
0xFFFFFFFE
内存错误 -
Instruction
优先级-1或-2
锁死在当前优先级
0xFFFFFFFE
内存错误 -
Imprecise Data
优先级-1或-2
锁死在当前优先级
0xFFFFFFFE
内存错误 -
Precise Data
优先级-1或-2
锁死在当前优先级
0xFFFFFFFE
内存错误 -
进入NMI中断时,压栈内容出错
在进入NMI之前的优先级为-1(HardFault)
锁死在优先级-1或-2(跟实现相关)
0xFFFFFFFE
内存错误 -
出栈错误
出栈时发生错误
锁死在优先级-1或-2或进入HardFault中断
0xFFFFFFFE
SVC
优先级-1或-2
锁死在当前优先级
0xFFFFFFFE
Usage Fault
优先级-1或-2
锁死在当前优先级
0xFFFFFFFE
未定义指令
优先级-1或-2
锁死在当前优先级
0xFFFFFFFE
断点(BKPT)
优先级-1或-2
锁死在当前优先级
0xFFFFFFFE
原因一堆,总之就一句话,排除硬件故障的话,就是程序出错了,然后PC就跑到0xFFFFFFFE处不回来了。

当这种情况出现时,用IAR+Nu-Link调试,会做静默处理,需要留意PC的值以便作出判定;
用Keil+Nu-Link调试,会尝试读PC处的内容,于是显示读不到数据的对话框。


沙发
yiyigirl2014|  楼主 | 2016-8-27 22:34 | 只看该作者
最后,总结一下,遇到锁死在0xFFFFFFFE时,可能的原因和排查办法:

1. 目标板没有上电,仅靠调试器管脚上的一点电流在运行。这种情况下可能电流不够,导致下载运行的程序根本就不对;
   建议:给目标板接上外接电源。

2. Keil太聪明,它认为你的板子应该有程序,所以不下载程序到班子,但是实际上板子可能是空白flash。
   例如:先用Keil下载并调试板子A;然后换上板子B,直接点Keil的“调试”。这时候Keil以为连接的还是板子A, 所以它并不再次下载。
   建议:每次调试之前,按F7重新link一下程序,Keil就保证会再次下载了。

3. Keil Project设定为:Debugger时不要下载程序。那板子上可能就没程序了。
   建议:打开对话框:Project->Options->Utilities->Update Target before Debugging,确信这一项有打上勾

4. Nu-Link驱动中选择的“Chip Type”和目标板不匹配,运行的结果不可预料。
   建议:
   对于Keil, 打开对话框:Project->Options->Debug->Nu-Link Debugger->Settings,确信Chip Type没有和目标板一致。
   对于IAR, 打开对话框:Project->Options->General Options->Target->Device,确信Device类型和目标板一致
   (Nu-Link 4117rc之后版本的Nu-Link, 会检测芯片类型,报告不一致的情况)。

5. Nu-Link/Keil关于flash utility的设定,没有选择擦除。
   Flash写之前需要擦除的,然而为了客户特殊需要以及和Ulink界面的一致,Nu-Link仍旧允许写之前不擦除。
   建议:写之前不擦除,用户会受到警告,请留意警告信息。
   如需修改此设定,可打开对话框:Project->Options->Utilities->Nu-Link Debugger->Settings->Download functions处修改。

6. 程序的确是写错了;
   建议:没有建议了^_^

使用特权

评论回复
板凳
wahahaheihei| | 2016-8-27 22:58 | 只看该作者
锁死这种情况也不少见,好多人以为坏了呢

使用特权

评论回复
地板
734774645| | 2016-8-28 09:37 | 只看该作者
工程的配置是至关重要的,好多的东西都要在里面做,比如输出HEX的格式,输出BIN文件。

使用特权

评论回复
5
643757107| | 2016-8-28 11:47 | 只看该作者
遇到锁死的情况,总是以为芯片坏了呢,原来是有方法解决的。

使用特权

评论回复
6
zhuotuzi| | 2016-8-28 23:12 | 只看该作者
其实这个Loopback就是自发自收的意思,不信看
Count = 0;

        if((u32TestCount & 0x1FF) == 0)
        {
            putchar('.');
        }

        while(1)
        {
            /* Write to TX register */
            SPI_WRITE_TX(SPI0, g_au32SourceData[u32DataCount]);
            /* Trigger SPI data transfer */
            SPI_TRIGGER(SPI0);
            /* Check SPI0 busy status */
            while(SPI_IS_BUSY(SPI0));
            /* Read received data */
            g_au32DestinationData[u32DataCount] = SPI_READ_RX(SPI0);
            u32DataCount++;
            if(u32DataCount > TEST_COUNT)
                break;
        }

        /*  Check the received data */
        for(u32DataCount = 0; u32DataCount < TEST_COUNT; u32DataCount++)
        {
            if(g_au32DestinationData[u32DataCount] != g_au32SourceData[u32DataCount])
                u32Err = 1;
        }

        if(u32Err)
            break;
    }

    if(u32Err)
        printf(" [FAIL]\n\n");
    else
        printf(" [PASS]\n\n");

    /* Close SPI0 */
    SPI_Close(SPI0);

    while(1);
}

使用特权

评论回复
7
yiyigirl2014|  楼主 | 2016-8-31 19:20 | 只看该作者
如果觉得可能遇到这些问题的,可以认真看一下。

使用特权

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

本版积分规则

213

主题

3545

帖子

10

粉丝