前言
通常我们使用的 IDE 在调试时都支持在程序运行过程中实时观察窗口内容的功能,当启用这个功能后,实时观察窗口中包含的寄存器或变量的值会被周期性或重复性的进行采样,进而实现窗口内容的实时更新。但是这个功能使用不当的话可能会导致一些问题,下面我们介绍这样一个外设通讯出错的案例。
问题描述
客户在使用 STM32H723 的 SPI 外设进行通讯时,通过逻辑分析仪抓取到的总线数据是正确的,但是实际接收到的数据却为 0。这种情况每隔一段时间会出现一次,这个间隔时间不是固定的。客户的测试是使用 Keil MDK 在调试状态下进行的。
SPI 相关知识
SPI_SR_RXP 寄存器位由硬件进行管理。当RxFIFO 包含至少一个完整的数据帧时,SPI_SR_RXP 位为 1,否则为 0。
问题分析与测试
客户抓取 SPI 总线上的数据是正确的,但是读取到的数据为 0 的情况,这很可能是由于在 SPI_SR_RXP 为 0 的时候读取了 SPI_RXDR 寄存器。下面就这个推测对 SPI_SR_RXP进行测试。
小结
这个案例提醒我们,如果使用了可以通过读操作进行更新的寄存器时,最好在调试时慎用“实时观察窗口”来观察其值,因为这可能会影响程序的正常执行。这个“PeriodicWindow Update”的调试功能不是 Keil 独有的,在 IAR 中的"Live Watch"窗口以及CubeIDE 中的"Live Expressions"窗口都是“实时观察窗口”的功能,所以在使用时也要注意下。