什么是bootloader
一般情況下微處理器寫入程序時都通過專門的編程器進行燒寫,但是也可以通過在MCU中預先寫入一些程序來實現某些基本功能,這些預先寫入的程序代碼就是bootloader。這樣每次復位時MCU就不是從程序存儲器起始位置開始讀取命令,而是先加載bootloader,實現一些設置和功能,再開始執行代碼。
arduino通過預先寫入的bootloader,每次通過串口給arduino板下載程序時,首先會令arduino板復位一次,這樣就先進入了bootloader,接着向arduino板發送特定的下載指令,bootloader識別到這些指令后就會緊接着開始接收剩下的新的程序代碼寫入到內部flash中,如果沒有進行下載,bootloader沒有識別到下載指令,那么它就會跳轉到程序區正常工作。
簡而言之,Arduino上的bootloader就是能讓你用一根usb線就可以愉快下載程序的原因所在
為什么要自己燒寫bootloader
有同學可能要問了,既然bootloader已經這么寫好在Arduino板里了,那為什么我們還要自己燒寫呢,這不是我們喜歡折騰,而是因為:
- 自己搭建一塊Arduino板,如果想自己做一塊arduino板或者想將其嵌入到PCB項目里,而新出廠的單片機里是沒有bootloader的,這時就需要自己燒寫。
- 某些罕見情況下舊的bootloader會導致一些bug,如我遇到過舊版本bootloader無法使用watchdog的問題,這個時候寫入新版本bootloader可能會解決問題(至少watchdog沖突的問題驗證過是可以這樣解決的)
硬件接口
燒寫bootloader本質上只是使用編程器燒寫一段特殊的程序到單片機中,因此其方法與使用編程器燒寫程序是一樣的,這個方法在不同廠商、不同種類的單片機上都是不同的。而對於arduino一般的開發板使用的avr芯片來說,燒寫程序是通過ICSP(in-circuit serial programmming)硬件接口來實現的

如上圖所示,arduino uno上有兩個ICSP接口,分別對應其中atmega32u4(左上用於usb轉串口)和atmega328(右側用於正常執行指令),一般來說我們只需要對右側的主處理器燒寫bootloader即可。對於如pro mini等來說,片上則只有一個單片機需要燒寫。
MISO | VCC |
SCK | MOSI |
Reset | GND |
ICSP接口有6個引腳,其定義如上表所示,其數字順序從左到右,從上到下,左上為1。其中可以分為三個部分:
- SPI接口
MISO
MOSI
SCK
- 電源
VCC
GND
- 復位
Reset
有些arduino板中不僅引出了ICSP接口,同時其中的SPI接口部分的引腳也可以復用作為普通IO使用,包含在了普通的IO口排座中,而像pro mini等則沒有專門設置ICSP接口排針,但所有引腳均引出。
arduino board | MOSI | MISO | SCK |
---|---|---|---|
uno\pro mini | 11 | 12 | 13 |
mega1280\mega2560 | 51 | 50 | 52 |
arduino 101 | 11 | 12 | 13 |
上表是部分arduino板上IO口與ICSP引腳的對應關系。
燒寫過程
燒寫bootloader可以使用多種編程器,打開arduino IDE的Tools -> Programmer
下顯示了所有支持的編程器列表,這里推薦使用Arduino as ISP
方式,較為簡單而且成功率高。
Arduino as ISP
簡單來說就是用另一塊arduino板,給它用普通方式下載一段專門的程序,將其變為一個ISP下載器,再將其相應引腳與待燒寫bootloader的板子相連,再通過arduino IDE來控制進行bootloader燒寫。這里斜體字顯示了分為三個步驟。
- 專門的程序
打開IDE,Files -> Examples -> ArduinoISP -> ArduinoISP
,使用這個程序下載到一塊arduino板中,我們暫且稱這塊板為ISP板。 - ISP板與目標板連接
由前面介紹可知,這里應該是將ISP板的引腳連接到目標板上的ICSP接口上去,連接對應表如下(以使用UNO作為ISP板為例)
ISP板 | 目標板 |
---|---|
MISO / 12 | MISO / ICSP-1 |
Vcc / 5V | Vcc / ICSP-2 |
SCK / 13 | SCK / ICSP-3 |
MOSI / 11 | MOSI / ICSP-4 |
10 | Reset / ICSP-5 |
GND | GND / ICSP-6 |
實際連接電路如下所示,其中左邊是ISP板,連接到電腦上,右邊是等待下載bootloader的目標板

- 使用arduino IDE進行bootloader燒寫
按照前面的方式連接好ISP板和目標板后,將ISP板連接到電腦上,打開IDE,首先按住ctrl + shirft + M
打開串口調試窗口,然后點擊Tools -> Boards
選擇目標板的類型。然后在Tools -> Programmer
中選擇Arduino as ISP
,最后點擊Tools -> Burn Bootloader
,此時會開始進行燒寫,同時串口調試窗口里會有相關提示和確認,按照其說明輸入相應按鍵即可完成。
作者:cheng3100
鏈接:https://www.jianshu.com/p/2f274f8b3dab
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。