色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Flash編程的基礎梳理

Geehy極海半導體 ? 來源:Geehy極海半導體 ? 作者:Geehy極海半導體 ? 2022-11-01 09:49 ? 次閱讀

前言

最近拿到了一塊APM32F103VC的MINI開發板,在學習了一段時間后發現其有非常豐富的外設資源,主頻能達到96Mhz。最近在項目中使用到了IAP(In Application Programming)功能,特來評估一下APM32F103的IAP實現方式。

在應用編程IAP(In-Application Programming)是應用在Flash程序存儲器的一種編程模式。它可以在應用程序正常運行的情況下,通過調用特定的IAP程序對另外一段程序Flash空間進行讀/寫操作,甚至可以控制對某段、某頁甚至某個字節的讀/寫操作,這為數據存儲和固件的現場升級帶來了更大的靈活性。

話接上回,我們提及到了 程序跳轉運行就是修改PC指針至我們的APP程序,然后修改我們的中斷向量寄存器以使得我們的APP程序能夠正確相應中斷。

那我們本章節就在IAP實現的第三部分內容,Flash編程的基礎進行梳理。

1 為什么要編程Flash?

眾所周知,MCU的Flash保存著我們的程序,一般情況下我們在生產或者調試的時候是通過我們的燒錄器或者仿真器對MCU的Flash進行編程。在這個過程中我們無需關系Flash的編程流程,僅需要通過工具即可完成對Flash的編程操作。

d288777c-5986-11ed-a3b6-dac502259ad0.jpg

那為什么做IAP需要關心Flash編程呢?因為IAP的一個關鍵因素就能夠通過BootLoader去編程我們的APP區域的內容。

d291ace8-5986-11ed-a3b6-dac502259ad0.jpg

即我們需要實現對MCU的Flash編程操作。

2 Flash的編程流程

在APM32F103的手冊,我們可以看到Flash編程一共分為解鎖,擦除,編程,上鎖的四個步驟。下面我們一步步看一下我們需要完成哪些操作。

d29bf66c-5986-11ed-a3b6-dac502259ad0.jpg

2.1 Flash解鎖與上鎖

Flash是我們程序保存的地方,需要編程FLash必須是“確定的”,而不是我們“一時興起”。所以涉及較為繁瑣的“解鎖”步驟,以防我們重要的程序內容被改動。

d2ae47b8-5986-11ed-a3b6-dac502259ad0.jpg

APM32F1的標準庫函數如下所示:

/*!

* [url=home.php?mod=space&uid=247401]@brief[/url] Unlocks the FMC Program Erase Controller

*

* @param None

*

* @retval None

*/

void FMC_Unlock(void)

{

FMC->KEY = 0x45670123;

FMC->KEY = 0xCDEF89AB;

}

/*!

* [url=home.php?mod=space&uid=247401]@brief[/url] Locks the FMC Program Erase Controller.

*

* @param None

*

* @retval None

*/

void FMC_Lock(void)

{

FMC->CTRL2_B.LOCK = BIT_SET;

}

2.2 Flash的擦除

由于APM32F1 的Flash的特性,對Flash寫入數據的地址內容必須是0xFFFF,打個比方來說,我們要在一張紙上畫一幅精彩的畫作,那我們的紙張必須要是空白的,這樣子才能不受紙張上的污漬影響我們。

那對于APM32F1的Flash來說,0xFFFF是“空白”狀態,這個狀態下我們才能盡情的“書寫”內容。

那Flash的擦除操作,便是把Flash變回“空白”的操作。

擦除有分“全擦除”和“頁擦除”,由于我們的BootLoader也是存儲于Flash中的,我們若是使用“全擦除”操作我們的BootLoader程序也會被擦除掉,使得MCU處于“空片”狀態。所以我們會使用“頁擦除”完成對APP存儲的區域進行擦除操作。

d2c24876-5986-11ed-a3b6-dac502259ad0.jpg

APM32F1的標準庫函數如下所示:

/*!

* @brief Erases a specified FMC page.

*

* @param pageAddr: The page address to be erased.

*

* @retval Returns the flash state.It can be one of value:

* [url=home.php?mod=space&uid=2817080]@ARG[/url] FMC_STATUS_BUSY

* [url=home.php?mod=space&uid=2817080]@ARG[/url] FMC_STATUS_ERROR_PG

* @arg FMC_STATUS_ERROR_WRP

* @arg FMC_STATUS_COMPLETE

* @arg FMC_STATUS_TIMEOUT

*/

