0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32F091空片編程后怎樣直接運(yùn)行用戶代碼

STM32單片機(jī) ? 來源:未知 ? 作者:佚名 ? 2017-08-31 14:16 ? 次閱讀

問題
某客戶在其產(chǎn)品的設(shè)計(jì)中,使用了STM32F091RCT6。客戶使用ST-Link 對STM32F091RCT6 進(jìn)行編程,發(fā)現(xiàn)對空片進(jìn)行編程之后,必須要重新上電才能運(yùn)行用戶代碼;但是如果不是空片,則編程后就可以直接運(yùn)行用戶代碼。由于客戶的測試系統(tǒng)是直接燒寫完芯片后在不斷電的情況直接進(jìn)入測試模式,如果空片燒寫需要斷電的話,帶來一定的麻煩??蛻粝M忝靼走@件事,并希望找到辦法,能在空片編程后也可以直接運(yùn)行用戶代碼。


調(diào)研
1.還原問題
在這里,使用帶有STM32F091RCT6 的NUCLEO-F091RC 板來進(jìn)行問題還原,將此Nucleo 板通過USB 線連接到電腦。打開STM32 ST-LINK Utility,點(diǎn)擊“Connect to the target”按鈕進(jìn)行芯片連接,連接后打開一個(gè)準(zhǔn)備好的LED 燈閃爍的.hex 文件代碼,點(diǎn)擊“Program verify”按鈕準(zhǔn)備進(jìn)行編程。

在這里,我們勾選了“Reset after programming”,目的在于編程后對芯片進(jìn)行復(fù)位,可以運(yùn)行用戶代碼。然后點(diǎn)擊“Start”按鈕開始進(jìn)行編程。
編程之后,按道理可以看到LED 燈閃爍的,但是并沒有出現(xiàn)。需要給MCU進(jìn)行斷電后,重新上電才能看到LED 燈閃爍。也就是說需要一次上電復(fù)位才能運(yùn)行用戶代碼。

2.分析問題
先來回顧一下STM32F091 的參考手冊RM0091 對于Empty Check 的描述:

首先,芯片內(nèi)部存在一個(gè)查空標(biāo)志,用來標(biāo)志芯片是否為空片。這個(gè)標(biāo)志位是在BOOT0 腳被定義到從Main Flash memory 啟動的時(shí)候使用。當(dāng)這個(gè)標(biāo)志位被置“1”的時(shí)候,此芯片被認(rèn)為是空的,系統(tǒng)將從Systemmemory 中啟動Bootloader,以允許用戶進(jìn)行代碼下載,即使現(xiàn)在BOOT0腳定義的是從Main Flash memory 啟動。此標(biāo)志位只在載入Option bytes 時(shí)更新:當(dāng)?shù)刂?x0800 0000 讀出的內(nèi)容為0xFFFF FFFF 時(shí),此標(biāo)志位置“1”,否則為“0”。這意味著當(dāng)燒寫完一個(gè)空片后需要在系統(tǒng)復(fù)位后執(zhí)行用戶代碼的話,是必須要重新上電以產(chǎn)生或者在FLASH_CR寄存器中置位OBL_LAUNCH 來啟動Optionbyteloader reset,以清除此查空標(biāo)志。

現(xiàn)在就可以來分析目前所遇到的情況了:


當(dāng)空片通過SWD 連接到ST-Link 進(jìn)行燒寫的情況下,由于上電時(shí)空片檢測檢測到此芯片為空片,查空標(biāo)志被置位,所以系統(tǒng)此時(shí)從System memory 中啟動Bootloader 開始運(yùn)行。通過簡單的SWD 接口對芯片進(jìn)行編程,勾選的“Reset afterprogramming”將在編程結(jié)束后在RESET引腳上產(chǎn)生一個(gè)復(fù)位信號,但是不幸的是這個(gè)復(fù)位并不能清除查空標(biāo)志,導(dǎo)致復(fù)位后仍然從System memory 中啟動Bootloader,而沒有運(yùn)行用戶代碼,也就是我們之前遇到的現(xiàn)象。

一般情況下,我們都可以通過重新上電來產(chǎn)生POR 以清除查空標(biāo)志,從MainFlash memory 啟動運(yùn)行用戶代碼。但是,客戶目前的這種特殊需求就會帶來一定的麻煩。還有一種應(yīng)用也會比較麻煩,也就是使用鋰電池產(chǎn)品,而且這個(gè)電池直接焊接到用戶板上,無法方便地進(jìn)行斷電上電。此時(shí),若是空片是焊接在板子上進(jìn)行在線編程,那么,問題來了??掌幊讨?,由于不方便進(jìn)行斷電,而無法完成POR的動作,不能運(yùn)行用戶代碼也就無法實(shí)現(xiàn)一個(gè)Option byte loader reset。查空標(biāo)志無法清除,程序運(yùn)行將鎖死在System memory 的Bootloader。

