精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

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

Flash編程的基礎(chǔ)梳理

Geehy極海半導(dǎo)體 ? 來(lái)源:Geehy極海半導(dǎo)體 ? 作者:Geehy極海半導(dǎo)體 ? 2022-11-01 09:49 ? 次閱讀

前言

最近拿到了一塊APM32F103VC的MINI開(kāi)發(fā)板,在學(xué)習(xí)了一段時(shí)間后發(fā)現(xiàn)其有非常豐富的外設(shè)資源,主頻能達(dá)到96Mhz。最近在項(xiàng)目中使用到了IAP(In Application Programming)功能,特來(lái)評(píng)估一下APM32F103的IAP實(shí)現(xiàn)方式。

在應(yīng)用編程IAP(In-Application Programming)是應(yīng)用在Flash程序存儲(chǔ)器的一種編程模式。它可以在應(yīng)用程序正常運(yùn)行的情況下,通過(guò)調(diào)用特定的IAP程序?qū)α硗庖欢纬绦騀lash空間進(jìn)行讀/寫(xiě)操作,甚至可以控制對(duì)某段、某頁(yè)甚至某個(gè)字節(jié)的讀/寫(xiě)操作,這為數(shù)據(jù)存儲(chǔ)和固件的現(xiàn)場(chǎng)升級(jí)帶來(lái)了更大的靈活性。

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

那我們本章節(jié)就在IAP實(shí)現(xiàn)的第三部分內(nèi)容,F(xiàn)lash編程的基礎(chǔ)進(jìn)行梳理。

1 為什么要編程Flash?

眾所周知,MCU的Flash保存著我們的程序,一般情況下我們?cè)谏a(chǎn)或者調(diào)試的時(shí)候是通過(guò)我們的燒錄器或者仿真器對(duì)MCU的Flash進(jìn)行編程。在這個(gè)過(guò)程中我們無(wú)需關(guān)系Flash的編程流程,僅需要通過(guò)工具即可完成對(duì)Flash的編程操作。

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

那為什么做IAP需要關(guān)心Flash編程呢?因?yàn)镮AP的一個(gè)關(guān)鍵因素就能夠通過(guò)BootLoader去編程我們的APP區(qū)域的內(nèi)容。

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

即我們需要實(shí)現(xiàn)對(duì)MCU的Flash編程操作。

2 Flash的編程流程

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

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

2.1 Flash解鎖與上鎖

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

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

APM32F1的標(biāo)準(zhǔn)庫(kù)函數(shù)如下所示:

