不久前從一個學長那兒借來了一塊tms320f2812的板子和一個TDS510仿真器,不過一直沒有機會動手試試。最近因為閑下來了,於是重新翻出板子開始學習DSP。以前折騰過一些單片機,玩得最多的要數Keil下開發stm32,但是這次要接觸的CCS還真是讓我略感頭疼,在熟悉CCS基本操作上就花了不少時間。廢話不多說,先總結下這幾天初學DSP2812的一些經驗。說明一下,CCS版本是3.3,仿真器用的是TDS510 USB2.0(mingwei的)。
打開CCS之前首先要選擇目標平台,當然我選擇F2812。在這里要區分Simulator和Emulator。Simulator是軟件仿真,即用CCS去模擬2812執行指令,不需要硬件支持;因為是模擬,因此dsp程序運行時速度很慢,並且模擬的2812存在一些缺陷(等下會提到)。Emulator就是用仿真器連接目標板進行調試,具體就不多說了。
為了熟悉CCS下的基本調試,我選擇先用Simulator來調試程序(感覺這樣簡單一些)。打開CCS、創建工程、編寫程序……這個程序的功能是傳感器的數據(先用MATLAB采集並保存為.dat文件),然后計算出歐拉角;由於涉及到數學運算,在這里用到了IQmath庫,其sin、cos等函數是通過查找表實現的,這個查找表被固化在2812的Boot ROM里(0x3FF000)。然而問題來了,在調試程序時發現,sin、cos等函數的計算結果為0,折騰半天后用CCS的Memory觀察窗口觀察0x3FF000的內容時才發現了原因,Boot ROM存放數學表的地方是空的(全為0),汗~~~。之后用Emulator跑同樣的程序就沒有這個問題,說明用Simulator調程序時,若用到了IQmath要小心了。
基本操作大致熟悉后,開始弄Emulator。首先安裝TDS510驅動(折騰了好久,最后才知道仿真器的驅動不支持64位系統),接着安裝CCS用到的仿真器文件,最后打開CCS、板子上電、仿真器Connect、Load Program、Run,到此還一切正常(看到了程序printf的輸出),可是主循環才跑了2次就出錯了。這是我遇到的第二個“大”問題,下面詳細介紹。
首先Load Program后進入_c_int00,然后進入main執行自己編寫的程序。出現錯誤的現象為:在包含數據處理代碼的主循環中設置斷點並不停地Run(每Run一次代表一次循環,記下變量i的值),運行過程中發現程序會跑飛,而且每次都在固定的循環次數后跑飛(當i = 2時);注釋掉printf,程序又在i = 14時跑飛。這里所說的跑飛是指,點擊run之后,CCS左下角Emulator狀態卡在Running,點擊halt之后程序跑到了[0x000066 FFFF ITRAP1]。
......
i= 0;
while(1){
//process
i ++;
printf("%.2f %.2f %.2f\n", ang[0], ang[1], ang[2]); <<<<<<在這里設置斷點
}
......
最后發現上述問題的原因是沒有關閉看門狗。2812上電時看門狗是使能的,由於沒有關閉看門狗,因此當看門狗計數器溢出時復位了CPU,導致CPU從Bootloader(0x3FFC00)開始運行,Flash啟動模式下Bootloader會跳轉至0x3F7FF6,本例中0x3F7FF6是沒有被寫入代碼(codestart段)的,所以CPU跑飛。
解決方法:在main函數中加入如下語句,在main中關閉看門狗。
int *WatchdogWDCR = (void *) 0x7029;
// Disable the watchdog:
asm(" EALLOW ");
*WatchdogWDCR = 0x0068;
asm(" EDIS ");
另一種解決方法是將程序入口(Code Entry Point)設為codestart,在里面關閉看門狗再進入_c_int00。首先,在DSP281x_CodeStartBranch.asm中,
......
.ref _c_int00
.global code_start <<<<<<<添加這一句
.....
然后Build Option中的Link頁中,在Code Entry Point(-e)編輯框里添加code_start(原本是空,則默認為_c_int00),這樣就將Debug->Restart的位置從_c_int00改為了codestart,codestart會關閉看門狗然后跳轉至_c_int00。但是更改Code Entry Point后,編譯時會出現warning: entry-point symbol other than "_c_int00" specified: "code_start"提示。以下設置可以去掉這個警告:
在“TMS320C6000優化匯編手冊”第五章“鏈接C/C++代 碼”有一段關於_c_int00符號的說明。它是運行支持庫RTS.lib包含的一個重要函數。如 果Linker選項使用-c或-cr選項_c_int00被自動定義為程序的入口點。消除警告的方法,在 Linker選項下面選擇No Autoinitialization。(本段摘自網絡)