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
發佈了35 篇原創文章 · 獲贊 82 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章