一、什么是Bootloader?
大家都知道,Arduino的本質就是“ATmega單片機最小系統板+USB轉串口芯片”。所有單片機的應用開發中,均涉及到將編譯好的程序上傳(燒錄)到單片機的程序存儲器(一種ROM)中的過程。當前主流的單片機都支持ISP(In System Programing,在系統編程),即無需將單片機芯片從電路板(系統)上取下,即可對其上傳(燒錄)程序,其基本原理主要是通過串行通信端口或SPI(Serial Peripheral Interface,串行外設接口)端口來將程序從電腦傳輸到單片機的。為了在通用的通信接口上實現這種專用目的的數據傳輸,需要在單片機的ROM中事先燒錄一段代碼,這段代碼在每次加電時自動運行,主要用于檢測來自電腦端的程序傳輸信號,如果檢測到特定信號,則啟動程序上傳(燒錄)過程,否則就轉去執行常規程序。這段代碼就叫做Bootloader。
總之,Bootloader本質上與單片機程序存儲器里存儲的常規程序并無二致,可以將其理解為一種專用功能的程序,因而Bootloader本身也是可以向上傳(燒錄)程序一樣進行修改的。
Arduino為配合IDE實現一鍵上傳(燒錄)程序,為各型號的Arduino板定制了專用的Bootloader,IDE會根據工具-處理器
和工具-開發板
中的設置配合特定型號Arduino板的Bootloader來進行程序上傳(燒錄)。如果上述菜單中的設置與目標Arduino板中的Bootloader不匹配,則會出現長時間停留在上傳中……
最后提示上傳失敗的情況。一個具體的例子可參見:Arduino IDE的安裝、測試與相關設置。
二、如何讓Arduino變身編程器(燒錄器)
由于Arduino所采用的單片機支持SPI通信協議以及通過該協議上傳(燒錄)程序,因而Arduino本身通過編程即可變身基于SPI協議的編程器。
操作過程非常簡單,打開文件-示例-11.ArduinoISP
,將其上傳到Arduino板,此時的Arduino板就成為了一個編程器。使用這個編程器,通過Arduino板上的6針ICSP( in-circuit serial programming)接口(各型號Arduino板均提供的基于SPI協議的編程接口),就可以對目標Arduino板進行更新Bootloader和上傳(燒錄)程序的操作了。
三、用NANO更新NANO Bootloader
- 如圖連接兩個NANO;
- 將作為編程器的NANO(左)用USB線連接到電腦;
- 在
工具-開發板
中選擇目標板的型號,此處為Arduino NANO
; - 在
工具-處理器
中選擇ATmega328P
,這就是2018年1月后新官方NANO的Bootloader; - 在
工具-端口
中選擇作為編程器的NANO所連接的端口(作為目標的NANO無需接USB線,由作為編程器的NANO為其供電); - 在
工具-編程器
中選擇Arduino as ISP
; - 單擊
工具-燒錄引導程序
,將Bootloader燒錄至目標NANO。
如果使用UNO作為目標板或編程器,操作過程與連接方式完全同上。可參考文后參考資料。
四、將NANO用作編程器(燒錄器)
利用上面的連接方式,除了向目標板燒錄Bootloader外,也可以向目標板燒錄用戶編寫的程序,這一點佐證了Bootloader與用戶程序沒有本質區別。具體操作過程是:
- 如上圖連接兩個NANO;
- 將作為編程器的NANO(左)用USB線連接到電腦;
- 在
工具-開發板
中選擇目標板的型號,此處為Arduino NANO
; - 在
工具-處理器
中選擇ATmega328P
,這就是2018年1月后新官方NANO的Bootloader,若沒有更新,則需要選擇ATmega328P (Old Bootloader)
,總之3、4兩項要與目標板相匹配; - 在
工具-端口
中選擇作為編程器的NANO所連接的端口(作為目標的NANO無需接USB線,由作為編程器的NANO為其供電); - 在
工具-編程器
中選擇Arduino as ISP
; - **使用
項目-使用編程器上傳
菜單項啟動“編譯+上傳”的過程,這一步須注意,不能使用工具欄中的右向箭頭(上傳)
圖標。
五、在面包板上搭建自己的Arduino
通過上述原理可知,對于一個ATmega328P的最小系統,只要燒錄進相應Arduino型號的Bootloader,即可將其“變成”一個Arduino板,即能夠使用Arduino IDE為之編寫并上傳程序。
因此,我們可以參照Arduino NANO或UNO的電路圖搭建ATmega328P的最小系統,然后利用另外一塊作為編程器的NANO為之燒錄Bootloader,燒錄完成之后,即可利用第四節介紹的方法,在Arduino IDE中向其上傳我們編寫的程序了。
ATmega328P最小系統的參考電路圖如上圖所示。所需原件如下:
- 晶振 16MHz 1個
- 瓷片電容 22pF 2個
- 瓷片電容 100nF 2個
- 電解電容 47uF 1個
- 電阻 10K 1個
- 電阻 1M 1個
- 集成電路 ATmega328PU(DIP28封裝) 1個
ATmega328P引腳與作為編程器的NANO或UNO端口連接的對應關系如下:
ATmega328P引腳序號 | Arduino GPIO序號 |
---|---|
1 | D10 |
17 | D11 |
18 | D12 |
19 | D13 |
需要注意的是:這個DIYduino可以通過作為編程器的NANO下載程序,但是無法像標準Arduino那樣直接與電腦進行串口通信, 因為這里上傳程序使用的是SPI通信方式而非串口通信方式,若要使用串口與電腦通信,仍需外接USB到串口(TTL)的轉接器。
參考資料:
Arduino - ArduinoISP https://www.arduino.cc/en/tutorial/arduinoISP