時(shí)鐘失效之后,STM32還能運(yùn)行?
問(wèn)題
該問(wèn)題由某客戶提出,發(fā)生在 STM32F103VDT6 器件上。據(jù)其工程師講述:在其產(chǎn)品的設(shè)計(jì)中,STM32 的 HSE 外接 8MHz 的晶體產(chǎn)生振蕩,然后通過(guò) STM32 內(nèi)部的PLL 倍頻到 72MHz,作為 STM32 的系統(tǒng)時(shí)鐘,驅(qū)動(dòng)芯片工作。在 STM32 片外有專用的看門(mén)狗芯片,監(jiān)控 STM32 的運(yùn)行。STM32 內(nèi)部的軟件會(huì)在 STM32 的某個(gè)管腳上產(chǎn)生脈沖來(lái)復(fù)位看門(mén)狗。一旦 STM32 沒(méi)有及時(shí)的產(chǎn)生脈沖來(lái)復(fù)位門(mén)狗,則看門(mén)狗會(huì)認(rèn)為 STM32 運(yùn)行不正常,從而復(fù)位 STM32。在對(duì)該產(chǎn)品做可靠性測(cè)試時(shí),進(jìn)行了對(duì)看門(mén)狗監(jiān)控時(shí)鐘失效能力的測(cè)試。測(cè)試的方法是:將 HSE 外接的晶體的兩個(gè)端子接地,使其停止振蕩,從而驗(yàn)證看門(mén)狗能否做出對(duì) STM32 的做出復(fù)位動(dòng)作。試驗(yàn)結(jié)果表明,看門(mén)狗沒(méi)有產(chǎn)生復(fù)位動(dòng)作。進(jìn)一步測(cè)試發(fā)現(xiàn),STM32 在失效情況下仍在向看門(mén)狗發(fā)送復(fù)位脈沖。
調(diào)研:
重復(fù)測(cè)試,確認(rèn)其所述現(xiàn)象屬實(shí)。檢查軟件代碼,確認(rèn)其軟件沒(méi)有開(kāi)啟 STM32 的 CSS功能。修改代碼,將 PLL 的二分頻從 STM32 的 MCO 管腳送出,以方便用示波器觀察。通過(guò)控制晶體的管腳是否接地來(lái)控制 HSE 是否振蕩。當(dāng) HSE 正常振蕩時(shí),MCO 送出的信號(hào)頻率為 36MHz,當(dāng) HSE 停止振蕩時(shí),MCO 送出的信號(hào)的頻率在 1.7MHz 附近,如圖(一)所示:
通過(guò)調(diào)試器觀察寄存器 RCC_CFGR 中的 SWS 控制控制位,其值為[10],說(shuō)明此時(shí)的系統(tǒng)時(shí)鐘確實(shí)來(lái)自 PLL 的輸出。
從 STM32F103VD 的數(shù)據(jù)手冊(cè)中查找 PLL 相關(guān)的參數(shù)如表(一):
其中,PLL 的輸出頻率范圍是 16MHz – 72MHz。也就是說(shuō),PLL 在處于相位鎖定的狀態(tài)下,可以輸出 16MHz – 72MHz 的時(shí)鐘信號(hào)。而當(dāng)輸入信號(hào)頻率過(guò)低而導(dǎo)致輸出信號(hào)頻率低于 16MHz 時(shí),將可能處于失鎖的狀態(tài)。在這狀態(tài)下,它的輸出信號(hào)的頻率與輸入信號(hào)的頻率之間,不一定符合所設(shè)定的倍頻與分頻關(guān)系。更確切的說(shuō),不能通過(guò)公式:
得出“輸入信號(hào)頻率為零時(shí),輸出信號(hào)頻率也為零”這樣的結(jié)論。這一點(diǎn)與實(shí)測(cè)的結(jié)果相吻合。
結(jié)論:
STM32 的 PLL 在沒(méi)有輸入信號(hào)的情況下,仍能維持在最低的頻點(diǎn)處振蕩,產(chǎn)生輸出。以至,CPU 及其它外設(shè)仍能在 PLL 送出的時(shí)鐘的驅(qū)動(dòng)下運(yùn)行。所以,通過(guò)判斷有無(wú)時(shí)鐘來(lái)驅(qū)動(dòng) CPU 執(zhí)行指令的方式來(lái)判斷 HSE 是否失效是行不通的。
處理:
對(duì)軟件做如下修改:
1. 在軟件的初始化部分,開(kāi)啟 STM32 的 CSS 功能;
2. 修改 NMI 中斷服務(wù)程序,加入 while(1) 陷阱語(yǔ)句;
開(kāi)啟 CSS 功能后,當(dāng) HSE 失效時(shí),STM32 會(huì)自動(dòng)開(kāi)啟 HSI,并將系統(tǒng)時(shí)鐘的來(lái)源切換到HSI 的輸出,同時(shí)產(chǎn)生 NMI 中斷。這樣,程序的流程將停留在 NMI 中而不能產(chǎn)生復(fù)位片外的看門(mén)狗的脈沖。當(dāng)片外看門(mén)狗溢出后,就會(huì)復(fù)位 STM32,使其恢復(fù)到正常駐的狀。
建議:
STM32 中的 CSS 功能是專門(mén)為檢測(cè)和處理 HSE 失效而設(shè)計(jì)的。但該功能在 STM32 復(fù)位后是被禁止的,須要軟件對(duì)其使能才會(huì)發(fā)揮作用。當(dāng) CSS 單元檢測(cè)到 HSE 失效時(shí),它會(huì)使能 HSI,并將系統(tǒng)時(shí)鐘切換到 HSI。同時(shí),它會(huì)關(guān)閉 HSE,如果 PLL 的輸入信號(hào)來(lái)自 HSE的輸出,它也會(huì)關(guān)閉 PLL。CSS 單元在做時(shí)鐘調(diào)整的同時(shí),也會(huì)產(chǎn)生一個(gè) NMI 中斷請(qǐng)求,和一個(gè)送給高級(jí)定時(shí)器的剎車(chē)信號(hào)。NMI 中斷請(qǐng)求會(huì)產(chǎn)生一個(gè) NMI 中斷,以便用戶程序可以在中斷服務(wù)程序中做緊急處理,而剎車(chē)信號(hào)則是使高級(jí)定時(shí)器進(jìn)入剎車(chē)狀態(tài),以防止由其控制的電機(jī)驅(qū)動(dòng)橋臂由于失去控制而過(guò)流。用戶程序可以在 NMI 中斷服務(wù)程序中嘗試恢復(fù) HSE 及 PLL 的功能,也可以使用陷阱讓程序的流程停留在服務(wù)程序中,從而等待看門(mén)狗復(fù)位整個(gè)系統(tǒng)。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。
穩(wěn)壓二極管相關(guān)文章:穩(wěn)壓二極管的作用
電流傳感器相關(guān)文章:電流傳感器原理