天天看點

淺談arduino的bootloader

origin: http://blog.sina.com.cn/s/blog_870ad0e00100tug3.html

在arduino的闆子上,作為核心的avr單片機往往都會燒錄一個bootloader,這個叫做bootloader的東東其實是arduino研發團隊針對arduino闆子開發的一小段代碼,借助于這段代碼,我們可以在不用外部燒錄工具的情況下來把我們自己的代碼下載下傳到AVR單片機中。為了使一些朋友更容易了解,不妨打個比方,bootloader類似于我們電腦中的windows作業系統,而我們的代碼則類似于運作于windows上的各種程式。

   一般而言,arduino闆的賣家都會把每塊闆的bootloader都燒好後再出售,這樣買家直接收到闆後就能夠把自己在arduinoIDE中編寫的程式借助PC的USB口來下載下傳到arduino單片機内。當然,下載下傳bootloader是需要借助于外部下載下傳器的,可支援的下載下傳器不少,基中比較具有成本效益的是usbtinyisp,在淘寶上很多店家都有出售,比如易捷機器人電路的價格就隻有38元。對于一般使用者,因為在下載下傳自己代碼的時候偶爾會出現破壞bootloader的情況,就像PC的windows系統突然之間崩潰了一樣。這時候,就會需要用外部下載下傳器來恢複這個bootloader,就相當于PC重裝系統。關于通過USBTINYISP來下載下傳bootloader,在易捷機器人電路的USBINYISP寶貝說明裡就有詳細的指導:http://item.taobao.com/item.htm?id=5508660354 

    在arduinoIDE的菜單中有一項是Burnbootloader,專門是用來燒bootloader用的,在連接配接好下載下傳器和arduino闆的ISP接口後,選擇"Burnbootloader",以目前主流的uno闆為例,這時程式會按以下步驟自動操作:

    (1)确認采用stk500的通訊協定。bootloader.atmega328P-<BOARD>.programmer(default value: stk500) is the protocal used by thebootloader.  

  (2)允許對相應記憶體位址空間操作。bootloader.atmega328P-<BOARD>.unlock_bits(default value: 0x3F) is the value to write to theATmega328 lock byte to unlock the bootloadersection.

   (3)寫熔絲位的擴充位。bootloader.atmega328P-<BOARD>.extended_fuses(default value: 0x05) is the value to write tothe extended byte of the ATmega168fuses. 

   (4)寫熔絲位的高位。bootloader.atmega328P-<BOARD>.high_fuses(default value: 0xde) is the value to write to the high byte of theATmega328 fuses.

  (5)寫熔絲位的低位。bootloader.atmega328P-<BOARD>.low_fuses(default value: 0xff) is the value to write to the low byte of theATmega328 fuses.

  (6)給出bootloader檔案的路徑。bootloader.atmega328P-<BOARD>.path(default value: optiboot) is the path (relative to the Arduinoapplication directory) containing the precompiled bootloader.

   (7)給出bootloader檔案名。bootloader.atmega328P-<BOARD>.file(default value: optiboot_atmega328.hex) is the name ofthe file containing the precompiled bootloader code (inbootloader.path).

  (8)鎖定,禁止再修改相應記憶體空間。bootloader.atmega328P-<BOARD>.lock_bits(default value: 0x0F) is the value to write to theATmega328 lock byte to lock the bootloader section (soit doesn't get accidently overwritten when you upload asketch).

   通常,arduino闆在下載下傳好了bootloader但還沒有upload任何使用者代碼的時候,會定義一個led(pin13)一閃一閃的,以作訓示。