說起給單片機燒錄程式,大家應該都不陌生吧,我最早接觸單片機是從51單片機開始的,型號是STC89C52RC,當時燒錄程式就是用的下面這種燒錄軟體——STC-ISP,
這種方式,通過串口連接單片機,選擇一個合適的波特率就可以燒錄了,
后來學習STM32,編程時使用KEIL軟體自帶的下載按鈕就能下載程式,方便了不少,但需要額外使用J-Link等下載器,
再后來,接觸到產品研發,給已經發布出的產品升級,都是要靠遠程無線升級的(想想看,產品已經到客戶那里了,當軟體需要升級時,要是還使用有線的方式燒錄程式,得有多麻煩)
既然給單片機燒錄程式的方式有多種,那燒錄方式具體怎么分類呢?
可以分為3種:
-
ISP(In-System Programming)
在系統編程,使用引導程式(Bootloader)加上外圍UART/SPI等介面進行燒錄,
-
ICP (In-circuit programmer)
在電路編程,使用SWD/JTAG介面,
-
IAP(In-Application Programming)
指MCU可以在系統中獲取新代碼并對自己重新編程,即用程式來改變程式,
這3種燒錄方式的原理是什么呢?在分析原理之前,需要先了解一下單片機Flash的訪問地址,看看程式是燒錄到哪個位置了,
單片機Flash在地址映射表中位置
下圖是一張STM32F4xx的地址映射表,從0x0000 0000到0xFFFF FFFF,總計4Gbyte,單片機的片上Flash、片上RAM、片上外設以及外部擴展介面的訪問地址,都被映射到這4Gbyte的范圍之內,

這張圖中,我們需要先注意下半部分
- Main memory 主存盤區
通常,我們撰寫的代碼,是放到主存盤區的起始位置(0x0800 0000)開始運行的,燒錄程式時,直接將程式燒錄到這里即可(KEIL軟體給STM32燒錄程式的默認燒寫地址就是0x0800 0000開始)
- System memory系統存盤區
System memory(起始位置0x1FFF 000)是STM32在出廠時,由ST在這個區域內部預置了一段BootLoader, 也就是我們常說的ISP程式 ,這是一塊ROM,出廠后無法修改,
了解了程式的具體地址,還要看一下單片機的啟動方式:
啟動方式選擇
STM32有兩個BOOT引腳,通過配置不同的高低電平,可以讓單片機從不同的地址開始運行,
- BOOT0=0, BOOT1任意
通常我們是在Main memory 主存盤區(0x0800 0000)運行程式,BOOT0引腳拉低即可,
這種情況,KEIL軟體給STM32燒錄程式,就是直接在這個地址燒錄,燒錄完,直接在這個地址處運行,
- BOOT0=1,BOOT1=0
這種情況就用在使用串口方式給STM32燒錄程式,這時單片機從系統存盤器(0x1FFF 0000)啟動,運行的是出廠預置的BootLoader程式,可以接收串口發來的程式,并將其寫入Main memory(0x0800 0000),程式燒錄完成后,再將BOOT0引腳拉低,Main memory(0x0800 0000)處運行剛燒錄的代碼了,
- BOOT0=1,BOOT1=1
這種情況是從記憶體中啟動,內置SRAM(也就是STM32的記憶體中),既然是SRAM,自然也就沒有程式存盤的能力了,這個模式一般用于程式除錯,目前我還沒用過這種方式,大家平時用這種方式的多么?
| BOOT0 | BOOT1 | 啟動方式 | 說明 |
|---|---|---|---|
| 0 | × | 主閃存存盤器 | 主閃存存盤器被選為啟動區域 |
| 1 | 0 | 系統存盤器 | 系統存盤器被選為啟動區域 |
| 1 | 1 | 內置SRAM | 內置SRAM被選為啟動區域 |
有了上面的了解,再來看一下ISP、ICP和IAP
ISP(串口燒錄)
特點:
- BOOT0 = 1,BOOT1 = 0
- 啟動地址:0x1FFF0000
- 使用串口下載程式
- 系統存盤器(System memory)啟動方式運行內置的Bootloader,將程式寫入主存盤區
- 重啟后,需要再將BOOT0拉低,從主存盤區啟動程式
下圖是ISP方式的燒錄,使用FlyMcu這個軟體,通過串口給STM32燒錄程式

ICP(JTAG口燒錄)
特點:
- BOOT0 = 0,BOOT1 = x
- 啟動地址:0x08000000
- 使用JTAG或者SWD模式下載程式
- 主閃存存盤器(Flash memory)啟動方式,將程式在主存盤區寫入
- 重啟后也直接從這啟動程式
下圖是ICP方式的燒錄,使用JFlash軟體或KEIL,通過J-Link給STM32燒錄程式

KEIL軟體的默認下載地址,就是從0x0800 0000 開始的,

IAP
IAP的原理與上面兩種有較大區別,這種方式將主存盤區又分成了兩個區域(根據實際需要由開發者自行分配),0800 0000起始處的這部分,存盤一個開發者自己設計的Bootloader程式,另一部分存盤真正需要運行的APP程式,
單片機的Bootloader程式,其主要作用就是給單片機升級,在單片機啟動時,首先從Bootloader程式啟動,一般情況不需要升級,就會立即從Bootloader程式跳轉到存盤區另一部分的APP程式開始運行,
假如Bootloader程式時,需要進行升級(比如APP程式運行時,接收到升級指令,可以在flash中的特定位置設定一個標志,然后觸發重啟,重啟后進入Bootloader程式,Bootloader程式根據標志位就能判斷是否需要升級),則會通過某種方式(比如通過WIFI接收升級包,或借助另一塊單片機接收升級包,Bootloader再通過串口或SPI等方式從另一塊單片機獲取升級包資料)先將接收到的程式寫入存盤區中存盤APP程式的那個位置,寫入完成后再跳轉到該位置,即實作了程式的升級

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/280558.html
標籤:其他