3.問題解決
這種問題呢,解決方法當(dāng)然有很多種,下面來大概地探討一下:
1) 從生產(chǎn)上來解決:芯片在編程器上進(jìn)行單獨(dú)編程,之后再上板子,避開空片燒寫后沒有POR。
2) 從硬件上來解決:使用一個(gè)跳線,或者使用其他方式,比如在夾具上想辦法,以達(dá)到通過人工的斷電再連通上電,實(shí)現(xiàn)一個(gè)POR。需要在PCB 板上預(yù)留。大家可自行選擇對策。但是這會增加生產(chǎn)上的麻煩,降低效率。
3) 從編程方法來解決:不使用ST-Link 進(jìn)行編程,直接使用Bootloader 進(jìn)行串口升級,升級后跳轉(zhuǎn)到Main Flashmemory 去運(yùn)行用戶代碼。需要在用戶代碼中加入將MainFlash memory 映射到0x0000 0000 的代碼。

4) 前面幾種方式大家一看就明白如果去解決了。但是,如果一定要使用ST-Link 通過SWD 進(jìn)行燒寫的話,就另當(dāng)別論,我們下面來探討這種方式。
一般看到這種問題,直觀思維就是思考是否有辦法,可以在ST-LINK 燒寫后通過一定的ST-LINK命令跳轉(zhuǎn)到用戶代碼去運(yùn)行用戶代碼。方法看起來可行,但是有點(diǎn)復(fù)雜。第一,STM32 ST-LINKUtility 沒有提供類似的功能,需要用戶自行使用ST-LINK_CLI 命令;第二,需要在用戶代碼中加入別忘了將MainFlash memory 映射到0x0000 0000 的代碼;第三,由于查空標(biāo)志未清除,需擔(dān)心意外的復(fù)位信號或干擾,導(dǎo)致復(fù)位后又跑回SystemMemory,還需要在用戶代碼中加入“每次運(yùn)行都判斷是否為OptionBytes Loader reset,如果不是,就直接執(zhí)行一次Option BytesLoader reset以清除查空標(biāo)志”。


我們的直觀思維都是出現(xiàn)問題解決問題,但是看了上面的描述,這樣的解決辦法還真有點(diǎn)麻煩。那有沒有什么其他簡單的辦法呢?答案是有的,我們不要把思維停留在出現(xiàn)問題解決問題上,而是如何去避免產(chǎn)生問題。下面來理一理思路:

這個(gè)問題的根源在于查空標(biāo)志的存在,所以需要思考的是怎么避免查空標(biāo)志的影響?
來看一下查空標(biāo)志產(chǎn)生的條件

a) 使用了BOOT0 引腳;
b) BOOT0 引腳為低電平,啟動區(qū)域指向MainFlash memory;
c) 讀取0x0800 0000 地址的值為0xFFFF FFFF;


由于是空片編程,所以第三種條件是肯定是成立的;由于硬件設(shè)計(jì),BOOT0 引腳的電平也不方便改來改去;所以需要把關(guān)注點(diǎn)放在第一個(gè)條件上——“使用了BOOT0 引腳”。由于STM32F091的特性,剛好有機(jī)會可以不使用BOOT0 引腳,而是直接使用選項(xiàng)字節(jié),所以解決的辦法有了。

步驟如下:
i. 打開STM32 ST-LINK Utility,點(diǎn)擊“Connect to the target”按鈕進(jìn)行連接;
ii. 從菜單“Target → Option Bytes”調(diào)出選項(xiàng)字節(jié)對話

將“nBoot0_SW_Cfg”的打勾去掉,點(diǎn)擊“Apply”,改成使用選項(xiàng)字節(jié)中的nBoot0 和nBoot1 來控制啟動區(qū)域
iii. 再打開需要燒寫的代碼文件,點(diǎn)擊“Program Verify”按鈕,對話框中勾選“Reset after programming”,點(diǎn)擊“Start”完成燒寫動作就可以了。

這樣就可以看到用戶代碼已經(jīng)在運(yùn)行了,是不是很簡單。
如果,希望更簡單的完成,可以使用ST-LINK_CLI,寫一個(gè)批處理文件,包含以下動作:

ST-LINK_CLI -c SWD UR

ST-LINK_CLI -ME

ST-LINK_CLI -p xxxxxxxx.hex-v “while_programming”

ST-LINK_CLI -OBnBOOT0_SW_Cfg=0

ST-LINK_CLI –Rst

ST-LINK_CLI.exe位于STM32 ST-LINK Utility 安裝目錄里,關(guān)于命令請參考《ST-LINKUtility UM.pdf》。

結(jié)論
由于查空檢測機(jī)制,導(dǎo)致STM32F091 空片在使用ST-LINK編程后,不斷電的情況下復(fù)位將回到System Memory,無法進(jìn)入MainFlash memory 去運(yùn)行用戶代碼。所以,在特殊應(yīng)用中,如果無法進(jìn)行斷電再上電,需要使用辦法對這種機(jī)制進(jìn)行破壞。

處理

Boot 啟動配置為用選項(xiàng)字節(jié)進(jìn)行控制,而不是使用Boot0引腳,以此來破壞查空機(jī)制的影響。


