前言:
在英國的時候,學校大多專注在純軟開發課程上,例如敏捷開發(Agile Development), Web Development, database 等。其中有一堂課令我印象深刻,就是用 logic Unit, MUX 零件自組 16 Instruction Processor,然後自己手動按 Clock 去 fetch / execute instrction,透過這樣的學習,讓我更清楚整個電腦實際運作 Code 的流程。
自從經過這樣的學習後,對於 Processor 總是有種幻想,雖然回到台灣之後都是在做純軟工作,不過還是很希望可以接觸到更多相關知識(在台灣這些都是資工基本課程,可惜我大學是偏資管,並沒有機會能修到這些課)。幸好,在交大課程找到 微處理機系統實驗
和 嵌入式系統設計概論與實作
這兩堂課程,其中曹孝櫟教授教的非常詳細又很有重點,讓我瞬間變他的腦粉啊 <3
由於學的很開心,也收穫很多,就來記錄一下學習過程。
課程連結
Nucleo-64 development board
這堂課是使用 Nucleo
系列板子,Processor 是 ARM Cortex-4M
,所以就也買了類似的開發板來玩玩。我是從 物聯網科技 這邊買的,寄件速度快,有可以超商取貨,材料種類又多,很推薦這個網站。
至於開發板,我是買 NUCLEO-F411RE,記憶體配置和課程所用的開發板略有不同,但是說明手冊差不多,這樣在看課程時比較好做對照。因為是菜鳥初買板子,不知道開發板沒有附上 mini USB 轉接線,所以又匆忙跑去買 QQ。另外就是其他電子零件像是 LED 燈 / 顯示模組 / 杜邦線 / keypad 等也都是課程會用到,需要另外買,不過都很便宜,所以可以一次補齊。
電子元件項目整理
- NUCLEO-F411RE 開發板 (相容 Arduino)
- mini USB 轉 USB 線
- 杜邦線數條
- MAX7219 7-segment LED 模組
- Arduino 4×4 keypad
其他像是單個 LED 燈 / Button 等,因為開發板本來就有內建 User Button 和 LED2,所以就不買。
Dev Environment
IDE
SW4STM32
課程上是使用 SWSTM32 IDE 來開發, SW4STM32
是 ST 基於 Eclipse
所發展的 IDE,它結合 openOCD 和 GDB 發揮出強大的 debug 功能。官方手冊也有提供像是 TrueSTUDIO
等教學,所以也可以改用其他 IDE 來開發。
安裝 SW4STM32 軟體需要一點小技巧,如果你剛從官網下載完檔案,會是一個 install_sw4stm32_macos_64bits-v2.6.run
的 file,此時需透過 bash shell 在 terminal 執行:
/bin/bash install_sw4stm32_macos_64bits-v2.6.run
就會解壓縮,並執行 jar 檔案來安裝這套軟體了。(仔細看 install_sw4stm32_macos_64bits-v2.6.run
這個 file,可以看到 bash 指令和一大串資料,所以才可以使用 bash 來執行)
Debugger
ST-LINK/V2
此開發板本身有內建 ST-LINK/V2
,這是提供給 STM8
和 STM32
的 hardware Debugger。透過 ST-LINK/V2,在執行 debug 模式時,就可以得知 General 和 I/O Registers 狀況,並且知道自己寫的程式正不正確。
在 NUCLEO-F411RE 內建的 ST-LINK/V2 僅提供
SWD (Serial Wire Debug)
Interface 去連接 STM32 Processor,但如果是外接的 ST-LINK/V2,就可以多支援JTAG (Joint Test Action Group)
。
ST-LINK/V2
Debugger 的串接流程如下:
![openocd.png]({{ site.url }}/assets/images/openocd.png)
OpenOCD and GDB
有了 ST-LINK/V2
,我們可能還需要軟體層的 Debugger 來協助偵錯。目前大家常使用到的 Debugger 是 GDB,此外還需要一個中介層來連結 ST-LINK/V2
與 GDB
,在 SW4STM32
是使用開放軟體 OpenOCD 。當使用者在按下 Debug 按鈕,會啟動 OpenOCD ,它先進行設定以透過 USB 連接到 STM32 上的 ST-LINK,然後使用 3333
port 與 GDB 交換訊息。 此外還會使用 4444
port 來接收使用者所下的指令。(意思是,使用者可以連接到 4444 port,接著輸入特定指令來查看 STM32 processor 執行情形)
上面有提到,在啟動 openOCD 時,它需要先進行設定,才可以正確地把程式下放到 processor 上。而這個設定檔會包含像是 processor 型號等,不過如果使用 SW4STM32
,使用者在選擇 device 型號階段,這樣的設定文件就會由系統自動設定完成。
一個標準 openOCD 的 .cfg 內容如下:
configuration setup(s)
source [find interface/stlink.cfg]
set WORKAREASIZE 0x8000
transport select "hla_swd"
set CHIPNAME STM32F411RETx
set BOARDNAME NUCLEO-F411RE
# Enable debug when in low power modes
set ENABLE_LOW_POWER 1
# Stop Watchdog counters when halt
set STOP_WATCHDOG 1
# STlink Debug clock frequency
set CLOCK_FREQ 4000
# use hardware reset, connect under reset
# connect_assert_srst needed if low power mode application running (WFI...)
reset_config srst_only srst_nogate connect_assert_srst
set CONNECT_UNDER_RESET 1
source [find target/stm32f4x.cfg]
話說,我們在執行安裝 SW4STM32
軟體流程時,會發現 ST-LINK Server
這個選擇性的軟體安裝, ST-LINK Server
可以用來將 debug information 傳給多個 Client,如此一來就可以同時使用不同軟體來接收 debug info。不過,在一般情況下,這軟體沒有很必要,因此不一定要安裝。
Check ST-LINK/V2 Connection Status
最後,要怎樣知道 ST-LINK/V2 已經和 PC 連接完成了呢?開發板上有一個 LD1
的 LED 燈,可以讓我們知道 ST-LINK/V2 和 PC 的連接狀況。通常可能會遇到 LD1 燈顯示紅色閃爍,代表它正在連接或是還沒有連接。如果連接成功,會持續亮紅色燈不閃爍。透過這樣的方式,我們就可以很快地知道連接狀態了!
The LED1 Status
• Slow blinking Red/Off: at power-on before USB initialization
• Fast blinking Red/Off: after the first correct communication between the PC and ST-LINK/V2-1 (enumeration)
• Red LED On: when the initialization between the PC and ST-LINK/V2-1 is complete
• Green LED On: after a successful target communication initialization
• Blinking Red/Green: during communication with target
• Green On: communication finished and successful
• Orange On: Communication failure