天天看點

STM32筆記之 Boot(自舉模式)一、自舉配置二、自舉模式各簡述三、關于 Boot啟動的應用擴充:ISP、ICP、ICSP、IAP程式設計方式

寫在前面:

本文章旨在總結備份、友善以後查詢,由于是個人總結,如有不對,歡迎指正;另外,内容大部分來自網絡、書籍、和各類手冊,如若侵權請告知,馬上删帖緻歉。

目錄

  • 一、自舉配置
  • 二、自舉模式各簡述
    • 1、Main Flash memory(BOOT1=x BOOT0=0)
    • 2、System memory(BOOT1=0 BOOT0=1)
    • 3、Embedded Memory(BOOT1=1 BOOT0=1)
    • 4、總結
  • 三、關于 Boot啟動的應用
    • 1、引腳信号的确定
    • 2、調試口下載下傳失敗(一)
    • 3、調試口下載下傳失敗(二)
    • 4、禁用調試口後的拯救方式及分析
  • 擴充:ISP、ICP、ICSP、IAP程式設計方式
    • 1、ISP(In-System Programming)系統内程式設計
    • 2、ICP(In-Circuit Programming)線上程式設計
    • 3、ICSP(In-Circuit Serial Programming)線上串行程式設計
    • 4、IAP(In-Application Programming)應用内程式設計

一、自舉配置

存儲器采用固定的存儲器映射,代碼區域起始位址為

0x0000 0000

(通過 ICode/DCode 總線通路),而資料區域起始位址為

0x2000 0000

(通過系統總線通路)。Cortex-M3 CPU 始終通過 ICode 總線擷取複位向量,這意味着隻有代碼區域(通常為 Flash)可以提供自舉空間。STM32F1xx 微控制器實施一種特殊機制,可以從其它存儲器(如内部 SRAM) 進行自舉。

在 STM32F1xx 中,可通過 BOOT[1:0] 引腳選擇三種不同的自舉模式,如下圖所示:

STM32筆記之 Boot(自舉模式)一、自舉配置二、自舉模式各簡述三、關于 Boot啟動的應用擴充:ISP、ICP、ICSP、IAP程式設計方式

當複位後,在 SYSCLK 的第四個上升沿鎖存 BOOT 引腳的值。複位後,使用者可以通過設定 BOOT1 和 BOOT0 引腳來選擇需要的自舉模式。

BOOT0 為專用引腳,而 BOOT1 則與 GPIO 引腳共用。一旦完成對 BOOT1 的采樣,相應 GPIO 引腳即進入空閑狀态,可用于其它用途。

器件退出待機模式時,還會對 BOOT引腳重新采樣。是以,當器件處于待機模式時,這些引 腳必須保持所需的自舉模式配置。這樣的啟動延遲結束後,CPU 将從位址 0x0000 0000 獲 取棧頂值,然後從始于 0x0000 0004 的自舉存儲器開始執行代碼。

注意:如果器件從 SRAM 自舉,在應用程式初始化代碼中,需要使用 NVIC 異常及中斷向量表和偏 移寄存器來重新配置設定 SRAM 中的向量表。

二、自舉模式各簡述

1、Main Flash memory(BOOT1=x BOOT0=0)

使用的是 STM32内置的 Flash,一般我們使用 JTAG或者 SWD模式下載下傳程式時,就是下載下傳到這個裡面,然後重新開機後直接從 Flash中啟動程式。

2、System memory(BOOT1=0 BOOT0=1)

屬于 STM32自帶的 BootLoader,這種模式啟動的程式功能是由廠家設定的;該模式下,隻能通過官方給出的特定的序列槽或者 USB等專屬引腳下載下傳:

STM32筆記之 Boot(自舉模式)一、自舉配置二、自舉模式各簡述三、關于 Boot啟動的應用擴充:ISP、ICP、ICSP、IAP程式設計方式

當使用該方式下載下傳,可以通過這個官方的 BootLoader将程式下載下傳到系統的 Flash中,是以,在下載下傳完成後,需要通過 BOOT[1:0] 引腳更改為 Main Flash memory(BOOT1=x BOOT0=0)模式然後重新上電才能正常啟動。

3、Embedded Memory(BOOT1=1 BOOT0=1)

在該模式下啟動程式,由于是利用内置 SRAM,那麼根據 SRAM的特點,它是并沒有程式存儲的能力了 — 掉電丢失,但由于它讀寫速度快,以及沒有刷寫壽命,是以這個模式一般用于程式調試。

