當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 嵌入式微處理器
[導(dǎo)讀]在一些新的 STM32 系列中,比如 STM32L4、STM32G0、STM32G4 等,除了 Flash 標(biāo)準(zhǔn)編程之外,還可以支持 Flash 的快速編程。


引言

在一些新的 STM32 系列中,比如 STM32L4、STM32G0、STM32G4 等,除了 Flash 標(biāo)準(zhǔn)編程之外,還可以支持 Flash 的快速編程。那么對(duì)于 STM32G0 來(lái)說(shuō),在使用快速編程時(shí),有哪些需要注意之處?

難點(diǎn)

某STM32用戶在其產(chǎn)品設(shè)計(jì)中,采用了 STM32G070RBT6,開發(fā)工程師希望在進(jìn)行代碼升級(jí)的時(shí)候使用快速編程來(lái)提高編程速度,但是寫代碼時(shí)遇到很多問題。而在目前的 STM32G0 的 Cube 庫(kù)中并沒有 FLASH_FastProgram 例程,所以客戶希望得到一個(gè)參考例程來(lái)快速實(shí)現(xiàn)設(shè)計(jì)。

調(diào)研

1 了解問題

檢查最新版本的STM32Cube_FW_G0_V1.3.0/Projects/STM32CubeProjectsList.html 文件,確實(shí)可以看到現(xiàn)有的    STM32G0Cube 庫(kù)中并沒有 FLASH_FastProgram 例程,根據(jù)參考手冊(cè),參考\STM32Cube_FW_L4_V1.16.0\Projects\NUCLEO-L452RE\Examples\FLASH\FLASH_FastProgram 例程,對(duì)    \STM32Cube_FW_G0_V1.2.0\Projects\NUCLEO-G070RB\Examples\FLASH\FLASH_EraseProgram 進(jìn)行修改以移植代碼。以下就撰寫例程代碼時(shí),需要注意的問題簡(jiǎn)單地介紹一下。

2 分析問題

首先,先來(lái)看一下 STM32L4 中 FLASH_FastProgram 例程中 readme.txt 對(duì)本示例的解釋,可以看到這是一個(gè)演示如何配置和使用 API 函數(shù)對(duì)內(nèi)部 Flash 存儲(chǔ)器進(jìn)行擦除和快速編程的示例。

先來(lái)看一下 FastProgram 最核心的函數(shù) FLASH_Program_Fast()。

在 STM32L4Cube 中的 stm32l4xx_hal_flash,它是這么定義的:

static void FLASH_Program_Fast(uint32_t Address, uint32_t DataAddress) 

而在 STM32G0Cube 中的 stm32g0xx_hal_flash,其定義是:

static __RAM_FUNC void FLASH_Program_Fast(uint32_t Address, uint32_t DataAddress) 

這兩者有什么區(qū)別呢?就是在 STM32G0Cube 庫(kù)中使用了__RAM_FUNC 指明了這個(gè)函數(shù)是位于 RAM 區(qū)域的。為什么呢?

第一個(gè)要點(diǎn):對(duì) Flash 進(jìn)行快速編程的時(shí)候不允許對(duì) Flash 進(jìn)行讀取,所以需要將這個(gè)快速編程的代碼放置于 RAM 中運(yùn)行,以避免對(duì) Flash 進(jìn)行命令讀取。

那么,大家可能又有疑問了,那為什么 STM32L4Cube 中并沒有使用__RAM_FUNC 關(guān)鍵字,STM32L452 的 Flash 是 single bank,難道它就不需要放到RAM 里?如果大家細(xì)心的話,可以看到STM32L4這個(gè)例程中的鏈接文件是   stm32l452xx_sram.icf,在icf 文件中定義了ROM的地址為 0x20000000~0x20015FFF,也就是說(shuō)這個(gè)示例代碼是跑在 RAM的,所以就不需要在這邊使用__RAM_FUNC 關(guān)鍵字了。還可以在 STM32L4 示例代碼中看到對(duì)整片 Flash 進(jìn)行擦除而猜到這一點(diǎn)。從 STM32G0Cube 庫(kù)中 FLASH_Program_Fast() 這個(gè)函數(shù)的定義,可以看出它是可以直接使用 stm32l452xx_flash.icf 將快速編程核心代碼以外的其他代碼都放在 Flash 上面跑的,這個(gè)可能更符合用戶做 IAP 升級(jí)的習(xí)慣,當(dāng)然,在這個(gè)情況下,我們就可能需要在程序中使用頁(yè)擦除而不是整片擦除了。