/*!

* [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的特性,對(duì)Flash寫(xiě)入數(shù)據(jù)的地址內(nèi)容必須是0xFFFF,打個(gè)比方來(lái)說(shuō),我們要在一張紙上畫(huà)一幅精彩的畫(huà)作,那我們的紙張必須要是空白的,這樣子才能不受紙張上的污漬影響我們。

那對(duì)于APM32F1的Flash來(lái)說(shuō),0xFFFF是“空白”狀態(tài),這個(gè)狀態(tài)下我們才能盡情的“書(shū)寫(xiě)”內(nèi)容。

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

擦除有分“全擦除”和“頁(yè)擦除”,由于我們的BootLoader也是存儲(chǔ)于Flash中的,我們?nèi)羰鞘褂谩叭脸辈僮魑覀兊腂ootLoader程序也會(huì)被擦除掉,使得MCU處于“空片”狀態(tài)。所以我們會(huì)使用“頁(yè)擦除”完成對(duì)APP存儲(chǔ)的區(qū)域進(jìn)行擦除操作。

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

APM32F1的標(biāo)準(zhǔn)庫(kù)函數(shù)如下所示:

/*!

* @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的編程

在上面我們完成對(duì)目標(biāo)區(qū)域的擦除操作后,便可以對(duì)Flash進(jìn)行編程操作了。

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

在APM32F1的標(biāo)準(zhǔn)庫(kù)函數(shù)中給我們提供了字編程與半字編程操作。

/*!

* @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的讀取

完成對(duì)目標(biāo)區(qū)域的Flash的編程后,我們一般情況下都需要進(jìn)行校驗(yàn),校驗(yàn)我們寫(xiě)入到Flash的實(shí)際內(nèi)容與我們的期望內(nèi)容是否一致。

我們可以使用直接讀取比較,或者CRC校驗(yàn)的方式進(jìn)行校驗(yàn)。校驗(yàn)的方法多種多樣,但是都離不開(kāi)Flash的讀取。APM32F1的Flash讀取較為簡(jiǎn)單,可以直接使用地址指針直接讀取相應(yīng)地址的內(nèi)容。

data = *(__IOM uint16_t *)address;

data = *(__IOM uint32_t *)address;

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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)投訴
  • 存儲(chǔ)器
    +關(guān)注

    關(guān)注

    38

    文章

    7455

    瀏覽量

    163623
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3596

    瀏覽量

    93610
  • 開(kāi)發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    4959

    瀏覽量

    97214

原文標(biāo)題:APM32芯得 EP.13 | APM32F103_IAP的簡(jiǎn)單實(shí)現(xiàn)_flash編程基礎(chǔ)

文章出處:【微信號(hào):geehysemi,微信公眾號(hào):Geehy極海半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用SD Flash為T(mén)MS320C28x器件編程外部非易失性存儲(chǔ)器

    電子發(fā)燒友網(wǎng)站提供《使用SD Flash為T(mén)MS320C28x器件編程外部非易失性存儲(chǔ)器.pdf》資料免費(fèi)下載
    發(fā)表于 10-15 11:48 ?0次下載
    使用SD <b class='flag-5'>Flash</b>為T(mén)MS320C28x器件<b class='flag-5'>編程</b>外部非易失性存儲(chǔ)器

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

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

    STM32L475VE內(nèi)部Flash編程出現(xiàn)ECCD錯(cuò)誤的原因?

    使用的芯片型號(hào) STM32L475VE,使用 HAL 庫(kù) `HAL_FLASH_Program` API 對(duì) 內(nèi)部 Flash 進(jìn)行編程,出現(xiàn) ECCD 錯(cuò)誤。 返回錯(cuò)誤的代碼摘要如下:(在
    發(fā)表于 04-26 07:21

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

    使用stm32g030f6p6 對(duì)flash快速編程時(shí)總是第一次可以正常的寫(xiě),第二次寫(xiě)就失敗,失敗地方總在 HAL_FLASH_Program這條函數(shù),這個(gè)地方卡了好幾個(gè)星期了,現(xiàn)在請(qǐng)廣大的壇友幫忙
    發(fā)表于 04-07 07:32

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

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

    STM32關(guān)于FLASH編程對(duì)齊錯(cuò)誤標(biāo)志位(PGAERR)的疑問(wèn)求解

    大神們,我現(xiàn)在正在做一個(gè)應(yīng)用,需要熟悉STM32F4的FLASH的任何錯(cuò)誤標(biāo)識(shí),以用于特殊情況下的錯(cuò)誤標(biāo)識(shí)判斷做相應(yīng)處理,但是針對(duì)FLASH編程對(duì)齊錯(cuò)誤標(biāo)志(PGAERR)與我理解不同。 原文
    發(fā)表于 03-22 07:59

    CW32L052 FLASH存儲(chǔ)器

    CW32L052內(nèi)部集成了64KB嵌入式FLASH供用戶使用,可用來(lái)存儲(chǔ)應(yīng)用程序和用戶數(shù)據(jù)。芯片支持對(duì) FLASH 存儲(chǔ)器的讀、擦除和寫(xiě)操作,支持擦寫(xiě)保護(hù)和讀保護(hù)。芯片內(nèi)置 FLASH 編程
    的頭像 發(fā)表于 02-28 17:43 ?700次閱讀
    CW32L052 <b class='flag-5'>FLASH</b>存儲(chǔ)器

    RL78系列 Flash編程庫(kù)01型日語(yǔ)版本用戶手冊(cè)

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

    RL78系列Flash編程庫(kù)Type01軟件包Ver.4.00發(fā)布說(shuō)明

    電子發(fā)燒友網(wǎng)站提供《RL78系列Flash編程庫(kù)Type01軟件包Ver.4.00發(fā)布說(shuō)明.pdf》資料免費(fèi)下載
    發(fā)表于 02-19 10:08 ?1次下載
    RL78系列<b class='flag-5'>Flash</b>自<b class='flag-5'>編程</b>庫(kù)Type01軟件包Ver.4.00發(fā)布說(shuō)明

    能否不使用ITCM就對(duì)Flash進(jìn)行編程呢?

    PC值跳轉(zhuǎn)至0x2000_0000(Flash的地址),觸發(fā)QSPI0讀取外部flash。 問(wèn)題在于 1 如果我使用Flashxip,如果我需要在線編程flash我就必須使用ITCM,
    發(fā)表于 01-10 07:28

    SmartBond Flash編程器工具發(fā)行說(shuō)明

    電子發(fā)燒友網(wǎng)站提供《SmartBond Flash編程器工具發(fā)行說(shuō)明.pdf》資料免費(fèi)下載
    發(fā)表于 01-03 09:51 ?0次下載
    SmartBond <b class='flag-5'>Flash</b><b class='flag-5'>編程</b>器工具發(fā)行說(shuō)明

    eeprom和flash的區(qū)別的作用

    等方面。在本文中,我們將詳細(xì)探討EEPROM和Flash Memory的作用和區(qū)別。 EEPROM是一種可編程讀寫(xiě)存儲(chǔ)器。它使用一種特殊的電子器件來(lái)存儲(chǔ)和擦除信
    的頭像 發(fā)表于 12-07 16:10 ?1996次閱讀

    Nor Flash編程和擦除操作的詳細(xì)流程

    Nor Flash 中的編程和擦除操作涉及寫(xiě)入數(shù)據(jù)和擦除存儲(chǔ)單元的特定步驟。
    的頭像 發(fā)表于 12-05 15:19 ?1356次閱讀

    Nor Flash編程和擦除操作實(shí)踐與指南

    閃存編程也不涉及將數(shù)據(jù)寫(xiě)入存儲(chǔ)單元,為確保準(zhǔn)確編程,Nor Flash 支持字節(jié)級(jí)編程,允許寫(xiě)入或修改單個(gè)字節(jié),而無(wú)需擦除整個(gè)塊。
    的頭像 發(fā)表于 12-05 14:03 ?2206次閱讀

    NAND Flash和NOR Flash的區(qū)別

    NAND Flash和NOR Flash是兩種常見(jiàn)的閃存類型。
    的頭像 發(fā)表于 11-30 13:53 ?2321次閱讀
    NAND <b class='flag-5'>Flash</b>和NOR <b class='flag-5'>Flash</b>的區(qū)別