FMC_STATUS_T FMC_ErasePage(uint32_t pageAddr)

{

FMC_STATUS_T status = FMC_STATUS_COMPLETE;

status = FMC_WaitForLastOperation(0x000B0000);

if(status == FMC_STATUS_COMPLETE)

{

FMC->CTRL2_B.PAGEERA = BIT_SET;

FMC->ADDR = pageAddr;

FMC->CTRL2_B.STA = BIT_SET;

status = FMC_WaitForLastOperation(0x000B0000);

FMC->CTRL2_B.PAGEERA = BIT_RESET;

}

return status;

}

/*!

* @brief Erases all FMC pages.

*

* @param None

*

* @retval Returns the flash state.It can be one of value:

* @arg FMC_STATUS_ERROR_PG

* @arg FMC_STATUS_ERROR_WRP

* @arg FMC_STATUS_COMPLETE

* @arg FMC_STATUS_TIMEOUT

*/

FMC_STATUS_T FMC_EraseAllPage(void)

{

FMC_STATUS_T status = FMC_STATUS_COMPLETE;

status = FMC_WaitForLastOperation(0x000B0000);

if(status == FMC_STATUS_COMPLETE)

{

FMC->CTRL2_B.MASSERA = BIT_SET;

FMC->CTRL2_B.STA = BIT_SET;

status = FMC_WaitForLastOperation(0x000B0000);

FMC->CTRL2_B.MASSERA = BIT_RESET;

}

return status;

}

2.3 Flash的編程

在上面我們完成對目標區域的擦除操作后,便可以對Flash進行編程操作了。

d2d289c0-5986-11ed-a3b6-dac502259ad0.jpg

在APM32F1的標準庫函數中給我們提供了字編程與半字編程操作。

/*!

* @brief Programs a word at a specified address.

*

* @param address:the address to be programmed.

*

* @param data: the data to be programmed.

*

* @retval Returns the flash state.It can be one of value:

* @arg FMC_STATUS_ERROR_PG

* @arg FMC_STATUS_ERROR_WRP

* @arg FMC_STATUS_COMPLETE

* @arg FMC_STATUS_TIMEOUT

*/

FMC_STATUS_T FMC_ProgramWord(uint32_t address, uint32_t data)

{

FMC_STATUS_T status = FMC_STATUS_COMPLETE;

__IOM uint32_t temp = 0;

#ifdef APM32F10X_HD

__set_PRIMASK(1);

#endif

status = FMC_WaitForLastOperation(0x000B0000);

if(status == FMC_STATUS_COMPLETE)

{

FMC->CTRL2_B.PG = BIT_SET;

*(__IOM uint16_t *)address = data;

status = FMC_WaitForLastOperation(0x000B0000);

if(status == FMC_STATUS_COMPLETE)

{

temp = address + 2;

*(__IOM uint16_t*) temp = data >> 16;

status = FMC_WaitForLastOperation(0x000B0000);

FMC->CTRL2_B.PG = BIT_RESET;

}

else

{

FMC->CTRL2_B.PG = BIT_RESET;

}

}

#ifdef APM32F10X_HD

__set_PRIMASK(0);

#endif

return status;

}

/*!

* @brief Programs a half word at a specified address.

*

* @param address:the address to be programmed.

*

* @param data: the data to be programmed.

*

* @retval Returns the flash state.It can be one of value:

* @arg FMC_STATUS_ERROR_PG

* @arg FMC_STATUS_ERROR_WRP

* @arg FMC_STATUS_COMPLETE

* @arg FMC_STATUS_TIMEOUT

*/

FMC_STATUS_T FMC_ProgramHalfWord(uint32_t address, uint16_t data)

{

FMC_STATUS_T status = FMC_STATUS_COMPLETE;

#ifdef APM32F10X_HD

__set_PRIMASK(1);

#endif

status = FMC_WaitForLastOperation(0x000B0000);

if(status == FMC_STATUS_COMPLETE)

{

FMC->CTRL2_B.PG = BIT_SET;

*(__IOM uint16_t *)address = data;

status = FMC_WaitForLastOperation(0x000B0000);

FMC->CTRL2_B.PG = BIT_RESET;

}

#ifdef APM32F10X_HD

__set_PRIMASK(0);

#endif

return status;

}

