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

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

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

基于STM32F0芯片的代碼實(shí)現(xiàn)及幾點(diǎn)提醒

茶話MCU ? 來(lái)源:ST MCU 信息交流 ? 2020-06-15 09:24 ? 次閱讀

?STM32系列的芯片里都有個(gè)特別的存儲(chǔ)區(qū)---FLASH選項(xiàng)字區(qū)域,這里簡(jiǎn)單聊下該話題并順便給出基于STM32F0芯片的代碼實(shí)現(xiàn)及幾點(diǎn)提醒。

這塊特定的FLASH存儲(chǔ)區(qū)域,通常用來(lái)存放有關(guān)芯片內(nèi)部FLASH讀保護(hù)、寫保護(hù)、看門狗使能方式、芯片啟動(dòng)、RAM校驗(yàn)、電源監(jiān)控等配置信息。具體內(nèi)容以及格式因不同的STM32系列可能有差異。

一般來(lái)講,各個(gè)選項(xiàng)字由選項(xiàng)字節(jié)組成,各選項(xiàng)字節(jié)由原始字節(jié)項(xiàng)和互補(bǔ)字節(jié)項(xiàng)組成。如下圖存儲(chǔ)方式,?綠色欄為原始選項(xiàng)字節(jié),黃色欄代碼互補(bǔ)選項(xiàng)字節(jié)。不同系列可能有差異?!鞠挛闹薪貓D如無(wú)特別說(shuō)明,均是來(lái)自STM32F0芯片的參考手冊(cè)。】

FLASH選項(xiàng)字一般安排在某固定地址起始的一塊連續(xù)的地址空間。下圖就是STM32FO芯片內(nèi)部FLASH選項(xiàng)字的地址及內(nèi)容結(jié)構(gòu)安排。這里包括讀保護(hù)選項(xiàng)字節(jié)、用戶選項(xiàng)字節(jié)、扇區(qū)寫保護(hù)選項(xiàng)字節(jié)。

對(duì)于出廠的芯片,F(xiàn)LASH選項(xiàng)字往往具有初始出廠值。下圖就是STM32F0芯片出廠時(shí)FLASH選項(xiàng)字的初始值。

但在我們的實(shí)際應(yīng)用中往往需要結(jié)合實(shí)際應(yīng)用情況,對(duì)FLASH選項(xiàng)字進(jìn)行重新配置。而對(duì)FLASH選項(xiàng)字進(jìn)行重新配置一般有兩種方式:

第一種,通過(guò)編程燒錄工具進(jìn)行選項(xiàng)字的配置并寫入。

比方使用STLinkUtiliy或STM32CubeProgrammer或其它類似編程工具來(lái)實(shí)現(xiàn)。這種方式相對(duì)較為簡(jiǎn)單,一般對(duì)操作人員往往有些要求。尤其在有意或無(wú)意弄錯(cuò)配置選項(xiàng)的情況下,沒法快速發(fā)現(xiàn)并及時(shí)糾正。

另外一種方式就是用戶在應(yīng)用代碼里根據(jù)應(yīng)用需求做FLASH選項(xiàng)字的配置編程。

這種方式,對(duì)開發(fā)人員來(lái)講會(huì)增加了一些工作量。但燒錄時(shí)只管燒錄FLASH執(zhí)行代碼即可,關(guān)于芯片配置方面的信息在代碼里自行完成。即使燒錄時(shí)出現(xiàn)選項(xiàng)字的誤操作,用戶程序代碼也可以將其自動(dòng)糾正過(guò)來(lái)。

不論使用哪種方式修改FLASH選項(xiàng)字的配置,要想新的選項(xiàng)字信息真正起作用,還有個(gè)對(duì)FLASH選項(xiàng)字信息進(jìn)行加載的環(huán)節(jié),即將FLASH選項(xiàng)字的配置信息加載到選項(xiàng)字寄存器,從而作用于芯片的相關(guān)功能,也就是上面提到過(guò)的讀保護(hù)、寫保護(hù)、看門狗使能、電源控制、啟動(dòng)選擇等功能信息。一般來(lái)說(shuō),將FLASH選項(xiàng)字信息加載到選擇字寄存器需要借助系統(tǒng)復(fù)位或上電復(fù)位來(lái)完成。【當(dāng)在調(diào)試狀態(tài)下修改FLASH選項(xiàng)字時(shí),它的加載需借助上電復(fù)位】