建議
對于問題的解決,一般從兩個(gè)方向進(jìn)行思考:一是出現(xiàn)了問題再來找解決問題的辦法;二是如何避免出現(xiàn)問題。很多時(shí)候,由于思維慣性,很多工程師可能會更喜歡直接從第一種方向去思考問題;然而,事實(shí)上,如果能從第二種方向思考,阻止問題的產(chǎn)生,那才是最好的辦法。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2258

    文章

    10828

    瀏覽量

    352519
  • STM32F091
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    3325

原文標(biāo)題:STM32F091空片編程后不能直接運(yùn)行用戶代碼

文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    請問引腳數(shù)相同的STM32F2的程序可以直接運(yùn)行STM32F4的上嗎?

    引腳數(shù)相同的STM32F2的程序可以直接運(yùn)行STM32F4的芯片上嗎?手冊上說F4全兼容F2的軟件
    發(fā)表于 03-27 07:43

    如何配置能夠同時(shí)使用STM32F205,STM32F091,STM32F030支持的最大串口數(shù)?

    如何配置,能夠同時(shí)使用STM32F205,STM32F091,STM32F030支持的最大的串口數(shù)?GPIO_AFR配置,無法利用最多的串口數(shù)
    發(fā)表于 03-28 07:55

    基于stm32f051的工程在stm32f091上不能運(yùn)行

    基于stm32f051的工程在stm32f091上不能運(yùn)行,不知道有什么辦法可以解決?在stm32f051上的ucosii在091上執(zhí)行會出
    發(fā)表于 09-05 14:41

    新手學(xué)STM32 kEIL軟件安裝沒驅(qū)動

    剛?cè)胧至艘粔KSTM32f091,可kEIL軟件安裝沒驅(qū)動,求大神指導(dǎo)
    發(fā)表于 09-11 09:31

    請問有STM32F091資料分享嗎

    哪位朋友有STM32F091的數(shù)據(jù)手冊,中文的。有的可以分享給我可以嗎?
    發(fā)表于 09-11 10:58

    STM32F091 寫數(shù)據(jù)重啟

    程序中,對STM32F091進(jìn)行數(shù)據(jù)寫入操作時(shí),會引起復(fù)位重啟,請問有誰遇到過類似的問題,有什么解決辦法嗎,謝謝指教
    發(fā)表于 03-26 08:53

    STM32F091下載問題

    哪位用過STM32F091我最近在用,用JLINK下載不了,可能是工程問題,下載出現(xiàn)以下問題請問是咋回事
    發(fā)表于 11-01 08:57

    如何通過UART使用內(nèi)部引導(dǎo)加載程序?qū)?b class='flag-5'>STM32F091進(jìn)行編程?

    我想通過 UART (AN2606) 使用內(nèi)部引導(dǎo)加載程序?qū)?STM32F091 進(jìn)行編程。我的特殊情況是我必須不從 PC 進(jìn)行編程,它是另一個(gè)控制 STM32F091
    發(fā)表于 12-01 07:11

    STM32F091備份域是什么?

    我正在閱讀 STM32F091 的參考手冊,尤其是 RTC 章節(jié)。然后我查看了 CubeIDE 生成的(全部設(shè)置為 LL,而不是 HAL)初始化代碼的作用。因此它具有此函數(shù)
    發(fā)表于 01-13 06:04

    STM32F091使用System Bootloader下載

    STM32F091使用System Bootloader下載代碼
    發(fā)表于 12-07 18:17 ?0次下載

    proteus 調(diào)試MDK生成的HEX時(shí)不能直接運(yùn)行的方法

    proteus 調(diào)試MDK生成的HEX時(shí)不能直接運(yùn)行的方法
    發(fā)表于 09-22 15:16 ?4次下載
    proteus 調(diào)試MDK生成的HEX時(shí)不能<b class='flag-5'>直接運(yùn)行</b>的方法

    直接運(yùn)行圖像壓縮的處理代碼

    圖像壓縮的處理代碼,可直接運(yùn)行
    發(fā)表于 02-05 14:36 ?0次下載

    解密運(yùn)行外Flash中的app代碼

    STM32L5的新特性 OTFDEC OnTheFlyDECrypt硬件可以實(shí)時(shí)解密外置OSPI Flash中的數(shù)據(jù)和代碼,從而CPU能夠直接運(yùn)行外Flash上的加密
    的頭像 發(fā)表于 09-09 13:54 ?2580次閱讀

    DS10312_STM32F091xB STM32F091xC單片機(jī)數(shù)據(jù)手冊

    DS10312_STM32F091xB STM32F091xC單片機(jī)數(shù)據(jù)手冊
    發(fā)表于 11-23 20:24 ?1次下載
    DS10312_<b class='flag-5'>STM32F091</b>xB <b class='flag-5'>STM32F091</b>xC單片機(jī)數(shù)據(jù)手冊

    ES0282_STM32F091xB和STM32F091xC單片機(jī)的局限性

    ES0282_STM32F091xB和STM32F091xC單片機(jī)的局限性
    發(fā)表于 11-23 20:38 ?0次下載
    ES0282_<b class='flag-5'>STM32F091</b>xB和<b class='flag-5'>STM32F091</b>xC單片機(jī)的局限性