開發環境安裝
ICE模擬器(In Circuit Emulator) 微處理機中附有程式,當這些程式發生問題時,微處理機並不能知道這些程式跑到哪裡去了,這時就要靠ICE來模擬微處理機,讓ICE告訴我們問題出在哪裡。 ICE 可以讓我們在程式執行時檢視處理器的狀態。ICE 有自己的 RAM, ROM, processor 及軟體,本身就是一套嵌入式系統,功能強大,可以代替真實CPU接至待測電路板,配合操作軟體,模擬CPU動作,可設定軟、硬體中斷及單步(Step)執行。
Domingo for Linux 操作 啟動Domingo整合開發環境軟體
Domingo for Linux 操作 選擇New Project
PCM之使用 因為ARM的CPU內有很多系統設定暫存器,若未初始化這些特殊的暫存器,系統是無法使用的,而所需設定的暫存器有很多,所以設了一個PCM檔案來簡化初始化的動作。
PCM之使用 在Config PCM視窗點選 “Import”
PCM之使用 選擇creator_ram.pcm系統記憶體初始化模組檔
PCM之使用 選取 “OK” 初始化系統設定暫存器
ICE與Creator連線 點選工具列上 Debug->Connect按鈕, 讓ICE模擬器與Creator主板連線
在Domingo下編譯範例程式 在開啟的project上->右鍵選單->Add Target
在Domingo下編譯範例程式 Complier Tools選擇IAR ARM
在Domingo下編譯範例程式 在TOOLKIT_DIR欄位選擇Compiler檔案路徑
在Domingo下編譯範例程式 在開啟的Target上->右鍵選單->Target Manager
在Domingo下編譯範例程式 File Type選擇 C/ASM file(*.c,*h,*.s79,*.asm,*.s) 從範例程式的目錄下選擇所有檔案->Add File(s)
在Domingo下編譯範例程式 系統初始化程序(cstartup.s79) 中斷向量的初始化 記憶體管理系統的初始化(4510addr.h) 堆疊區的初始化 CPU工作模式的初始化 程式碼區段的初始化 資料區段的初始化 其他必要的初始化 啟動中斷 進入 main() 程序
在Domingo下編譯範例程式
在Domingo下編譯範例程式
在Domingo下編譯範例程式
在Domingo下編譯範例程式
在Domingo下編譯範例程式 XLINK -> Config -> XCL file name欄位 1.勾選Override default 2.編輯欄位新增指定之範例程式目錄下的Demo_Creator.XCL檔
在Domingo下編譯範例程式 完成complier選項設定後在Target上 -> 右鍵選單 -> Build ALL Target
在Domingo下編譯範例程式 Compile 詳細過程在 Console 視窗可見
在Domingo下編譯範例程式 Compiler成功後再將可執行檔(*.d79) Download到ICE上,可參考下列兩種方式: A、執行 Toolbar 上的快捷鍵 或 使用 Debug -> Load Module指令。 B、執行 Project -> Make and Load 指令,同時執行 Make 及Load Module 動作。
單步指令執行1 Step Over(不進入副程式) Debug Toolbar上 快捷鍵
單步指令執行2 Step Into(可進入副程式) Debug Toolbar上 快捷鍵
設定中斷點 Free GO
設定中斷點 工具列 -> view -> break 右鍵選單-> Edit S/W Break
設定中斷點 int main(void) { unsigned int i; for(i=0;i<5;i++) IO_REG2 = 0xfe00; led_test(); IO_REG2 = 0xf000; } Pass Count: 當執行點通過某一行列特定次數後,其斷點條件才成立 Program Window
中斷執行結果 R4暫存器對應變數 i 值 執行前,i=0 執行後,i=2
週邊I/O map IO_REG0 0X0C00 7 Segment(七段顯示器) IO_REG1 0X0C02 offset 說明 IO_REG0 0X0C00 7 Segment(七段顯示器) IO_REG1 0X0C02 Switch和Keypad讀入 IO_REG2 0X0C04 LED和Keypad Scan輸出 Ox3F00C06 IO_REG2 2byte = 16bits Ox3F00C04 IO_REG1 2byte = 16bits Ox3F00C02 IO_REG0 2byte = 16bits Ox3F00C00 Ox3F00000
各I/O之位元定義 7 6 5 4 3 2 1 15 14 13 12 11 10 9 8 IO_REG0 IO_REG1 IO_REG2 15 14 13 12 11 10 9 8 IO_REG0 SEG_H SEG_G SEG_F SEG_E SEG_D SEG_C SEG_B SEG_A COM3 COM2 COM1 COM0 IO_REG1 S1.7 S1.6 S1.5 S1.4 S1.3 S1.2 S1.1 S1.0 SCAN_ I3 I2 I1 I0 IO_REG2 SCAN_O3 SCAN_O2 SCAN_O1 SCAN_O0 D7 D6 D5 D4 D3 D2 D1 D0 bit Reg
LED & DIP Switch LED DIP SWITCH Creator提供之LED(D0~D7),邏輯0代表亮,邏輯1代表滅 Creator提供之switch(S1.0~S1.7),邏輯0代表ON,邏輯1代表OFF
延遲(Delay) 利用延遲達到閃爍的效果 EX: IO_REG2 = 0xfe00; //D0 亮 Delay (UI ms) IO_REG2 = 0xfd00; //D1 亮
範例程式(led_example)
實習 實習一:載入led_example,寫一個跑馬燈程式,從左到右亮LED,再從右亮到左。(每個LED delay 0.5秒) 實習二:接續實習一,增加SWITCH控制,使SWITCH做對應遮罩。 (S1.0 ON則D0不亮,S1.1 ON則D1不亮……以此類推) 實習三:接續實習二,將跑馬燈改成如下所示, SWITCH則改成ON後作相反動作。 (S1.0 ON,若原本D0不亮,則改成D0亮;反之若原本D0亮,則改成D0不亮……以此類推) 作完請找助教檢查 Hint : AND( & ), OR( | ), XOR( ^ ), NOT ( ~ ), 左移 ( << ), 右移 ( >> )