在進(jìn)行FLASH選項(xiàng)字加載之前,芯片硬件會(huì)先對(duì)選項(xiàng)字信息進(jìn)行基本地判斷與確認(rèn),即將各個(gè)原始選項(xiàng)字節(jié)與互補(bǔ)選項(xiàng)字節(jié)的進(jìn)行匹配比對(duì)。如果比對(duì)失敗將產(chǎn)生出錯(cuò)事件,并將比對(duì)失敗的選項(xiàng)字節(jié)【原始字節(jié)和互補(bǔ)字節(jié)】強(qiáng)制修改為0xFF或其它指定值,視不同的STM32系列而定。

比方,下面就是STM32L4系列做選項(xiàng)字加載前發(fā)生原始項(xiàng)與互補(bǔ)項(xiàng)信息比對(duì)不匹配時(shí)的處理原則:

關(guān)于FLASH選項(xiàng)字信息地編程修改,這里特別提醒幾點(diǎn):

第1點(diǎn),當(dāng)準(zhǔn)備好要修改的選項(xiàng)字信息,在對(duì)FLASH選項(xiàng)字進(jìn)行編程修改之前,需先對(duì)FLASH選項(xiàng)字區(qū)域進(jìn)行擦除。發(fā)出擦除指令即可。擦除完畢之后再將新的選項(xiàng)字信息寫入選項(xiàng)字區(qū)域。

那么為了保障選項(xiàng)字正確有序的編程寫人,在做FLASH選項(xiàng)字的編程時(shí),一定要保持電源的穩(wěn)定?!颈确秸f(shuō),代碼里稍作延時(shí)等上電穩(wěn)定后再操作】如果正在做FLASH選項(xiàng)字編程時(shí)發(fā)生電源電壓劇烈波動(dòng)或重啟,很可能發(fā)生FLASH選項(xiàng)字區(qū)域被擦除了但又沒有正確寫入新的選項(xiàng)字信息的情況。而且,前面也提到了,如果選項(xiàng)字因?yàn)闆]有被完整地正確寫入,在做FLASH選項(xiàng)字加載前,還會(huì)由于原始項(xiàng)與互補(bǔ)項(xiàng)做信息比對(duì)失敗而被強(qiáng)行修改為OxFF或其它指定值。

下面兩幅截圖就是使用燒錄工具軟件【STM32CubeProgrammer】,在做flash選項(xiàng)字編程時(shí)通過(guò)模擬芯片被強(qiáng)行斷電所發(fā)生的情形。

本來(lái),開始做FLASH選項(xiàng)字編程時(shí),RDP保護(hù)配置都是選擇的LEVEL_0。在選項(xiàng)字編程時(shí)芯片被中途斷電重新后連接所看到結(jié)果卻是芯片被讀保護(hù)了,其它配置字也被擦除了。從截圖中可以看到,此時(shí)RDP=0xFF,既不是0xAA也不是0xCC,那么芯片的讀保護(hù)等級(jí)就相應(yīng)地變成了LEVEL_1讀保護(hù)狀態(tài)了。有人碰到此情形時(shí)往往感到納悶不解,明明自己沒有修改RDP的配置怎么RDP的保護(hù)等級(jí)變了呢?就是因?yàn)橹型緮嚯姡x項(xiàng)字區(qū)域剛被擦除又還沒來(lái)得及完整、正常寫入。

當(dāng)然,做FLASH選項(xiàng)字編程時(shí)除了要求電源穩(wěn)定外,編程時(shí)序也需遵照手冊(cè)介紹的來(lái)操作,以保證選項(xiàng)字編程的正確性。

