AVR單片機燒寫Arduino bootloader


關于bootloader

Arduino
  • 通常情況下MCU燒寫程序都需要通過專門的編程器進行。
  • 假使每次復位時MCU不是從程序存儲器起始位置開始讀取命令,而是預先加載一段指令,實現一些設置和功能,再開始執行代碼。這樣可以極大的方便MCU編程與使用,而這些預先寫入的程序代碼就是bootloader。
  • Arduino通過預先寫入的bootloader,當用戶通過串口給Arduino板下載程序時,Arduino板首先會復位一次,這樣就進入了bootloader。 接著向Arduino板發送特定的下載指令,bootloader識別到這些指令后就會開始接收待更新的程序代碼,并寫入到內部flash中;如果沒有進行下載,bootloader沒有識別到下載指令,那么它就會跳轉到程序區正常工作。
  • 總結上述內容,可以理解為:Arduino之所以能用一根usb線就愉快下載程序的原因就是bootloader。

問題來了:
  • 有些情況下我們需要自己搭建Arduino最小系統板,或者將其嵌入到自己的PCB項目里。這些只要你想都很容易,但是:新出廠的ATmega328p等等MCU里是沒有bootloader的,怎么辦?這時就需要自己燒寫。

燒寫bootloader

? 硬件接口

燒寫bootloader本質上只是使用編程器燒寫一段特殊的程序到MCU中,因此其方法與使用編程器燒寫程序是一樣的,這個方法在不同廠商、不同種類的單片機上都是不同的。
對于一般的Arduino開發板使用的AVR單片機來說,燒寫程序是通過ICSP(in-circuit serial programmming)硬件接口來實現的。


Arduino UNO Rev3上的ICSP接口
如圖所示,Arduino UNO Rev3上有兩個ICSP接口,
分別對應其中ATmega32u4(左上,用于usb轉串口)
和ATmega328p(右下,用于正常執行指令)。

`對于一般的Arduino開發板,只需要對主處理器燒寫bootloader即可。
如:ATmega328p、ATmega1280、ATmega2560等MCU。`

ICSP接口有6個引腳,其定義如下表所示,MISO對應引腳1。

(1) MISO VCC
SCK MOSI
Reset GND

引腳可以分為三個部分:

?   SPI接口 `MISO` `MOSI` `SCK` 
?   電源 `VCC` `GND` 
?   復位 `Reset `

有些Arduino開發板中不僅引出了ICSP接口,同時其中的SPI接口部分的引腳也可以復用作為普通IO使用,包含在了普通的IO口排座中。部分開發板如Pro MINI等則沒有專門設置ICSP接口排針,但所有引腳均引出。下表是部分Arduino開發板上IO口與SPI引腳的對應關系。

Arduino MCU MOSI MISO SCK
ATmega328p 11 12 13
mega1280\mega2560 51 50 52
Intel Curie 11 12 13

?燒寫過程

燒寫bootloader可以使用多種編程器。
Arduino IDE的Tools -> Programmer下顯示了所有支持的編程器列表:


支持燒寫的編程器列表
在此小編推薦大家使用`Arduino as ISP`方式,此方式較為簡單而且成功率高。

Arduino as ISP簡單來說就是將一塊Arduino開發板作為編程器:給它用普通方式下載一段專門的程序,將其變為一個ISP下載器。
準備好編程器后,將其相應引腳與待燒寫bootloader的開發板對應引腳相連,并通過Arduino IDE來進行bootloader燒寫

步驟如下:

    ?   1、制作編程器板

打開IDE,Files -> Examples -> ArduinoISP -> ArduinoISP
接入作為編程器的Arduino開發板并下載此程序,我們稱其為編程器板。


制作編程器板需下載的對應程序
    ?   2、編程器板與待燒寫板連接

對應連接關系如下表所示:

編程器板 待燒寫板
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

實際連接電路示例如下:


編程器與ICSP接口連接電路示意

編程器與引腳直接連接電路示意
    ?   3、使用Arduino IDE進行bootloader燒寫

按照步驟2連接好電路后,打開IDE,執行如下步驟:

  • 點擊Tools -> Boards選擇待燒寫板的類型;
  • 在Tools -> Programmer中選擇Arduino as ISP;
  • 點擊Tools -> Burn Bootloader;


    選擇待燒寫板的類型

    使用Arduino IDE進行bootloader燒寫

    燒錄Bootloader

自測實拍

寫了這么多,到底好不好用呢,小楊今天就用自己的畫的PCB試試效果。步驟如上文所述。效果如下:


用UNO作為編程器,與自己畫的待燒寫PCB連接

Bootloader燒錄成功后D13燈會同時閃爍

測試下載成功

以上就是通過已有的Arduino開發板對部分AVR單片機進行bootloader燒寫的一種方法。當然方法很多,各有優缺點大家根據自己的喜好和需要進行選擇。不足之處還請大家批評指正。

希望文章內容對您稍有幫助。

如果喜歡文章內容,記得點贊關注我們哦。

附:Arduino官方參考文檔地址


    感謝一直關注著禾灮成長進步的朋友們。你們的信任、支持和鼓勵,鞭策著我們一路走到了今天。
    
    感謝所有的合作伙伴,我們相互促進,共同見證了彼此的成長。

    感謝所有曾經在禾灮彼此倚靠、相互鼓勵、攜手同心、砥礪同行的兄弟姐妹。這里承載了我們的青春與熱血。

                禾灮,感謝有你。

    未來,我們將一如既往,砥礪前行。

                                        禾灮·小楊
                                       2018.07.17

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容