假設我隻修改了代碼中一個小小的地方,若是使用上面的其中一種模式,那麼我需要重新擦除整個 Flash,然後再重新下載下傳寫入,這是比較的費時;而當從這個模式啟動代碼,由于 SRAM的特點,我們可以刷寫程式并調試,更不用考慮是否會超出刷寫次數,最後等到程式調試完成後,再将程式下載下傳到 Flash中。

4、總結

然後總的來說就是:

  • BOOT1=x BOOT0=0:從燒錄代碼的 Flash中啟動,這是正常的工作模式。
  • BOOT1=0 BOOT0=1:從内嵌的官方系統存儲器中啟動,這種模式啟動的程式功能由廠家設定,不可更改也無法擦除,是一個獨立的存儲區域,使用者并不能使用這一區域。
  • BOOT1=1 BOOT0=1:從内置 SRAM啟動,這種模式可以用于調試。

三、關于 Boot啟動的應用

1、引腳信号的确定

從官方列舉的自舉模式,可以看出,不管是哪個模式下 BOOT0的引腳必須是一個固定的電平,特殊的是 Main Flash memory模式下 BOOT1可以取 0 or 1,而不是浮空,是以最好的選擇還是給它安排一個穩定的電平信号,而一般來講是把它接地。

2、調試口下載下傳失敗(一)

一般出現調試口下載下傳失敗這種情況,若果排除了硬體的因素,那麼絕大多數情況是由于原固件中把調試接口禁用了,如果想了解調試接口禁用方式,可以看之前的文章 << STM32筆記之 SWJ(JTAG-DP和 SW-DP)>> ;額,繼續說,先說簡單的解決方式,那就是,把 BOOT0引腳拉高,進入非 Main Flash memory模式,BOOT1可以随意取 0 or 1,但盡量不要浮空,詳細解釋稍後說。。。;或者直接以 System memory模式用預留的專屬下載下傳口下載下傳使能調試接口的程式。

3、調試口下載下傳失敗(二)

可能您有看過有些 blog或者論壇在講調試口下載下傳失敗後,可以通過在點選下載下傳的一瞬間按複位引腳,可以以一定機率完成下載下傳(當然,此處是處于 Main Flash memory模式,為什麼是該模式,稍後說);但,這并不是一種有效的方法,至于為什麼可以,這個也是跟調試口禁用有關。。。而且是跟它的預設狀态有關,是以它可以下載下傳的機率跟其觸發啟動有關;同樣的,非硬體因素,都是在程式中把調試接口禁用了,才會導緻調試口下載下傳失敗。依然詳細解釋 稍後說 第四小點說。

4、禁用調試口後的拯救方式及分析

A、先解析第三小點,為什麼在調試口下載下傳失敗後,可以通過在點選下載下傳的一瞬間按複位引腳能以一定機率完成下載下傳呢?如果有詳細看之前的 << STM32筆記之 SWJ(JTAG-DP和 SW-DP)>> 文章的第四大點,可以了解到,當處于複位狀态的時候,其調試口的引腳是可以使用,也就是說,從點選下載下傳的一瞬間(開始發送相應的調試序列)到按複位引腳(程式準備執行)再到讀取并執行 OTP配置的時間内,調試口的引腳是使能的,注意,調試口禁用 /使能是屬于那種 option byte的一次性永久儲存的。

B、介于第三小點的:下載下傳的一瞬間按複位引腳進行機率性下載下傳的粗暴操作的不現實性,當然是不會去選擇這樣操作啦。

從上面得知:調試口禁用 /使能是屬于那種 option byte的永久儲存的(但它并不在 option byte上),是以,想要重制使能調試口的調試下載下傳功能,就必須在下一次燒錄中把使能調試口配置的放到程式中執行;而對于第二點的把 BOOT0引腳拉高,進入非 Main Flash memory模式,實際上還是得分兩種情況:

  • (1)System memory模式,由于這裡是官方自帶的一段執行區域,随出廠固定好了,并不能改變的,那麼,調試口的配置使能與否,都是影響不到,這裡可以說是最高等級了;是以,無論是在該模式用預留的專屬下載下傳口下載下傳,還是直接用調試口下載下傳程式(萬一專屬下載下傳口引腳斷了呢),都是可以的;而至于是否重新打開調試口,就看你是否有下載下傳帶有使能調試接口的程式了。
  • (2)Embedded Memory模式,SRAM,曉得吧,掉電丢失,在 “我-RAM” 存儲區内,管你是 option byte永久儲存,還是啥的,執行的是 “我自己的區域” ,你的 option byte又不在 “我” 區域範圍内(難道你想一起掉電丢失?),是以啊,利用這一特點,可以在 SRAM上執行特定的程式去修改 Main Flash memory模式的代碼,如果配置了隻讀 option byte,那就隻能擦除 chip在操作了。。。。
  • (3)然後還有一種測試做法,就是先是在 Main Flash memory模式下禁用了調試口,再在 Embedded Memory模式也不小心禁用了調試口(為什麼要說不小心呢,哈哈哈),最後,就連 System memory模式下的所有專屬下載下傳口引腳又不小心(為什麼會又呢)折斷了,好了,這下死翹翹了?ST官方壓根就不想讓你沒得玩,斷電,重複 Embedded Memory模式,這下得記得使能調試口了。

