我正在尝试调试一些我在STM32 Nucleo-64开发板上开发的固件,该开发板上具有STM32L412RBT6 Cortex-M4 MCU,并且我一直遇到一个非常奇怪的错误。基本上,当我尝试调试时,我最终在一条特定指令上遇到了严重的错误(详细信息如下)。奇怪的是,这仅在调试时发生。如果我重置MCU并使其在没有调试器的情况下运行,它将执行正确的代码行并继续执行其余代码。
我的设置:
-在Nucleo板上使用板载ST-Link调试器
-STM32CubeIDE环境
-GDB调试器
除此硬故障外,调试过程似乎运行良好。我可以启动调试器,逐步执行一些命令,查看监视列表中变量的变化,打开/关闭LED等等。
在调试时导致硬故障的行是SPI读写命令:
ret = HAL_SPI_TransmitReceive(&hspi1, (uint8_t *) txBuffer, (uint8_t *) rxBuffer, 4, 1000);
HAL_SPI_TransmitReceive()函数中导致错误的行是if语句:
if ((((HAL_GetTick() - tickstart) >= Timeout) && ((Timeout != HAL_MAX_DELAY)))
|| (Timeout == 0U))
{
errorcode = HAL_TIMEOUT;
goto error;
}
我刚刚开始从事此项目,并试图运行快速SPI回送测试以确保驱动程序正常工作。目前,项目中几乎没有其他内容,只是对时钟,GPIO和SPI进行了一些初始化。我相信代码是正确的,并且当我不积极调试时,它仍然可以正常工作。
我没有调试这些类型的错误的经验。经过一些搜索后,我到达了Cortex状态寄存器。可配置故障状态寄存器的值为0x0008 0000,对应于正在设置的NOCP位,指示发出了协处理器指令,但该协处理器被禁用或不存在。我不确定这有什么关系,我缺少什么吗?硬故障状态寄存器的值为0x0400 0000,并且FORCED位置1(这意味着可配置故障已升级为硬故障)。
当我在调试环境中重置MCU时,它立即进入硬故障处理程序。在这种情况下,可配置故障状态寄存器的值为0x8200,并且BFARVALID和PRECISERR位置1。设置BFARVALID后,总线故障地址寄存器将保存触发故障的地址,其值为0x2000 a008。这是我真正感到困惑的地方,因为此芯片的内存范围是从0x0800 0000到0x0802 0000的闪存程序存储器,以及从0x2000 0000到0x2000 a000的SRAM,所以0x2000 a008的地址不在这两个地址中。我对此感到非常困惑,不知道从这里去哪里。任何建议都非常感谢。