第2點(diǎn)?,對(duì)于某些雙BANK的STM32芯片,比如STM32L4,STM32F42X等系列,在做選項(xiàng)字編程調(diào)整時(shí),也是先將兩個(gè)BANK的用戶選項(xiàng)頁(yè)的內(nèi)容進(jìn)行擦除,然后依據(jù)用戶準(zhǔn)備好的選項(xiàng)寄存器的內(nèi)容對(duì)所有選項(xiàng)字內(nèi)容重新編程更新。

這里要注意的是,我們不能只是單獨(dú)地針對(duì)雙BANK其中的某一個(gè)BANK進(jìn)行用戶選項(xiàng)字調(diào)整,而是需要將BANK1和BANK2的配置信息都準(zhǔn)備好并寫入相應(yīng)的選項(xiàng)字寄存器,從而實(shí)現(xiàn)對(duì)兩個(gè)BANK的選項(xiàng)字信息的編程修改。

第3點(diǎn)?,在做選項(xiàng)字編程過(guò)程中,如果修改讀保護(hù)選項(xiàng)時(shí),一定要清楚-----如果是從LEVEL_1調(diào)整為L(zhǎng)EVEL_0將會(huì)發(fā)生整個(gè)芯片內(nèi)部的FLASH內(nèi)容被全部擦除的情況。另外,很多STM32系列支持LEVEL_2讀保護(hù),該保護(hù)等級(jí)具有不可逆性。如果選擇該等級(jí),除非你自己在芯片內(nèi)部準(zhǔn)備好了升級(jí)引導(dǎo)代碼,否則你是不能再對(duì)片內(nèi)代碼內(nèi)容做任何更新,更不可能基于該芯片再做調(diào)試了。

好,關(guān)于STM32芯片的選項(xiàng)字的編程提醒就聊到這里。感覺上內(nèi)容應(yīng)該不多,但由于STM32家族擁有眾多系列,同時(shí)各個(gè)系列間在選項(xiàng)字這部分內(nèi)容又或多或少存在著差異,讓內(nèi)容突然龐雜了很多。這里只能拋磚引玉似地給些提醒,具體應(yīng)用時(shí)請(qǐng)參考各個(gè)STM32系列的參考手冊(cè)及編程手冊(cè)。

下面就以STM32F072芯片為核心的Nucleo板,給出一個(gè)實(shí)現(xiàn)用戶選項(xiàng)字編程的示例。

先看看STM32F072片內(nèi)選項(xiàng)字區(qū)域的基本內(nèi)容框架,如下圖:

一、選項(xiàng)字內(nèi)容的規(guī)劃與準(zhǔn)備:

這里我將RDP選項(xiàng)字節(jié)配置為0xbb,即LEVEL_1,則其互補(bǔ)選項(xiàng)字節(jié)內(nèi)容就是0x44;將USER選項(xiàng)字節(jié)下面紅色方框內(nèi)的三個(gè)選項(xiàng)置1,另外兩個(gè)保留位置1,那么USER選項(xiàng)字節(jié)的內(nèi)容就是OxEA,它的互補(bǔ)字節(jié)就是0x15.

選項(xiàng)域中的Data0字節(jié)配置為0x99,則其互補(bǔ)字節(jié)nData0則為0x66;

選項(xiàng)域中的Data1字節(jié)配置為0x88,則其互補(bǔ)字節(jié)nData0則為0x77;

按照上面規(guī)劃準(zhǔn)備好數(shù)據(jù),如下圖所示。各選項(xiàng)數(shù)據(jù)按原項(xiàng)和互補(bǔ)項(xiàng)組成半字寫入。

【順便說(shuō)下,這里沒有對(duì)扇區(qū)寫保護(hù)做配置。當(dāng)然要做也是完全可以的】

二、編寫相應(yīng)程序代碼,編譯后下載到芯片:

相關(guān)代碼不長(zhǎng),較為簡(jiǎn)單。按照手冊(cè)描述的來(lái)編寫。我將上述代碼分成6部分。

第1部分,做有關(guān)選項(xiàng)字節(jié)內(nèi)容的判斷,是否均為預(yù)期的選項(xiàng)配置內(nèi)容。

第2部分,對(duì)FLASH、OPTION編程做開鎖操作。

