前言
通常我們使用的 IDE 在調(diào)試時(shí)都支持在程序運(yùn)行過(guò)程中實(shí)時(shí)觀察窗口內(nèi)容的功能,當(dāng)啟用這個(gè)功能后,實(shí)時(shí)觀察窗口中包含的寄存器或變量的值會(huì)被周期性或重復(fù)性的進(jìn)行采樣,進(jìn)而實(shí)現(xiàn)窗口內(nèi)容的實(shí)時(shí)更新。但是這個(gè)功能使用不當(dāng)?shù)脑捒赡軙?huì)導(dǎo)致一些問(wèn)題,下面我們介紹這樣一個(gè)外設(shè)通訊出錯(cuò)的案例。
問(wèn)題描述
客戶在使用 STM32H723 的 SPI 外設(shè)進(jìn)行通訊時(shí),通過(guò)邏輯分析儀抓取到的總線數(shù)據(jù)是正確的,但是實(shí)際接收到的數(shù)據(jù)卻為 0。這種情況每隔一段時(shí)間會(huì)出現(xiàn)一次,這個(gè)間隔時(shí)間不是固定的??蛻舻臏y(cè)試是使用 Keil MDK 在調(diào)試狀態(tài)下進(jìn)行的。
SPI 相關(guān)知識(shí)
SPI_SR_RXP 寄存器位由硬件進(jìn)行管理。當(dāng)RxFIFO 包含至少一個(gè)完整的數(shù)據(jù)幀時(shí),SPI_SR_RXP 位為 1,否則為 0。
問(wèn)題分析與測(cè)試
客戶抓取 SPI 總線上的數(shù)據(jù)是正確的,但是讀取到的數(shù)據(jù)為 0 的情況,這很可能是由于在 SPI_SR_RXP 為 0 的時(shí)候讀取了 SPI_RXDR 寄存器。下面就這個(gè)推測(cè)對(duì) SPI_SR_RXP進(jìn)行測(cè)試。
小結(jié)
這個(gè)案例提醒我們,如果使用了可以通過(guò)讀操作進(jìn)行更新的寄存器時(shí),最好在調(diào)試時(shí)慎用“實(shí)時(shí)觀察窗口”來(lái)觀察其值,因?yàn)檫@可能會(huì)影響程序的正常執(zhí)行。這個(gè)“PeriodicWindow Update”的調(diào)試功能不是 Keil 獨(dú)有的,在 IAR 中的"Live Watch"窗口以及CubeIDE 中的"Live Expressions"窗口都是“實(shí)時(shí)觀察窗口”的功能,所以在使用時(shí)也要注意下。