?在我們的單片機(jī)調(diào)試過程中,經(jīng)常會遇到類似如下因第3只眼而導(dǎo)致的問題。何謂第3只眼呢?不妨先看看幾個實例就知道了。
第一個案例,與ADC轉(zhuǎn)換標(biāo)志位有關(guān)的問題。遇到該問題是一種較為頻繁的情形。
經(jīng)常有人在做STM32 ADC應(yīng)用,進(jìn)行代碼單步調(diào)試時發(fā)現(xiàn),明明啟動了ADC轉(zhuǎn)換就是等不到轉(zhuǎn)換結(jié)束的那一刻,即總是檢測不到EOC等于1的時候。有時讓人直急得冒汗!比方類似下面的情形,開啟了ADC轉(zhuǎn)換指令,然后等待ADC轉(zhuǎn)換結(jié)束。
在那藍(lán)色圓圈的代碼處,查詢等待EOC等于1,可就是等不到它為1的時候。是怎么回事呢?
原來,STM32芯片ADC的轉(zhuǎn)換結(jié)束標(biāo)志EOC位,具有讀清零的特性。當(dāng)你調(diào)試時打開外設(shè)寄存器顯示欄時,那調(diào)試組件在不停的讀取它。當(dāng)你單步操作去讀取該標(biāo)志位時往往先被調(diào)試組件讀過了。即使它之前被置位過,但因調(diào)試組件的讀取后又被清零。當(dāng)你單步慢悠悠去讀它時,結(jié)果讀到的往往是0,你就查不到為1的那一刻,此時我們可能會傻傻的等和著急。
?當(dāng)然,如果你將右邊ADC外設(shè)寄存器顯示欄關(guān)閉就不會出現(xiàn)上述問題了。
第二個案例??,與UART狀態(tài)寄存器標(biāo)志位有關(guān)的問題。遇到該問題也是較為頻繁的情形。
某STM32用戶使用STM32F2系列芯片的UART外設(shè)及相關(guān)功能。他發(fā)現(xiàn)明明接收完畢,發(fā)送標(biāo)志TC位也置位了,可就是不進(jìn)IDLE空閑中斷。當(dāng)然,相關(guān)中斷使能都已正常使能無誤。實際情形是這樣的:
STM32F205的UART5發(fā)送指令(循環(huán)發(fā)送一個字節(jié)一個字節(jié)地發(fā))給wifi芯片,WiFi芯片會返回相應(yīng)數(shù)據(jù)過來,所以,正常來講uart5會收到一幀數(shù)據(jù)之后應(yīng)該進(jìn)入串口接收IDLE中斷.這是客戶所期望的。
他將斷點(diǎn)打在UART中斷服務(wù)程序的檢查到IDLE中斷請求位等于1后的入口處。就像下面截圖的樣子。他甚至在右邊的UART寄存器顯示欄都看到IDLE被置位過的痕跡了,可就是進(jìn)不到相關(guān)代碼里去,怎么回事呢?
?因為他開啟了UART寄存器顯示窗口,意味著調(diào)試組件在不停幫他讀了UART相關(guān)寄存器,其中包括DR和SR寄存器。當(dāng)他在中斷代碼里再去讀SR寄存器里的IDLE標(biāo)志位時,讀回來的結(jié)果總是0,所以中斷程序沒法進(jìn)一步走下去。對于他這里,嚴(yán)格地說是響應(yīng)了中斷,只是沒法進(jìn)一步進(jìn)入相關(guān)中斷服務(wù)代碼區(qū)。
其實,對于stm32f2芯片UART的IDLE中斷請求標(biāo)志位的清零會遵循一個訪問序列,即讀DR寄存器,然后讀SR寄存器就可將IDLE位清零。
當(dāng)然,解決上面問題的辦法也很簡單,調(diào)試跟蹤時,將右邊UART的外設(shè)寄存器顯示欄關(guān)閉就好。
第三個案例,與讀取RTC日歷有關(guān)的問題。一個較為隱蔽而容易誤導(dǎo)人的問題。
曾有人反饋說STM32F4和STM32L4的RTC脫機(jī)運(yùn)行跑不起來,不運(yùn)行。具體表現(xiàn)就是日歷時間不動、不更新。奇怪的是,調(diào)試時候不論單步還是全速運(yùn)行,查看日歷寄存器都顯示正常運(yùn)行,數(shù)據(jù)也正確。
可當(dāng)燒錄代碼到芯片后,通過調(diào)試助手查看日歷的數(shù)據(jù)則原地不動了,感覺RTC沒有運(yùn)行??蛻粲肧TM32F4和STM32L4的板都測試過,出現(xiàn)同樣問題。懷疑STM32F4和L4芯片的RTC是否有BUG【反正找不到原因了就想芯片bug?】。
查看其測試代碼,就是讀RTC的日歷,很簡單。如下?:
while(1){
HAL_RTC_GetTime(&hrtc,&rtcTime,RTC_FORMAT_BIN);?printf( ...... );HAL_Delay(1000);}
?從上面代碼不難看出就是不停地去讀當(dāng)前的時、分、秒時間。STM32參考手冊在關(guān)于RTC日歷讀取操作部分有相關(guān)描述。為了讀取時間的一致性,讀取日歷操作要求先讀時分秒然后還得讀日期,這樣做為一個完整的操作。所以在讀取TIME【時分秒】后,硬件會將當(dāng)前日歷值鎖住,直到讀取了日期寄存器。否則當(dāng)你讀了TIME而不讀DATE的話,再去讀TIME時還是原來的值維持不變。顯然,客戶這里的代碼只有讀取TIME時間的語句,沒有讀取DATE日期的代碼。這是問題?根本原因之所在。
但是,為什么同樣代碼在調(diào)試情況下又能正常運(yùn)行呢??那是因為他在調(diào)試時打開著RTC寄存器外設(shè)顯示窗口,雖然用戶代碼沒去讀DATE,但調(diào)試組件幫忙讀了DATE寄存器,所以感覺上一切風(fēng)調(diào)雨順,也就沒能及時發(fā)現(xiàn)問題,一直到程序燒進(jìn)芯片后才發(fā)現(xiàn)異常癥狀。
到此,結(jié)合上述3個案例的分享介紹,我們應(yīng)該明白了那個第3只眼了,即調(diào)試組件。個別寄存器或寄存器位具有“讀則變”或“讀有效”的特性。我們在調(diào)試時候要注意類似細(xì)節(jié),調(diào)試時也不必時刻將那個外設(shè)寄存器顯示欄開啟掛在那里。其實,除了這個寄存器顯示欄外,我們還可以利用其它輸出,比方示波器、printf,或者WATCH窗口等來輔助觀察運(yùn)行狀態(tài)或結(jié)果。
-
單片機(jī)
+關(guān)注
關(guān)注
6058文章
44821瀏覽量
644620 -
adc
+關(guān)注
關(guān)注
99文章
6611瀏覽量
547723
原文標(biāo)題:單片機(jī)調(diào)試過程中的第3只眼
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
單片機(jī)串口模塊調(diào)試方法

USMART調(diào)試過程是怎樣的
5G14433和MCS-51單片機(jī)接口電路的調(diào)試過程
電源設(shè)計調(diào)試過程中的異常現(xiàn)象分析
單片機(jī)開發(fā)過程中硬件調(diào)試技巧
單片機(jī)驅(qū)動DM9000網(wǎng)卡芯片詳細(xì)調(diào)試過程
淺析STM32調(diào)試過程中的幾個相關(guān)問題
使用單片機(jī)驅(qū)動DM9000網(wǎng)卡芯片的詳細(xì)調(diào)試過程資料免費(fèi)下載

STM32單片機(jī)中OBG調(diào)試接口的介紹

OBG調(diào)試接口在單片機(jī)中的應(yīng)用解析

電磁流量計調(diào)試過程中存在的問題以及解決措施
單片機(jī)常用的調(diào)試方法
單片機(jī)開發(fā)調(diào)試工具有哪些?
STMCU應(yīng)用過程中與電源相關(guān)的案例分享

評論