3 Flash的讀取

完成對目標區域的Flash的編程后,我們一般情況下都需要進行校驗,校驗我們寫入到Flash的實際內容與我們的期望內容是否一致。

我們可以使用直接讀取比較,或者CRC校驗的方式進行校驗。校驗的方法多種多樣,但是都離不開Flash的讀取。APM32F1的Flash讀取較為簡單,可以直接使用地址指針直接讀取相應地址的內容。

data = *(__IOM uint16_t *)address;

data = *(__IOM uint32_t *)address;

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲器
    +關注

    關注

    38

    文章

    7527

    瀏覽量

    164171
  • 編程
    +關注

    關注

    88

    文章

    3637

    瀏覽量

    93903
  • 開發板
    +關注

    關注

    25

    文章

    5120

    瀏覽量

    97964

原文標題:APM32芯得 EP.13 | APM32F103_IAP的簡單實現_flash編程基礎

文章出處:【微信號:geehysemi,微信公眾號:Geehy極海半導體】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    AN-881: 通過LIN—協議4進行Flash/EE存儲器編程

    電子發燒友網站提供《AN-881: 通過LIN—協議4進行Flash/EE存儲器編程.pdf》資料免費下載
    發表于 01-14 16:12 ?0次下載
    AN-881: 通過LIN—協議4進行<b class='flag-5'>Flash</b>/EE存儲器<b class='flag-5'>編程</b>

    EE-231:帶SHARC處理器的SPI Flash在線編程

    電子發燒友網站提供《EE-231:帶SHARC處理器的SPI Flash在線編程.pdf》資料免費下載
    發表于 01-06 15:31 ?0次下載
    EE-231:帶SHARC處理器的SPI <b class='flag-5'>Flash</b>在線<b class='flag-5'>編程</b>

    Flash語音芯片相比OTP語音芯片的優勢

    ?。No.1可重復擦寫Flash語音芯片的最大特點是支持多次編程和擦除,這意味著用戶可以根據需要隨時更新語音內容,實現定制化和靈活的語音交互。相比之下,OTP語音芯
    的頭像 發表于 12-16 16:02 ?167次閱讀
    <b class='flag-5'>Flash</b>語音芯片相比OTP語音芯片的優勢

    Flash語音芯片相比OTP語音芯片的優勢

    ?。 1?.可重復擦寫?:Flash語音芯片的最大特點是支持多次編程和擦除,這意味著用戶可以根據需要隨時更新語音內容,實現定制化和靈活的語音交互。相比之下,OTP語音芯片只能編程一次,無法更改存儲的音頻數據,靈活性較差?。 ?2
    的頭像 發表于 12-16 15:44 ?166次閱讀

    使用SD Flash為TMS320C28x器件編程外部非易失性存儲器

    電子發燒友網站提供《使用SD Flash為TMS320C28x器件編程外部非易失性存儲器.pdf》資料免費下載
    發表于 10-15 11:48 ?0次下載
    使用SD <b class='flag-5'>Flash</b>為TMS320C28x器件<b class='flag-5'>編程</b>外部非易失性存儲器

    NAND Flash和NOR Flash哪個更好

    在討論NAND Flash和NOR Flash哪個更好時,我們需要從多個維度進行深入分析,包括它們的技術特性、應用場景、成本效益以及未來發展趨勢等。
    的頭像 發表于 07-29 16:59 ?1689次閱讀

    NAND Flash上的Vpp是什么?有何功能?

    NAND Flash上的,指的是用于向閃存單元寫入數據時使用的較高編程電壓。通常高于用于其他操作如讀取或擦除的正常工作電壓。
    的頭像 發表于 05-30 09:07 ?2364次閱讀

    STM32L475VE內部Flash編程出現ECCD錯誤的原因?

    使用的芯片型號 STM32L475VE,使用 HAL 庫 `HAL_FLASH_Program` API 對 內部 Flash 進行編程,出現 ECCD 錯誤。 返回錯誤的代碼摘要如下:(在
    發表于 04-26 07:21

    【GD32H757Z海棠派開發板使用手冊】第四講 FMC-片內Flash擦寫讀實驗

    編程操作。 Flash讀取可以支持64字節雙字、32位整字、16位半字或字節讀操作;Flash編程可以支持64位雙字、32位整字編程
    的頭像 發表于 04-19 10:09 ?1371次閱讀
    【GD32H757Z海棠派開發板使用手冊】第四講 FMC-片內<b class='flag-5'>Flash</b>擦寫讀實驗

    stm32g030f6p6 flash快速編程總是失敗的原因?

    使用stm32g030f6p6 對flash快速編程時總是第一次可以正常的寫,第二次寫就失敗,失敗地方總在 HAL_FLASH_Program這條函數,這個地方卡了好幾個星期了,現在請廣大的壇友幫忙
    發表于 04-07 07:32

    Flash存儲芯片:NOR Flash、NAND Flash、UFS和eMMC的比較與解析

    前言 在數字化時代的今天,數據的存儲和管理變得越來越重要。各種各樣的存儲技術應運而生,以滿足不同的使用場景和需求。其中,Flash存儲芯片以其非易失性、可擦寫性和可編程性等優勢,占據了重要地位。本
    的頭像 發表于 04-03 12:02 ?4640次閱讀
    <b class='flag-5'>Flash</b>存儲芯片:NOR <b class='flag-5'>Flash</b>、NAND <b class='flag-5'>Flash</b>、UFS和eMMC的比較與解析

    STM32關于FLASH編程對齊錯誤標志位(PGAERR)的疑問求解

    大神們,我現在正在做一個應用,需要熟悉STM32F4的FLASH的任何錯誤標識,以用于特殊情況下的錯誤標識判斷做相應處理,但是針對FLASH編程對齊錯誤標志(PGAERR)與我理解不同。 原文
    發表于 03-22 07:59

    CW32L052 FLASH存儲器

    CW32L052內部集成了64KB嵌入式FLASH供用戶使用,可用來存儲應用程序和用戶數據。芯片支持對 FLASH 存儲器的讀、擦除和寫操作,支持擦寫保護和讀保護。芯片內置 FLASH 編程
    的頭像 發表于 02-28 17:43 ?762次閱讀
    CW32L052 <b class='flag-5'>FLASH</b>存儲器

    RL78系列 Flash編程庫01型日語版本用戶手冊

    電子發燒友網站提供《RL78系列 Flash編程庫01型日語版本用戶手冊.pdf》資料免費下載
    發表于 02-19 10:17 ?0次下載
    RL78系列 <b class='flag-5'>Flash</b>自<b class='flag-5'>編程</b>庫01型日語版本用戶手冊

    RL78系列Flash編程庫Type01軟件包Ver.4.00發布說明

    電子發燒友網站提供《RL78系列Flash編程庫Type01軟件包Ver.4.00發布說明.pdf》資料免費下載
    發表于 02-19 10:08 ?1次下載
    RL78系列<b class='flag-5'>Flash</b>自<b class='flag-5'>編程</b>庫Type01軟件包Ver.4.00發布說明
    主站蜘蛛池模板: 久久视频这里只精品6国产| 色欲久久综合亚洲精品蜜桃| 久久99r66热这里只有精品| 久久超碰色中文字幕| 久久精品热只有精品| 旧里番ovaの催○セイ活指导| 久久综合亚洲色hezyo| 蜜芽国产在线精品欧美| 欧美午夜免费观看福利片| 日韩精品一区二区亚洲AV观看| 熟女理发厅| 亚洲色欲国产AV精品综合| 中文字幕无线手机在线| hdsex老太婆70| 国产精品视频大全| 精品久久久噜噜噜久久久app | 亚洲伦理精品久久| 中文字幕午夜乱理片| 成人网视频在线观看免费| 国产国产成年在线视频区| 婚后被调教当众高潮H喷水| 蜜芽最新域名解析网站| 色噜噜噜亚洲男人的天堂| 亚洲欧美日韩国产手机在线 | 欧洲精品不卡1卡2卡三卡四卡| 天天国产在线精品亚洲| 亚洲欧美综合中文字幕| 99re5久久热在线| 国产高清砖码区| 久久亚洲电影www电影网| 人人在线碰碰视频免费| 亚洲乱码国产乱码精品精98| 97国产精品久久精品国产| 国产AV亚洲一区精午夜麻豆 | 999在线观看精品免费| 第一会所欧美无码原创| 蝴蝶中文娱乐| 日本久久频这里精品99| 亚洲日本欧美天堂在线| 99久久99久久精品免费看子| 国产人妻人伦精品9|