第二個(gè)要點(diǎn):因?yàn)?Flash 進(jìn)行快速編程的時(shí)候不允許對(duì) Flash 進(jìn)行讀取,所以還需要注意快速編程的源數(shù)據(jù)應(yīng)該位于 RAM 而非 Flash,以避免對(duì) Flash 進(jìn)行數(shù)據(jù)讀取。

因?yàn)樵?Flash 快速編程的時(shí)候,需要將 64 個(gè) word 一個(gè)行 (256 Bytes) 的數(shù)據(jù)寫到目標(biāo)地址中,所以也就是說(shuō)快速編程時(shí),還會(huì)去訪問源數(shù)據(jù),如果源數(shù)據(jù)放在Flash就會(huì)導(dǎo)致問題產(chǎn)生。下面,我們解答一個(gè)移植中常見問題。

在從 STM32L4 到 STM32G0 的移植中,直接將 STM32L4 示例代碼中定義的源數(shù)據(jù)的數(shù)組代碼:

/* Table used for fast programming */ static const uint64_t Data64_To_Prog[FLASH_ROW_SIZE] = {0x0000000000000000, 0x1111111111111111, 0x2222222222222222, 0x3333333333333333, 0x4444444444444444, 0x5555555555555555, 0x6666666666666666, 0x7777777777777777, 0x8888888888888888,0x9999999999999999, 0xAAAAAAAAAAAAAAAA,0xBBBBBBBBBBBBBBBB,0xCCCCCCCCCCCCCCCC,0xDDDDDDDDDDDDDDDD, 0xEEEEEEEEEEEEEEEE, 0xFFFFFFFFFFFFFFFF, 0x0011001100110011, 0x2233223322332233, 0x4455445544554455, 0x6677667766776677, 0x8899889988998899,0xAABBAABBAABBAABB, 0xCCDDCCDDCCDDCCDD,0xEEFFEEFFEEFFEEFF, 0x2200220022002200, 0x3311331133113311, 0x6644664466446644, 0x7755775577557755, 0xAA88AA88AA88AA88,0xBB99BB99BB99BB99, 0xEECCEECCEECCEECC, 0xFFDDFFDDFFDDFFDD}; 

原封不動(dòng)地拷貝到 STM32G0 的項(xiàng)目中,在測(cè)試的時(shí)候,總是會(huì)發(fā)現(xiàn)程序會(huì)死在快速編程的過(guò)程中。最后檢查才發(fā)現(xiàn)問題出現(xiàn)在這個(gè)數(shù)組的定義上。STM32L4 使用 stm32l452xx_sram.icf 定義了 ROM 的地址為 0x20000000~0x20015FFF,因此這個(gè) const 關(guān)鍵字的數(shù)據(jù)實(shí)際上也是位于 RAM 中的。但是將這個(gè)數(shù)組搬到 STM32G0 的項(xiàng)目時(shí),因?yàn)槭褂玫氖莝tm32l452xx_flash.icf,導(dǎo)致這個(gè)數(shù)組位于 Flash 中,在快速編程的時(shí)候程序就會(huì)去訪問 Flash 讀取源數(shù)據(jù),就導(dǎo)致程序死在快速編程過(guò)程。所以,需要將數(shù)組修改為:

/* Table used for fast programming */ uint64_t Data64_To_Prog[FLASH_ROW_SIZE] = { 0x0000000000000000, 0x1111111111111111, 0x2222222222222222, 0x3333333333333333, 0x4444444444444444, 0x5555555555555555, 0x6666666666666666, 0x7777777777777777, 0x8888888888888888,0x9999999999999999, 0xAAAAAAAAAAAAAAAA,0xBBBBBBBBBBBBBBBB, 0xCCCCCCCCCCCCCCCC,0xDDDDDDDDDDDDDDDD,  0xEEEEEEEEEEEEEEEE,0xFFFFFFFFFFFFFFFF,0x0011001100110011,0x2233223322332233, 0x4455445544554455, 0x6677667766776677, 0x8899889988998899,0xAABBAABBAABBAABB, 0xCCDDCCDDCCDDCCDD,0xEEFFEEFFEEFFEEFF, 0x2200220022002200, 0x3311331133113311, 0x6644664466446644, 0x7755775577557755, 0xAA88AA88AA88AA88,0xBB99BB99BB99BB99, 0xEECCEECCEECCEECC, 0xFFDDFFDDFFDDFFDD}; 

