|
本帖最后由 沒有你 于 2020-3-24 15:30 編輯
之前發過帖子介紹如何在IAR建立STC8A8K64S4A12單片機工程,詳情可以查看http://www.zg4o1577.cn/bbs/dpj-168481-1.html。雖然可以在IAR平臺正常編譯STC8A8K64S4A12工程,但是沒有基于IAR平臺的STC單片機的硬件在線調試工具。IAR平臺有一個軟件仿真工具simulator,這個工具很強大,一般被用來驗證程序代碼的邏輯功能。但由于是軟件仿真,終究沒法體現硬件的真實狀態,比如變量存儲地址等信息。STC官方針對keil平臺有一個類似ROM-Monitor的調試工具:STC Monitor-51,但是無法在IAR平臺使用,的確有點遺憾。自己花了點時間,仔細研究了一些IAR官方提供的官方資料,經過多次修改調試,總算搞出適配STC8A8K64S4A12單片的ROM-Monitor調試工具。有了ROM-Monitor調試工具,在IAR平臺也能愉快玩耍STC8A單片機了。 一、ROM-Monitor簡介。
ROM-Monitor是一種在線調試工具,利用單片機構成下位機和上位機進行通信來實現程序調試。使用時,需要先將ROM-Monitor固件燒錄到單片機里面,這樣單片機就成為下位機,然后將單片機連接PC上位機。在單片機和上位機的通信過程中,上位機首先會識別ROM-Monitor固件的設備,然后將需要調試的代碼傳到下位機。對于下位機來講,就是執行的應用程序的下載。完成后,下位機就按照上位機的調試指令進行操作,調試指令有全速運行、單步、斷點設置和暫停等。只要單片機擁有串口,并且支持IAP,基本上就可以用ROM-Monitor調試。但是ROM-Monitor也有缺點,比如需要占用單片機的程序空間和串口資源。
二、ROM-Monitor的使用條件。
本次基于STC8A8K64S4A12單片機的ROM-Monitor所占資源如下所示:
1、串口1(P3_0、P3_1)
2、4K程序空間(0x0000-0x0FFF)
3、XDATA:128字節(0x0000-0x0080)
串口1主要是和IAR上位機通信用的,另外用到了串口中斷,所以在調試時,不要用到串口1的任何資源,不要關閉串口中斷和總中斷。ROM-Monitor占用4K的程序空間,地址從0x0000-0x0FFF。所以應用程序代碼起始地址要設定從0x1000開始。另外,應用程序代碼不能往任何中斷向量地址寫代碼,也就是說無法調試硬件中斷,只能用查詢方式判斷中斷標志位來調試中斷。 ROM-Monitor占用128字節的xdata的RAM空間,主要是用來保護和恢復應用程序現場的。每次上位機發數據給下位機,都會觸發串口1中斷,在中斷處理中,會保存應用程序的PSW、DPH和DPL等寄存器內容,然后將內部ram地址0x00-0x80的內容和xdata地址0x0000-0x0080中內容做交換,最后跳轉到ROM-Monitor主程序,執行上位機的指令操作。等到完成上位機的指令操作后,下位機會再次將內部ram地址0x00-0x80的內容和xdata地址0x0000-0x0080中內容做交換,還原應用程序的PSW、DPH、DPL等寄存器內容,最后通過中斷返回到應用程序。
如果沒有指定變量存放地址,每次上電單片機自動分配給變量的RAM地址都是不一樣的。可能有人會擔心單片機可能會把xdata的0x0000-0x0080這個地址分配其他變量使用,那豈不是會破壞ROM-Monitor的正常運行嗎?其實這個擔心是多余的,因為ROM-Monitor指定在xdata的0x0000地址申請一個占128個字節的大數組全局變量,而且單片機上電首先會執行ROM-Monitor程序,所以應用程序是無法在xdata的0x0000-0x0080申請其他變量的。
ROM-Monitor設置斷點是軟件斷點,理論上可以設置很多個斷點。但是,實際上不要設置太多斷點,太多斷點會影響調試的效率,一般設置1-10個斷點為宜。另外,不要在同一個函數設置多個斷點,可能會導致錯誤的發生。如果要調試一個函數,只需要在函數里面設一個斷點,等到程序執行到斷點處,再單步調試即可。
三、IAR平的debugger功能
IAR平臺需要通過ddf后綴的硬件描述文件來識別單片機的所有寄存器地址,硬件描述文就是芯片的說明書。編寫和測試STC8A8K64S12.ddf文件花了我不少時間,純手打,眼力校驗,差點就吐了。
ROM-Monitor支持存儲讀寫功能,調試過程中,IAR都會實時更新存儲器的內容。如下圖所示
讀取內部資源.JPG (267.56 KB, 下載次數: 76)
下載附件
2020-3-13 18:13 上傳
在菜單欄view中,選擇memory,就可以調出memory頁面。通過ROM-Monitor,IAR可以讀寫全部ROM地址和RAM地址的內容。memory總共劃分成6個頁面,即iData、xData、sfr、code、Data和pData。以STC8A8K64S12單片機為例,其中iData表示內部ram空間0x00-0xff的內容,xData表示外部ram空間0x0000-0x1fff的內容,sfr表示位于內部ram從0x80-0xff寄存器的內容,code表示內部rom空間0x0000-0xffff的內容,Data表示內部ram從0x00-0x7f的內容,pData表示外部ram空間0x0000-0x00ff的內容。比如切換到code頁面,可以清楚查看ROM-Monitor和應用程序的存儲地址和內容,其中ROM-Monitor使用地址0x0000-0x0fff,禁止修改這個區域的任何數據,否則會損壞ROM-Monitor固件。由于全部存儲都已經可視化,我們可以很方便地做一些存儲的測試實驗,比如下圖測試寫RAM空間:
ram寫入.JPG (251.4 KB, 下載次數: 75)
下載附件
2020-3-13 20:32 上傳
在xdata指定一個起始地址為0x0400的數組,數組長度為100個字節,然后依次為數組從100-0賦值。xdata頁面可以清楚地顯示數組的地址也是從0x0400開始,數值也是完全對應的,數值顯示格式是十六進制的。測試寫ROM空間也是可以直接通過這種方式驗證的,非常方便和實用。下面介紹一下寄存器的讀寫功能。
寄存器的查看可以通過sfr頁面查看位于0x80-0xff的寄存器地址和內容,如下圖所示:
sfr.JPG (152.62 KB, 下載次數: 61)
下載附件
2020-3-13 20:57 上傳
不過這種方式要自己根據地址去查找對應寄存器名稱,很不方便。IAR提供一種查看寄存器的方式,通過讀取ddf硬件描述文件將寄存器的名字和地址對應起來,羅列在欄目中,比較直觀。在菜單欄view中,選擇registers,就可以調出register頁面。如下圖所示:
寄存器.JPG (175.82 KB, 下載次數: 77)
下載附件
2020-3-13 21:35 上傳
IAR允許同時打開四個registers欄目,每個欄目顯示不同功能類寄存器組的內容,如果要切換顯示其他寄存器,可以右鍵選擇要切換的寄存器,如下圖所示:
寄存器.png (124.27 KB, 下載次數: 70)
下載附件
2020-3-13 21:44 上傳
基本上STC8A8K64S12所有的寄存器都可以找到,寄存器的名稱都是嚴格按照STC8的datasheet編寫。如果要查看寄存器的某個位的狀態,可以點擊在寄存器名稱的前的“+”圖標。比如要查看ADC寄存器的各個位,如下圖所示:
ADC.JPG (173.13 KB, 下載次數: 65)
下載附件
2020-3-13 21:51 上傳
有些寄存器某些位不存在,則用“-----”代替。有些名稱占據多個位,則在其后標注序號,比如上圖ADC_CHS占據四個位,從高位到低位依次標注為:ADC_CHS3、ADC_CHS2、ADC_CHS1、ADC_CHS0。
只要在欄目點擊寄存器的數值,就可以填寫修改的數值,修改是立即生效的,非常方便。比如我要點亮P5.5引腳的LED燈,只需要將P5端口修改為0xDF,或者直接往P5_5寫0。對于一些位于片外RAM空間0xfe00-0xffff的寄存器,ROM-Monitor訪問這部分寄存器前會保存P_SW2寄存器的內容,再使能P_SW2寄存器的EAXFR位,訪問結束后,再還原之前的P_SW2寄存器內容,所以IAR可以正常讀寫這些寄存器。但是,應用程序代碼如果要正常訪問這些寄存器,要先使能P_SW2寄存器的EAXFR位。
需要注意的是,有些寄存器不要隨意更改,比如改變時鐘的分頻系數。這樣會導致串口1的波特率發送改變,那ROM-Monitor就無法和IAR正常通信。串口1用到P3_0和P3_1,所以不要修改P3端口這兩個位的內容。如果直接將IAP_CONTR寄存器的值修改為0x60,會導致單片機重啟,ROM-Monitor和IAR的通信也會失敗。
寄存器選擇欄目。我新增了一個ROM-parameter,這個其實不是STC8A8K64S4A12寄存器的內容,這些是STC-ISP軟件在燒錄時添加到ROM的一些特殊參數,比如7位出廠序列號、bandgap(內部基準電壓)和喚醒頻率等參數。由于ROM-Monitor下載應用程序前會先擦除0x1000-0xffff的內容,這會把這些參數也一并擦除了。為了保存這些數據,ROM-Monitor在擦除數據前,會先找出這部分數據,然后復制到ROM-Monitor中沒有使用到的ROM區域。在ddf硬件描述文件將這部分ROM區域也列舉成寄存器,這樣IAR就能正常訪問,如下圖所示:
出廠序列號.JPG (264.28 KB, 下載次數: 67)
下載附件
2020-3-13 22:18 上傳
從上圖可以看出,ROM-parameter里的Device_ID:F62884625356AF,bandgap:0x53d=1341mV,這和STC-ISP列出的信息完全一致。如果STC-ISP沒有勾選“在程序區的結束處添加重要測試參數”,那就只有Device_ID,沒有其他參數。下圖是STC官方STC8的datasheet手冊的存儲器特殊參數的地址說明:
特殊值.JPG (66.71 KB, 下載次數: 70)
下載附件
2020-3-14 01:31 上傳
通過上圖,可以知道STC8A系列不同容量單片機的出廠序列號存放地址,只要遍歷這些地址,就能讀取出廠序列號。更重要的是,可以根據出廠序列號存放的地址,準確判斷單片機的ROM大小。這樣,ROM-Monitor就可以計算出所需擦除的ROM空間大小,可以動態適配其他型號的STC8A單片機。如果單片機的ROM空間只有60K,我硬要擦除到64K,那會導致單片機卡死。
四、ROM-Monitor的使用說明。
1、燒錄ROM-Monitor固件
下載ROM-Monitor.JPG (171.08 KB, 下載次數: 79)
下載附件
2020-3-17 22:11 上傳
打開附件提供的ROM-Monitor for STC8A V1.1.hex文件,使用STC官方提供的STC-ISP軟件燒錄文件,IRC頻率選擇24M。由于我使用的單片機是STC8A8K64S4A12,這個型號很奇葩,需要指定EEPROM的大小,一定要選擇64K。這樣對于ROM空間0x0000-0xffff地址空間,單片機就能正常讀寫,不然會卡死。下面列舉datasheet手冊一些STC8A單片機的IAP讀寫區域,如下圖所示:
IAP.JPG (81.48 KB, 下載次數: 65)
下載附件
2020-3-13 23:37 上傳
除了STC8A8K64S12需要用戶自定義,其他幾款單片機的ROM全部地址空間都支持IAP方式讀寫,ROM的擦除和讀寫主要是利用IAP技術實現的,ROM-Monotor下載調試應用程序也是基于IAP技術。
2、支持的STC8A單片機系列
理論上,所有ROM空間大于4K、外部RAM空間大于128字節、并且支持IAP的8051單片機都可以用ROM-Monitor。不過不同品牌的單片機有差異性,特別是IAP操作方式的差異,導致不同的單片機需要定制不同的ROM-Monitor。本次測試的單片機型號為STC8A8K64S4A12,ROM-Monitor暫時只適用于STC8A系列的單片機。由于手頭沒有其他STC8A單片機,沒做測試,所以不能保證所有型號的STC8A單片機都能正常使用。
3、修改鏈接配置文件
因為ROM-Monitor位于ROM空間0x0000-0x0fff,所以應用程序需要指定從0x1000處開始。在D:\IAR_8051_10\8051\config\devices\STC目錄找到打開對應xcl后綴的鏈接配置文件,將-D_CODE0_START=0修改成-D_CODE0_START=0x1000,點擊保存即可。
linker.JPG (60.75 KB, 下載次數: 68)
下載附件
2020-3-14 12:03 上傳
在Option→Linker里,在Linker configuartion file欄,勾選override default,選擇對應的xcl鏈接配置文件。
4、選擇debugger工具
debugger.JPG (58.93 KB, 下載次數: 71)
下載附件
2020-3-14 11:25 上傳
在Option→Debugger里,Device選擇ROM-Monitor,勾選Override default,選擇對應的ddf后綴的硬件描述文件。
rom_monitor1.JPG (43.84 KB, 下載次數: 70)
下載附件
2020-3-14 11:25 上傳
在Option→Debugger→ROM-Monitor→Download里,勾選Verify download。這個選項是驗證應用程序下載完整性,建議勾選。
rom_monitor2.JPG (54.87 KB, 下載次數: 73)
下載附件
2020-3-14 11:25 上傳
Option→Debugger→ROM-Monitor→Serial Ports里,選擇正確的串口號,波特率可以選擇9600、38400、57600、115200,不過建議選擇115200,因為調試速度會快很多。右邊On Reset欄,Toggle DTR和Toggle RTS不用勾選。DTR和RTS是串口芯片的兩個輸出引腳,一般是連接到單片機Reset引腳,這樣上位機就可以翻轉DTR或者RTS來讓單片機硬件復位。很多STC8A開發板都沒有連接,本次ROM-Monitor利用軟件復位代替硬件復位。其他選項按照圖示選擇即可。
5、開始調試
ddbugger.png (24.53 KB, 下載次數: 72)
下載附件
2020-3-14 13:20 上傳
直接點擊上圖‘“download and Debug”按鍵,ROM-Monitor會自動下載應用程序,然后進入調試模式。
reset.png (22.6 KB, 下載次數: 59)
下載附件
2020-3-14 13:25 上傳
如果要重新返回到程序起點,點擊上圖“Reset”按鍵即可。
make.png (24.77 KB, 下載次數: 64)
下載附件
2020-3-14 13:27 上傳
如果修改了應用程序語句,可以點擊上圖“Make_Restart_Debugger”,IAR會退出調試模式,然后重新編譯程序,并且在編譯完成后,再次進入調試模式,ROM-Monitor即時也會下載最新的應用程序。
stop.png (22.58 KB, 下載次數: 80)
下載附件
2020-3-14 13:33 上傳
如果要退出調試模式,可以點擊上圖“Stop Debugging”。
6、一些錯誤的處理
①、如果出現斷點沖突的彈窗,要先把斷點取消,然后點擊“Reset”按鍵,或者點擊“Make_Restart_Debugger”按鍵。
②、如果點擊“download and Debug”按鍵,一直沒有響應,請檢測串口通信端口是否正確,然后把開發板斷點再上電。
③、如果在調試過程中途出現ROM-Monitor沒有響應的情況,請檢測代碼是否使用到ROM-Monitor的串口資源,或者更改了系統時鐘頻率;
④、如果不小心修改了ROM-Monitor的固件,比如代碼使用了中斷向量地址,可能會導致ROM-Monitor固件損壞,這時就算重新斷電再上電也沒用,需要重新用STC-ISP燒錄ROM-Monitor固件。
五、附件說明
附件包含三個文件夾:
1、IAR平臺STC兼容文件
2、OLED工程
3、ROM-Monitor固件
其中IAR平臺STC兼容文件主要是STC8A系列單片機的頭文件、鏈接配置和硬件描述文件。需要復制到IAR指定安裝目錄,詳細可以查看說明。OLED工程是本次測試工程,可以直接編譯測試,用來評估ROM-Monitor的功能。ROM-Monitor固件包含ROM-Monitor for STC8A V1.1.hex,使用前需要先燒錄到STC8A單片機里。
六、簡單對比IAR平臺的ROM-Monitor for STC8A和KEIL平臺的STC Monitor-51
對比.JPG (139.54 KB, 下載次數: 71)
下載附件
2020-3-18 11:59 上傳
其中片內特殊寄存器指片內位于0x80-0xff之間的寄存器,片外特殊寄存器指位于0xfe00-ffff之間的寄存器。STC Monitor-51不支持顯示位于片外的特殊寄存器,即無法顯示I2C外設、系統時鐘和增強型PWM外設的所有寄存器的狀態。而ROM-Monitor for STC8A支持顯示全部特殊寄存器,支持實時讀和寫全部特殊寄存器。
占用資源.JPG (55.93 KB, 下載次數: 72)
下載附件
2020-3-18 11:35 上傳
對于STC8系列STC Monitor-51不占用ROM空間的情況,個人認為這只是不占用用戶ROM空間,STC官方針對STC8系列單片機特意加大了系統區空間大小,STC Monitor-51應該被存放在系統區,這個系統區也是STC單片機固化bootloader的區域,騰出6K的空間給STC Monitor-51用。系統區是無法被用戶是直接訪問的。另外,STC的IAP系列的單片機的系統區大小沒有增加,所以STC Monitor-51需要占用6k的用戶ROM空間。
對于RAM空間的占用,STC Monitor-51占用空間不是768bytes,就是1024bytes,需要單片機擁有至少1024K以上片外RAM空間才能正常仿真。假如單片機片外RAM只有1024bytes,那仿真時,用戶只能使用片內256bytes的RAM空間。而ROM-Monitor for STC8A僅占用128bytes的片外RAM空間。
如果對IAR平臺感興趣的話,可以下載查看。跨平臺移植不易,希望得到大家的支持。 b站視頻演示地址:https://b23.tv/BV1oE411A7Lw
下面是實物圖
實物圖.jpg (3.29 MB, 下載次數: 76)
下載附件
2020-3-14 17:28 上傳
|
-
-
調試工程文件.rar
2020-3-19 17:37 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
439.19 KB, 下載次數: 47, 下載積分: 黑幣 -5
三個文件壓縮包
|