擴充:ISP、ICP、ICSP、IAP程式設計方式

1、ISP(In-System Programming)系統内程式設計

系統内程式設計(ISP),一種将可程式設計裝置放入電路闆後對其進行程式設計的技術;是已安裝在一個完整的系統中,而不是要求使用者先對晶片進行程式設計安裝才讓它進入程式設計系統;它允許将固件更新傳遞到微控制器和相關處理器的片上存儲器中,而無需在電路闆上進行專門程式設計處理,這樣使得設計工作得到簡化。

在該程式設計方式上,其固件更新引導程式是随着出廠,内嵌在晶片的某段存儲空間上的,即 ISP要占用一定空間存放 ISP引導程式。

一般常見的有 PIC、AVR等這些老牌的晶片都是支援的。

補充:https://en.wikipedia.org/wiki/In-system_programming

2、ICP(In-Circuit Programming)線上程式設計

線上程式設計(ICP),可能有些譯為 “在電路程式設計”,但準确的來說是稱作 “線上程式設計”!嘛,随你們喜歡吧,知道這是怎麼一回事就好了。

ICP的程式設計方式,相對于 ISP來講,它更傾向于軟體式引導燒錄,一般是通過下載下傳官方最新版的軟體程式,利用上位機去引導程式對晶片進行程式設計,而 ISP則是利用其出廠時内嵌在晶片的引導程式對晶片進行程式設計;是以,ICP并不占用程式存儲空間。

ICP可能聽說的比較少,但它确實存在,目前在 Nuvoton的晶片上是可以通過該門技術進行程式設計的。

STM32筆記之 Boot(自舉模式)一、自舉配置二、自舉模式各簡述三、關于 Boot啟動的應用擴充:ISP、ICP、ICSP、IAP程式設計方式

補充:http://www.nuvoton.com.cn/support/technical-support/faq/d3e8cc25-04f1-11ea-b113-05daf7eedf03/

3、ICSP(In-Circuit Serial Programming)線上串行程式設計

線上串行程式設計(ICSP)是一種增強的 ISP技術,最早是在 Microchip公司的 PICmicro一次性可程式設計(One-Time-Programmable, OTP)和 FLASH RISC微控制器(MCU)中實作。該技術僅使用兩個 I/O引腳來串行輸入和輸出資料,使 ICSP易于使用,對微控制器的正常操作影響較小。

如今,人們會把系統内程式設計(ISP),也稱為電路内串行程式設計(ICSP),是以目前大多數晶片所說的 ISP燒錄,實際上準确的來講就是 ICSP。

補充:http://ww1.microchip.com/downloads/en/devicedoc/30277d.pdf

4、IAP(In-Application Programming)應用内程式設計

應用内程式設計(IAP),是使用者自己從結構上将 Flash存儲區(Firmware)劃分為兩個存儲區域(即 BootLoader和 Application);在設計固件程式時編寫兩個項目代碼,第一個項目程式存放在 BootLoader區,不執行正常的功能操作,隻執行對 Application代碼的更新,而第二個項目程式存放在 Application區,用于執行實際的功能代碼。

該程式設計方式的目的是為了在産品釋出後可以友善地通過預留的通信口對産品中的固件程式進行更新更新,一般按理說隻要能傳輸資料的通信口都能實作 IAP的功能,而常用的 IAP的通信口有許多種:UART、ETH、I2C、SPI等等,是以, IAP更多的是作遠端更新固件;而不需要像前面那三種需要硬體燒錄器進行燒錄更新(專屬的引導程式 -> 更新程式),它是屬于自身更新,可以在系統中擷取新代碼并對自己重新程式設計(自身程式 -> 更新程式)。

STM32筆記之 Boot(自舉模式)一、自舉配置二、自舉模式各簡述三、關于 Boot啟動的應用擴充:ISP、ICP、ICSP、IAP程式設計方式

繼續閱讀