程序从复位执行若干时间后(5分钟以上),会进入FaultISR(),进入的时间不定。而在使用调试器运行时则不会出现这种情况。因此我修改FaultISR(),追踪状况。
static void
FaultISR(void)
{
char string[64]; uint32_t HFaultStat = HWREG(NVIC_HFAULT_STAT);
uint32_t FaultStat = HWREG(NVIC_FAULT_STAT);
uint32_t MmAddr = HWREG(NVIC_MM_ADDR);
SystemDelay(0.01); //串口的波特率为115200,故延时0.01秒,以留够足够时间发完上次数据。
sprintf(string,"%x,%x,%x\n", HFaultStat,FaultStat,MmAddr); int length = strlen(string);
for(int i=0;i<length;i++)
ROM_UARTCharPutNonBlocking(UART_COMPUTER_BASE, (uint8_t)string[i]);
}
重复接收到的数据:40000000,100,e000
也就是寄存器HFAULTSTAT = 0x40000000,FAULTSTAT = 0x100,MMADDR = 0xE000.
查数据 手册得知是出现了指令总线错误,IBUS被置位
datasheet里关于这个错误的信息太少,请帮忙分析可能原因,另外,这种错误是否可以被清除?该采用什么顺序清除?
xyz549040622:
我在M3上出现过这种错误,用调试器没问题,实际运行出错,是由于printf函数引起的,你可以去掉串口,屏蔽掉sprintf函数看看
xyz549040622:
HFAULTSTAT = 0x40000000,FAULTSTAT = 0x100,MMADDR = 0xE000.你查查M4的指令手册,看看这个错误具体属于哪个外设
Michael Sun:
这种一般是硬件上的操作不当导致,建议定位并修改源码。