這樣程序就可以正常運(yùn)行。

第三個(gè)要點(diǎn):使用在 Flash 上跑 IAP 代碼進(jìn)行快速編程的話,建議看一下參考手冊(cè)里快速編程的步驟,在步驟中的第一步時(shí)使用 Page Erase 對(duì)當(dāng)前頁(yè)進(jìn)行擦除后對(duì)當(dāng)前頁(yè)進(jìn)行快速編程,每次一頁(yè),也就是“擦除當(dāng)前頁(yè)→快速編程當(dāng)前頁(yè)→擦除下一頁(yè)→快速編程下一頁(yè)→……”。

下面來(lái)仔細(xì)閱讀參考手冊(cè),關(guān)注一下另外幾個(gè)要點(diǎn)。

第四要點(diǎn):關(guān)于時(shí)鐘,在快速編程的過(guò)程中,CPU 的時(shí)鐘頻率(HCLK)不得低于 8MHz。這個(gè)在大家的應(yīng)用中一般都是滿足的,所以還好。另外,在“注”里邊說(shuō)明,F(xiàn)STPG 位置 1 時(shí),內(nèi)部振蕩器 HSI16 會(huì)自動(dòng)使能,在 FSTPG 位清零時(shí)自動(dòng)禁止,但 HSI16 之前已經(jīng)通過(guò) HSION 使能的情況除外。

第五要點(diǎn):這一行 32 個(gè)雙字必須連續(xù)寫入,兩個(gè)雙字寫入請(qǐng)求的最大時(shí)間間隔大約為 20us。如果后面的寫入請(qǐng)求時(shí)間超出了這個(gè)范圍,那么將導(dǎo)致 MISSERR 錯(cuò)誤產(chǎn)生。一般來(lái)說(shuō),只要您使用的是庫(kù)文件的函數(shù),不用擔(dān)心這個(gè)問題。

第六要點(diǎn):在兩次擦除之間,每一行的寫入,高壓持續(xù)時(shí)間不能大于8ms。一般來(lái)說(shuō),只要HCLK 的時(shí)鐘保證在8MHz以上,對(duì)32個(gè)雙字的連續(xù)寫序列,時(shí)間上還是沒問題的。如果真的程序沒寫好,導(dǎo)致存在這種情況,那么在芯片內(nèi)部有個(gè)7ms 的檢測(cè)機(jī)制,超時(shí)就會(huì)自動(dòng)停止編程,并置位 FASTERR。

第七要點(diǎn):關(guān)中斷。至于為什么?大家都知道,就不多說(shuō)了。如果大家使用 Cube 庫(kù),也可以看到在 FLASH_Program_Fast() 在進(jìn)行關(guān)中斷,但是示例中并沒有恢復(fù)打開中斷,所以大家在實(shí)際應(yīng)用中根據(jù)情況看是否需要將中斷打開。

3 問題解決

上面幾個(gè)要點(diǎn),如果軟件工程師使用的是 STM32Cube 庫(kù),那么在撰寫代碼上最主要是檢查一下前面三個(gè)要點(diǎn)的情況。后面幾個(gè)要點(diǎn)稍微了解就可以了。

結(jié)論

Flash的快速編程可以節(jié)省編程的時(shí)間,但是在使用上因?yàn)橛胁簧傧拗埔蛩?,使得它的軟件設(shè)計(jì)比標(biāo)準(zhǔn)編程復(fù)雜,需要工程師細(xì)心調(diào)試。

建議

軟件工程師在撰寫Flash快速編程時(shí),仔細(xì)閱讀下參考手冊(cè),并參考本文中的各個(gè)要點(diǎn),然后根據(jù)自己的實(shí)際應(yīng)用情況,理清邏輯,來(lái)撰寫完整的 Flash 編程代碼。


END

來(lái)源:STM32
版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系刪除。

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!

嵌入式ARM

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