日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > > 嵌入式微處理器
[導(dǎo)讀]在一些新的 STM32 系列中,比如 STM32L4、STM32G0、STM32G4 等,除了 Flash 標準編程之外,還可以支持 Flash 的快速編程。


引言

在一些新的 STM32 系列中,比如 STM32L4、STM32G0、STM32G4 等,除了 Flash 標準編程之外,還可以支持 Flash 的快速編程。那么對于 STM32G0 來說,在使用快速編程時,有哪些需要注意之處?

難點

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

調(diào)研

1 了解問題

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

2 分析問題

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

先來看一下 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 庫中使用了__RAM_FUNC 指明了這個函數(shù)是位于 RAM 區(qū)域的。為什么呢?

第一個要點:對 Flash 進行快速編程的時候不允許對 Flash 進行讀取,所以需要將這個快速編程的代碼放置于 RAM 中運行,以避免對 Flash 進行命令讀取。

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

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

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

在從 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}; 

原封不動地拷貝到 STM32G0 的項目中,在測試的時候,總是會發(fā)現(xiàn)程序會死在快速編程的過程中。最后檢查才發(fā)現(xiàn)問題出現(xiàn)在這個數(shù)組的定義上。STM32L4 使用 stm32l452xx_sram.icf 定義了 ROM 的地址為 0x20000000~0x20015FFF,因此這個 const 關(guān)鍵字的數(shù)據(jù)實際上也是位于 RAM 中的。但是將這個數(shù)組搬到 STM32G0 的項目時,因為使用的是stm32l452xx_flash.icf,導(dǎo)致這個數(shù)組位于 Flash 中,在快速編程的時候程序就會去訪問 Flash 讀取源數(shù)據(jù),就導(dǎo)致程序死在快速編程過程。所以,需要將數(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}; 

這樣程序就可以正常運行。

第三個要點:使用在 Flash 上跑 IAP 代碼進行快速編程的話,建議看一下參考手冊里快速編程的步驟,在步驟中的第一步時使用 Page Erase 對當前頁進行擦除后對當前頁進行快速編程,每次一頁,也就是“擦除當前頁→快速編程當前頁→擦除下一頁→快速編程下一頁→……”。

下面來仔細閱讀參考手冊,關(guān)注一下另外幾個要點。

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

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

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

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

3 問題解決

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

結(jié)論

Flash的快速編程可以節(jié)省編程的時間,但是在使用上因為有不少限制因素,使得它的軟件設(shè)計比標準編程復(fù)雜,需要工程師細心調(diào)試。

建議

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


END

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

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

嵌入式ARM

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

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

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