這篇文章會分享如何為一個全新的 Atmega328P IC 燒錄 Bootloader,以便之後的開發進行。
Arduino 之所以能夠輕鬆的透過 USB 將寫好的 sketch 程式一鍵上傳,這都要歸功於內部的 Bootloader Firmware。Bootloader 顧名思義就是啟動載入器,開機時會優先執行 bootloader 再由它判斷下一步要做什麼,若有燒錄的請求就引導燒錄進行,若沒有則會執行舊的 sketch 程式。
若沒有了 Bootloader 的幫忙,則只能透過 Programmer 對 MCU 進行燒錄,就得準備一台 Programmer 才能為 Arduino 燒錄,開發過程就沒那麼方便了。
然而當你單獨購買一個 Atmega328P MCU 時,廠家不一定會幫你預先燒錄 Bootloader,我們就得自行燒錄,而 Bootloader 的燒錄,還是得透過 Programmer 才行。
所以這篇文章就是要寫如何透過 Programmer 來為 Atmega MCU 燒錄 Bootloader。有了 Bootloader 之後,我們只需連接一條 USB 就能上傳程式。
由於要燒錄 Bootloader 一定得透過 Programmer 幫忙,而一般使用者通常不會有,所以我們用另一種方式,就是把手邊的 Arduino 變成 Programmer,稱之為 Arduino ISP
。
接著我們要用麵包板為 Atmega328P MCU 搭建基本的工作電路,讓他得以運作,接受 Programmer 的燒錄。
如此,我們就能透過一台 Arduino ISP 為 Atmega328P MCU 燒錄 Bootloader。
MCU 基本工作電路
這邊我以手邊的 Arduino Leonardo
為例:
打開 Arduino ISP 範例程式:
將 Leonardo USB 與電腦連接後,選擇 Leonardo 並選擇正確的 Port 即可上傳。
上傳後這塊 Leonardo 就是 Programmer 啦,USB 不用拔掉,放著待會繼續用。
Atmega328P IC 需要最基本的工作電路才可以運作,像是電源、震盪器等等。
Atmega328P (IC Pin) | 接法 |
---|---|
pin7(VCC) | 連接至 5V |
pin8(GND) | 連接至 GND |
pin9 (OSC1) | 連接至震盪器其中 1 隻腳位,再連接電容至 GND |
pin10 (OSC2) | 連接至震盪器另 1 隻腳位,再連接電容至 GND |
pin19 (BUILTIN_LED) | 連接至 LED |
[ ] TODO, 補上電路圖會更清楚些
【Alternative】其實還有個做法,如果手邊有另一塊可替換 IC 的 Arduino UNO 板子,那麼上面 Atmega328P IC 底座是可以插拔的,只要把舊 IC 拔起來,換上目標 Atmega328P 那就可以直接利用這塊現成電路啦!。只不過這篇文章想介紹自己動手搭建基礎工作電路的方式,如果手邊有可替換 IC 的板子可以自己選擇要怎麼做哦。
線路連接:
這是 Arduino Leonardo 作為 ISP 對 Atmega328P 燒錄的接線方式,換做其他板子也是一樣。
Programmer (Leonardo) | Target (Atmega328P) |
---|---|
Digital Pin 10 | Reset Pin (pin 1) |
ICSP MOSI | ICSP MOSI (pin 11) |
ICSP MISO | ICSP MISO (pin 12) |
ICSP CLK | ICSP CLK (pin 13) |
有些教學會教,可以使用板子上的 11、12、13 去做連接,這是因為 Arduino UNO 板子上這幾隻腳與 ICSP 腳實際是有連通的。不過 Arduino Leonardo 並沒有,所以若想使用 Arduino Leonardo as ISP,且想照某些範例使用 11、12、13 這幾隻腳位,也是可以,不過必須在
ArduinoISP.ino
內 uncomment 這一行// #define USE_OLD_STYLE_WIRING
,這樣就可以使用這幾隻腳作為 ISP 腳位了,但是必須知道這樣實際使用的是 Software SPI,而非 Hardware SPI,所以還是建議不要多此一舉,乖乖地使用 Leonardo 板子上的 ICSP 腳位就好,不用改程式且因為這是硬體 SPI 腳位,所以快又穩。
選擇目標板子: 因為是對 Atmega328P 燒錄,所以目標板子就選擇也是使用 Atmega328P 的 Arduino UNO
。
選擇 Port: 因為實際跟電腦連接的是 Leonardo,所以選擇 Leonardo USB Port
。
選擇 Programmer: Tools -> Programmer -> Arduino as ISP (Atmega32u4)
最後按下 Tools -> Burn Bootloader
即可。
測試 Bootloader 的方式很簡單,只要接上 USB 並且可以看到 Serial Port 出現,那大概就是有成功了,不過我們可以更進一步上傳程式看看。
可惜,用麵包板搭建最基本的工作電路,就沒有 USB 可以用了。 但沒有關係,對於 Arduino UNO 而言,其 USB 其實是連結到板上另一顆 USB2UART 晶片,再接到 UART 腳位,換句話說,裝置與電腦透過 USB 連接,最終卻是連結 Atmega328P 的 UART 腳位接收上傳程式。 這代表我們可以直接利用外接的 USB2UART 板子,將 USB2UART 的 tx rx 跟 Atmega328P 上的 UART 對接(之間有各加 1 個 1K 電阻),也要可以順利上傳程式才對!
上傳程式時,我們還需要對板子 reset,讓板子 reset 後進入 bootloader 引導後續上傳。reset 方式有很多種,UNO 板是用 DTR 訊號自動在上傳時對目標板子做 reset,這個自動 reset 機制很酷也很有趣,但可以討論的東西不少,我想可以以另一篇文章深入探討。
我們只需要讓 Atmega328P 的 reset pin 在需要 reset 的時候接到 GND,就可以做到 reset。 這邊我們先土炮一點,用一個 reset button 配一個 pull up resistor 來實現:
記得按的 timing 要抓一下,畢竟我們是手動控制,大概按下上傳後看到 IDE 在等待的時後(等待裝置 reset)趕快按下去再放開,如果 bootloader 順利運作就能上傳成功啦!
【Alternative】用可替換 ic 的 Arduino UNO 板子 只要將燒好 bootloader 的 Atmega328P 放上 Arduino UNO 28 pins 底座,然後用 USB 線嘗試 upload sketch,若可上傳代表 bootloader 運作 ok。
通常只有當板子上沒有任何韌體時或者板子韌體毀損或者有特殊需求,才會透過 ISP 燒錄,不然一般只需透過 ISP 燒錄一次 bootloader,有了 bootloader 後,只需連接 USB 就可以一鍵上傳 sketch 了,非常方便。
ISP 是 In-System-Programming ,代表無需將 ROM 從板子上取下,而是直接在板子完整的系統上進行燒錄。
AVR 微控制器內部的 ISP 模組設計是基於 SPI
接口。燒錄時,程序數據透過 MOSI(Master Out, Slave In) 傳送到微控制器,並從 MISO(Master In, Slave Out) 回應,時鐘信號由 SCK(Serial Clock) 提供。只要將 Programmer 與 Arduino 的 ISP 介面連接即可燒錄。
通訊埠 Port 是與電腦連接之裝置所使用的通訊埠端口,而不同情境下,連接至電腦的可能是:
目標板,就是要接收新程式的板子,因為不同型號的板子會有不同的軟硬體配置,所以需要選擇正確的板子。 注意,如果透過 A 板子作為 ISP 燒錄 B 板子,那目標板子要選 B 板子的型號才是,因為 B 板才是新程式的受體。
燒錄 Bootloader 只能透過 Programmer,而 Programmer 有很多種,運作方式可能有差異,所以要選擇使用哪一種 Programmer。
Tools -> Programmer -> ...)
選擇 Programmer。Tools -> Burn Bootloader
上傳按 Sketch -> Upload
上傳。
Tools -> Programmer -> ...)
選擇 Programmer。Sketch -> Upload Using Programmer
以 programmer 上傳。注意: 若用 Programmer 燒錄 Sketch 程式,則 Bootloader 就會被洗掉 (所以看起來用 Programmer 就是整個 Flash 重燒,無法保留 Bootloader 只燒錄 App)。 因此對於新的 ATmega328p 板子要像 UNO 板子一樣運作的話,還是要燒 Bootloader,之後就使用 Bootloader 上傳 Sketch 程式就好了。