USBaspLoader 是給 AVR microcontrollers 使用的 USB bootloader,它可以用在支援 2 KB 以上 bootloader section 的所有 AVRs 上,例如 ATMega8。USBaspLoader 會燒錄到 Flash 的上層記憶體 (upper memory),並且會在 reset 的時候取得 MCU 的控制權。假如硬體狀況有符合 (這個狀況可以設定,例如利用 jumper),bootloader 會等待 USB bus 上的資料,然後把應用程式自我燒錄到 Flash 裏,當硬體狀況解除時 (例如拿掉 jumper),bootloader 就會把控制權交給應用程式。
USBaspLoader 跟 Thomas Fischl 的 avrusbboot 以及 bootloadHID 很像,不過 USBaspLoader 不需要特殊撰寫的燒錄工具,它模擬了 Thomas Fischl 的 USBasp programmer,因此你只需要用 avrdude 便可以燒錄韌體。
另外,由於 USBaspLoader 可以搭配 avrdude 使用,因此它同時也可以跟 Arduino IDE 整合。
下載
USBaspLoader 可以在底下的網址取得:
USBasp 驅動程式:
硬體電路
基本上,USBaspLoader 可以用在所有 V-USB 支援的電路上 (MCU 的 bootloader section 至少要有 2 KB)。底下是一個參考電路,由於 USB D+ 和 D- 用 3.3V 的電壓,因此在 D+ 和 D- 上使用稽納二極體 (Zener diodes)。你必須確保 D- 準位在 2.5V 與 3.6V 之間。
▲ 註: USBaspLoader 所用的 Jumper 預設是 PD7 接腳,這部份圖上沒有畫出來
韌體調整
● bootloaderconfig.h:
定義所用的 D+ 和 D- data lines 腳位以及 Jumper 接腳。必須根據你的硬體調整 USB_CFG_IOPORTNAME, USB_CFG_DMINUS_BIT 和 USB_CFG_DPLUS_BIT 以及 Jumper 接腳,Jumper 接腳預設是 PD7。
● Makefile:
定義所用的 MCU, bootloader 起始位址以及時脈頻率。必須根據你的硬體調整 DEVICE, BOOTLOADER_ADDRESS 和 F_CPU。
補充說明:
● 關於 BOOTLOADER_ADDRESS: BOOTLOADER_ADDRESS 用來設定 bootloader 的起始位址。 USBaspLoader 需要 2 KB 的 flash 空間,以 ATmega8 為例,mega8 有 8 KB (0x2000) 的 program flash,所以 bootloader 的起始位址就是 0x2000 – 0x800 = 0x1800,mega168 有 16 KB (0x4000) ,起始位址就是 0x4000 – 0x800 = 0x3800,而 mega328 有 32 KB (0x8000),所以起始位址就是 0x8000 – 0x800 = 0x7800。
● 另外,為了讓 MCU 在 reset 時跳到 bootloader,必須調整 Fuse 的設定,啟用 BOOTRTS 選項 (=0),並把 bootloader size 設定 2 KB (1024 words)。
編譯
下指令編譯韌體,你會需要 WinAVR:
$ cd firmware
$ make
接著把韌體燒錄到板子上,讓裝置重新上電 (記得設定 jumper),作業系統會偵到有新的硬體裝置,此時請安裝剛剛下載的 USBasp 驅動程式,然後「裝置管理員」視窗裏就會出現剛剛安裝的裝置 ,如下圖所示:
使用 USBaspLoader
現在可以寫個簡單的程式來測試 USBaspLoader。
最簡單的方法是直接用 Arduino 的 Blink 範例程式,這支程式會讓 PB5 (亦即 Arduino 的 pin 13) 上的 LED 閃爍 。
Arduino IDE 預設不會顯示 hex 檔所在的位置,因此在編譯程式的時候,要按著 SHIFT 鍵不放再點 Verify 編譯程式,然後畫面下方的狀態視窗就會顯示 HEX 檔所在的位置:
接著開始進行韌體的燒錄程序。
首先,先設定 jumper (預設是在 PD7 接腳),並且 reset AVR。
然後下指令把 Blink.cpp.hex 燒錄到板子上:
$ avrdude -q -c usbasp -p atmega328p -U flash:w:Blink.cpp.hex
操作畫面如下:
如果一切順利的話,PB5 (Arduini pin 13) 上的 LED 就會開始閃爍。
0 意見:
張貼留言