關於ISP、IAP、DFU和bootloader
阿新 • • 發佈:2018-04-10
bootstrap 必須 握手 通信協議 垃圾 普通 復位 方式 ots
為了能不把芯片拆下來就更新程序,人們發明了一種叫ISP的技術,即在系統編程。在系統編程就是通過串口或者其他通用的通用通信接口,為芯片編程。在產品上可以預留一個串口,需要更新時,只要把產品插到電腦上,通過串口把程序傳到芯片裏,就完成了更新操作。ISP技術的實現,其實就是依賴於芯片在出廠時預先燒寫的bootloader程序,bootloader還有很多不同的叫法,比如ISP服務程序(STC宏晶的51單片機這麽叫)、bootstrap(MSP430的BSL編程這麽叫)等等。但本質上都是相同的。bootloader在芯片復位(或者上電)時,會優先於用戶自己的代碼啟動。這段代碼會首先檢測芯片的指定引腳上有沒有特定的信號,如果沒有,則跳入用戶程序執行。否則就按照bootloader特定的通信協議,與計算機進行握手,並最終觸發計算機將新的程序通過通用接口(如串口)傳送到芯片。然後bootloader通過軟件的方式(當然需要硬件支持),擦除用戶程序區,將新的程序寫入到指定的位置。另外提到的是,bootloader是由各個芯片廠家自己寫的,因此不是通用的。盡管都是用串口,但通信協議是不同的。比如像國產垃圾STC單片機,通信協議甚至是保密的。因此通常需要廠家提供的專用ISP軟件(flash loader)才能給芯片編程。 另外,比ISP更先進一點的一個技術叫IAP,即在應用編程。IAP技術允許用戶程序修改flash。說白了IAP就是允許用戶自定義bootloader,或者說有2個bootloader,一個bootloader是芯片出廠時固化的,另一個是用戶自定義的。自定義的bootloader在固化的bootloader之後啟動。也許你就要問了,用戶自定義的bootloader不就是用戶程序嗎?其實它跟普通用戶程序的區別就是它不會那麽容易的被擦除。。。一般是先用專用軟件,調用固化的bootloader,來寫入自定義的bootloader,然後自定義的bootloader利用能寫flash的能力,來給芯片寫入新的程序。 為什麽需要自定義bootloader呢?默認的bootloader需要在固定引腳,通過串口,以固定的協議傳送程序。如果你對這個過程的任何一點不滿意,那你就要自定義bootloader嘍~ 再說說DFU,這個名詞通常是針對USB設備說的。因為現在的設備基本都是USB了,沒用串口的了。。。很多MCU也內置了USB的支持。DFU是Device Firmware Upgrade的縮寫,在我的理解中,DFU模式就是支持USB的bootloader。。。DFU模式通常需要特定的驅動程序,因為現在的芯片USB接口通常工作於VCP(Virtual COM Port)模式,插到電腦上後會虛擬成一個串口設備。而DFU模式則於此不同。VCP模式下,PC端是一個串口驅動程序,MCU端是用戶程序。而DFU模式下,PC端是DFU驅動程序,MCU端是bootloader。DFU模式的bootloader通常是用戶自定義的,並通過固化的bootloader由串口刷入。 進入bootloader程序通常有兩種方式,一種是硬件復位(或者掉電),即按板上的復位按鈕。芯片復位後會先執行bootloader。第二種方式是以軟復位的方式進入的,軟復位通常是通過PC發送一串指定的指令,用戶程序中會通過中斷服務程序檢測到並處理這些指令。滿足觸發條件後,芯片將執行軟復位,並將指定的地址裝入PC寄存器,從而通過軟件的方式跳入bootloader程序。 最後我們來看一下Arduino和Maple板子的刷寫方式。 Arduino板上有兩個MCU,一個是我們都知道的執行程序的那個MCU,它裏面刷寫了Arduino自定義的bootloader。另外一個是USB接口附近的一個QFN封裝的小芯片,它也是一片MCU,只不過是帶USB支持的。在這裏它完成USB轉串口的功能。更重要的是,它可以監測PC發來的指令流,其中就包含了復位指令。收到USB發來的復位指令後,它會在目標MCU的復位腳加一個負脈沖,使得目標MCU復位,進而將下載指令流放到目標MCU的串口上。使得目標MCU的bootloader檢測到,從而完成下載。 Maple只有一個MCU,因此從USB收到下載指令後,只不過復位的不是別的芯片,而是復位自己。將自己復位到DFU模式,從而利用bootloader從USB下載程序。
這是嵌入式開發中常用的幾個專業術語,其誕生的背景和其具體作用大概如下
在很久很久以前,那是8051單片機流行的時代,做單片機開發都需要一個專用工具,就是單片機的編程器,或者叫燒寫器。說“燒”寫一點不為過,當年的經典芯片AT89C51在編程時需要十幾伏的高電壓,加在一個特定的引腳上,才能進入編程。對於某款芯片的編程,都有一個特定的時序,這個時序通常在芯片的datasheet裏進行描述並以硬件實現。另外在編程器裏的也有一個MCU,這其中使用軟件產生這個時序,從而對目標芯片進行編程。電腦通過串口把程序發到編程器,編程器按照規定的時序把程序送入目標芯片。 但是這種編程模式有幾個問題,首先就是需要為特定的芯片購買特定的編程器。這種編程器通常比較昂貴,且只能用於特定型號的MCU. 對於企業來說,編程器的成本算不了什麽,但更大的問題是,編程時我們必須把待編程的芯片從產品上拆下來,插到編程器上,編程後再安裝回產品中。這種方法對於雙列直插式的芯片也許是可行的。但對於現在日益流行的表面貼裝技術是很不可行的,尤其是BGA封裝的芯片,通常需要專業設備才能拆卸,拆下後需要重新植球才能焊接。。。為了更新固件而將其從高密度的PCB板上拆下來,是非常不可行的。為了能不把芯片拆下來就更新程序,人們發明了一種叫ISP的技術,即在系統編程。在系統編程就是通過串口或者其他通用的通用通信接口,為芯片編程。在產品上可以預留一個串口,需要更新時,只要把產品插到電腦上,通過串口把程序傳到芯片裏,就完成了更新操作。ISP技術的實現,其實就是依賴於芯片在出廠時預先燒寫的bootloader程序,bootloader還有很多不同的叫法,比如ISP服務程序(STC宏晶的51單片機這麽叫)、bootstrap(MSP430的BSL編程這麽叫)等等。但本質上都是相同的。bootloader在芯片復位(或者上電)時,會優先於用戶自己的代碼啟動。這段代碼會首先檢測芯片的指定引腳上有沒有特定的信號,如果沒有,則跳入用戶程序執行。否則就按照bootloader特定的通信協議,與計算機進行握手,並最終觸發計算機將新的程序通過通用接口(如串口)傳送到芯片。然後bootloader通過軟件的方式(當然需要硬件支持),擦除用戶程序區,將新的程序寫入到指定的位置。另外提到的是,bootloader是由各個芯片廠家自己寫的,因此不是通用的。盡管都是用串口,但通信協議是不同的。比如像國產垃圾STC單片機,通信協議甚至是保密的。因此通常需要廠家提供的專用ISP軟件(flash loader)才能給芯片編程。 另外,比ISP更先進一點的一個技術叫IAP,即在應用編程。IAP技術允許用戶程序修改flash。說白了IAP就是允許用戶自定義bootloader,或者說有2個bootloader,一個bootloader是芯片出廠時固化的,另一個是用戶自定義的。自定義的bootloader在固化的bootloader之後啟動。也許你就要問了,用戶自定義的bootloader不就是用戶程序嗎?其實它跟普通用戶程序的區別就是它不會那麽容易的被擦除。。。一般是先用專用軟件,調用固化的bootloader,來寫入自定義的bootloader,然後自定義的bootloader利用能寫flash的能力,來給芯片寫入新的程序。 為什麽需要自定義bootloader呢?默認的bootloader需要在固定引腳,通過串口,以固定的協議傳送程序。如果你對這個過程的任何一點不滿意,那你就要自定義bootloader嘍~ 再說說DFU,這個名詞通常是針對USB設備說的。因為現在的設備基本都是USB了,沒用串口的了。。。很多MCU也內置了USB的支持。DFU是Device Firmware Upgrade的縮寫,在我的理解中,DFU模式就是支持USB的bootloader。。。DFU模式通常需要特定的驅動程序,因為現在的芯片USB接口通常工作於VCP(Virtual COM Port)模式,插到電腦上後會虛擬成一個串口設備。而DFU模式則於此不同。VCP模式下,PC端是一個串口驅動程序,MCU端是用戶程序。而DFU模式下,PC端是DFU驅動程序,MCU端是bootloader。DFU模式的bootloader通常是用戶自定義的,並通過固化的bootloader由串口刷入。 進入bootloader程序通常有兩種方式,一種是硬件復位(或者掉電),即按板上的復位按鈕。芯片復位後會先執行bootloader。第二種方式是以軟復位的方式進入的,軟復位通常是通過PC發送一串指定的指令,用戶程序中會通過中斷服務程序檢測到並處理這些指令。滿足觸發條件後,芯片將執行軟復位,並將指定的地址裝入PC寄存器,從而通過軟件的方式跳入bootloader程序。 最後我們來看一下Arduino和Maple板子的刷寫方式。 Arduino板上有兩個MCU,一個是我們都知道的執行程序的那個MCU,它裏面刷寫了Arduino自定義的bootloader。另外一個是USB接口附近的一個QFN封裝的小芯片,它也是一片MCU,只不過是帶USB支持的。在這裏它完成USB轉串口的功能。更重要的是,它可以監測PC發來的指令流,其中就包含了復位指令。收到USB發來的復位指令後,它會在目標MCU的復位腳加一個負脈沖,使得目標MCU復位,進而將下載指令流放到目標MCU的串口上。使得目標MCU的bootloader檢測到,從而完成下載。 Maple只有一個MCU,因此從USB收到下載指令後,只不過復位的不是別的芯片,而是復位自己。將自己復位到DFU模式,從而利用bootloader從USB下載程序。
關於ISP、IAP、DFU和bootloader