第3部分,對(duì)選項(xiàng)域進(jìn)行擦除,然后退出擦除狀態(tài)。

第4部分,對(duì)欲修改的選項(xiàng)字節(jié)進(jìn)行編程修改。

第5部分,完成選項(xiàng)字的修改與編程后,上鎖并退出。

第6部分,觸發(fā)系統(tǒng)復(fù)位,將新的選擇域內(nèi)容加載到選項(xiàng)控制寄存器。

三、運(yùn)行程序,驗(yàn)證結(jié)果

運(yùn)行用戶程序?qū)崿F(xiàn)選項(xiàng)域的編程修改操作??蛇B接到STLINK Utlity之類的工具查看選項(xiàng)配置結(jié)果,看看是否跟預(yù)期規(guī)劃的一致。

上圖是通過(guò)STLINK Utility工具查看到的STM32F072芯片運(yùn)行用戶程序后的選項(xiàng)域的結(jié)果。不難看出,跟我們預(yù)期的結(jié)果一樣【打勾的選項(xiàng)表示置1的選項(xiàng)】。我們還可以基于STLINK_Utility工具隨意修改RDP選項(xiàng)字以外的其它選項(xiàng)內(nèi)容,通過(guò)它做選項(xiàng)字的修改編程。然后再次運(yùn)行用戶程序,可以發(fā)現(xiàn)各個(gè)選項(xiàng)字內(nèi)容又會(huì)回歸到用戶預(yù)設(shè)的配置內(nèi)容。

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

    關(guān)注

    453

    文章

    50262

    瀏覽量

    421176
  • STM32
    +關(guān)注

    關(guān)注

    2265

    文章

    10858

    瀏覽量

    354426

原文標(biāo)題:STM32選項(xiàng)字編程示例及幾點(diǎn)提醒

文章出處:【微信號(hào):stmcu832,微信公眾號(hào):茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32F0擴(kuò)展TFT屏(1.8寸以上)時(shí)一般都用什么接口的?

    大家用STM32F0擴(kuò)展TFT屏(1.8寸以上)時(shí)一般都用什么接口的?
    發(fā)表于 05-16 06:12

    STM32F0系列單片機(jī),指針取整型值錯(cuò)誤的原因?

    STM32F0系列單片機(jī),指針取整型值錯(cuò)誤,用F0的進(jìn)來(lái)看下,代碼如下,附件里也有個(gè)工程可以下來(lái)單步運(yùn)行下,這是什么問(wèn)題如何解決. uint8_t a
    發(fā)表于 05-15 07:46

    STM32F0標(biāo)準(zhǔn)庫(kù)中缺失core_cm0.0是怎么回事?

    STM32F0xx_StdPeriph_Lib_V1.5.0LibrariesCMSISDeviceSTSTM32F0xxInclude目錄下找到了core_cm0.h的頭文件。 是STM32F0系列不需要core_cm
    發(fā)表于 05-15 06:39

    stm32f0系列的芯片怎么樣?

    大家用沒有 stm32f0系列的芯片呢,用的怎么樣?
    發(fā)表于 05-10 06:59

    STM32F0外部中斷容易誤觸發(fā)怎么解決?

    STM32F0的外部中斷抗干擾能力太差了,經(jīng)常誤觸發(fā)。旁邊電烙鐵開關(guān)按鈕只要切換一次都會(huì)引起誤觸發(fā),當(dāng)然外部中斷IO口有阻容RC濾波的,也照樣誤觸發(fā)。真的怕了。大家有沒有解決辦法?
    發(fā)表于 05-06 06:33

    使用MDK調(diào)試STM32F0時(shí)會(huì)突然全速運(yùn)行的原因?

    使用芯片STM32F030CCT6 系統(tǒng):win7 MDK版本:5.21a 仿真器:秉火DAP 使用MDK調(diào)試STM32F0時(shí)會(huì)突然全速運(yùn)行。
    發(fā)表于 04-23 07:42

    STM32F0設(shè)置了FALSH寫保護(hù)后不能下載程序是什么原因?qū)е碌模?/a>

    開發(fā)環(huán)境用KEIL5+JLINK進(jìn)行程序調(diào)試,STM32F0根據(jù)選項(xiàng)字節(jié)進(jìn)行FALSH寫保護(hù)后,下次不能再程序下載了,現(xiàn)已用STM32 ST-LINK Utility進(jìn)行解除。能不能在KEIL或程序
    發(fā)表于 04-18 07:51

    使用STM32F0控制BLDC電機(jī),需要在停機(jī)時(shí)對(duì)電機(jī)進(jìn)行自鎖,怎么實(shí)現(xiàn)

    如題,使用STM32F0控制BLDC電機(jī),需要在停機(jī)時(shí)對(duì)電機(jī)進(jìn)行自鎖,不外加機(jī)械部件。施加其中一相一定電壓時(shí)要保持電機(jī)卡住不動(dòng)的狀態(tài),但手動(dòng)轉(zhuǎn)動(dòng)電機(jī)超過(guò)一定角度時(shí),還是保持不了原位。有什么辦法比較好呢?
    發(fā)表于 04-16 08:12

    STM32F0 stop模式WFI和WFE區(qū)別是什么?

    同題:STM32F0 stop模式WFI和WFE區(qū)別?求大神指點(diǎn),謝謝!
    發(fā)表于 04-16 06:39

    STM32F0的SPL庫(kù)能在STM32G0上用嗎?

    原來(lái)用的STM32F0系列,使用的V3.5.0的標(biāo)準(zhǔn)外設(shè)庫(kù)?,F(xiàn)在改用STM32G0系列,發(fā)現(xiàn)官網(wǎng)提供的固件庫(kù)是STM32CubeG0,里面是HAL和LL庫(kù)。為了節(jié)省開發(fā)時(shí)間,想還是用SPL庫(kù),有對(duì)應(yīng)的SPL嗎?
    發(fā)表于 04-08 08:29

    STM32F0系列TIM1內(nèi)部剎車源,LOCKUP如何應(yīng)用?

    STM32F0系列 TIM1 內(nèi)部剎車源有5種,求大佬們解答下: 1、請(qǐng)問(wèn)LOCKUP 如何應(yīng)用?我制造錯(cuò)誤進(jìn)入hardfault后,并沒有剎住。 2、F0全系列都有LOCKUP剎車源嗎?其他幾種
    發(fā)表于 04-03 07:21

    STM32F0內(nèi)核的總中斷是默認(rèn)開的嗎?

    STM32F0、STM32F1, 用 CubeMx生成初始化代碼,只有外設(shè)的中斷使能代碼,沒有找到總中斷的使能代碼,請(qǐng)問(wèn)內(nèi)核的總中斷默認(rèn)是開
    發(fā)表于 04-03 06:14

    KEIL下如何實(shí)現(xiàn)代碼的加密?

    STM32F0STM32F4,用了有好幾款芯片,都是在KEIL編譯,之前沒有關(guān)注到加密的問(wèn)題,突然想到這個(gè)問(wèn)題,不知道大家都是怎么來(lái)實(shí)現(xiàn)加密的。
    發(fā)表于 03-20 07:06

    使用CUBEAI部署tflite模型到STM32F0中,模型創(chuàng)建失敗怎么解決?

    看到CUBE_AI已經(jīng)支持到STM32F0系列芯片,就想拿來(lái)入門嵌入式AI。 生成的模型很小,是可以部署到F0上的,但是一直無(wú)法創(chuàng)建成功。 查閱CUBE AI文檔說(shuō)在調(diào)用create函數(shù)前,要啟用
    發(fā)表于 03-15 08:10

    STM32移植而引發(fā)的兩個(gè)小疑問(wèn)

    STM32用戶將基于STM32F0芯片代碼移植到STM32F4系列時(shí)遇到了些麻煩。其中有個(gè)問(wèn)題跟中斷處理有關(guān)。有個(gè)中斷服務(wù)程序
    的頭像 發(fā)表于 11-18 14:12 ?1083次閱讀
    因<b class='flag-5'>STM32</b>移植而引發(fā)的兩個(gè)小疑問(wèn)