国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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;

審核編輯 :李倩


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

    關注

    39

    文章

    7738

    瀏覽量

    171653
  • 編程
    +關注

    關注

    90

    文章

    3716

    瀏覽量

    97182
  • 開發板
    +關注

    關注

    26

    文章

    6289

    瀏覽量

    118054

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    SPI NOR Flash和SPI NAND Flash存儲芯片的區別

    SPI NOR Flash與SPI NAND Flash并非相互替代,而是互補關系。SPI NOR勝在讀取速度快、使用簡單、可靠性高,是代碼存儲的理想選擇。SPI NAND則以其大容量、高擦寫速度
    的頭像 發表于 01-29 16:58 ?455次閱讀
    SPI NOR <b class='flag-5'>Flash</b>和SPI NAND <b class='flag-5'>Flash</b>存儲芯片的區別

    京東關鍵詞 API 場景的需求梳理模板

    京東關鍵詞 API 場景需求梳理模板 本模板適用于 聯盟推廣、商家運營、工具開發、市場分析 等基于京東關鍵詞 API 的業務需求梳理,可直接用于需求文檔撰寫、API 對接方案評審。 核心模塊 填寫項
    的頭像 發表于 01-08 13:45 ?158次閱讀

    國產SPI NOR Flash接口閃存介紹

    在當今各類電子設備對存儲性能要求日益提升的背景下,SPI NOR Flash憑借其高速讀取、低功耗及靈活接口等優勢,成為嵌入式系統代碼存儲的關鍵元件。GT25Q系列SPI NOR Flash采用先進
    的頭像 發表于 12-26 11:51 ?448次閱讀

    Infineon SEMPER NOR Flash與HYPERRAM? 2.0 Gen2 Flash+RAM MCP產品解析

    Infineon SEMPER NOR Flash與HYPERRAM? 2.0 Gen2 Flash+RAM MCP產品解析 引言 在汽車集群和工業HMI應用中,通常會使用NOR Flash來存儲
    的頭像 發表于 12-20 16:20 ?1201次閱讀

    使用J-Flash編程CW32 MCU

    。 確保連接正確,并且MCU處于可編程狀態(例如,處于復位狀態)。 3.啟動J-Flash: 打開J-Flash應用程序。 在J-Flash中,選擇正確的目標設備(即你的CW32 MC
    發表于 11-25 07:00

    E203 代碼結構梳理

    一、隊伍介紹 本篇為蜂鳥E203系列分享第五篇,本篇介紹的內容是E203 代碼結構梳理。 二、層次圖 三、模塊具體功能
    發表于 10-30 06:56

    NAND Flash的基本原理和結構

    NAND Flash是什么?NAND Flash(閃存)是一種非易失性存儲器技術,主要用于數據存儲。與傳統的DRAM或SRAM不同,NAND Flash在斷電后仍能保存數據。它通過電荷的存儲與釋放來實現數據的存儲。
    的頭像 發表于 09-08 09:51 ?7021次閱讀
    NAND <b class='flag-5'>Flash</b>的基本原理和結構

    TLE9893是否支持在FLASH1上運行代碼來擦除和編程FLASH1?

    芯片TLE9893是否支持在FLASH1上運行代碼來擦除和編程FLASH1。在NVM-PROG_UCODE中,代碼在FLASH1上運行,并將數據寫入
    發表于 08-13 08:14

    FLASH燒寫/編程白皮書

    白皮書:如何燒寫Flash——不同場景不同需求下的選擇認識Flash?NAND vs. NOR如何燒寫/編程不同方案比較
    發表于 07-28 16:05 ?0次下載

    AS32X601芯片Flash擦寫調試技術解析

    本文聚焦于 國科安芯推出的AS32X601 芯片的 Flash 擦寫調試工作,深入剖析其片內 Flash 存儲器架構,詳述 Flash 控制器功能與運作機制。通過對 Flash 指令集
    的頭像 發表于 07-22 13:47 ?755次閱讀
    AS32X601芯片<b class='flag-5'>Flash</b>擦寫調試技術解析

    FLASH的工作原理與應用

    14FLASHFLASH的工作原理與應用OWEIS1什么是FLASH?Flash閃存是一種非易失性半導體存儲器,它結合了ROM(只讀存儲器)和RAM(隨機訪問存儲器)的優點,具有電子可擦除和可編程
    的頭像 發表于 05-27 13:10 ?2077次閱讀
    <b class='flag-5'>FLASH</b>的工作原理與應用

    如何通過SFL為設備添加Flash編程支持

    SEGGER Flash Loader(SFL)是J-Link設備支持套件(DSK)的一部分,通過SFL,用戶可以為自己的新設備添加Flash編程支持。
    的頭像 發表于 05-19 16:35 ?1478次閱讀
    如何通過SFL為設備添加<b class='flag-5'>Flash</b><b class='flag-5'>編程</b>支持

    MCU片上Flash

    ? ? MCU片上Flash是微控制器內部集成的非易失性存儲器,主要用于存儲程序代碼、常量數據及系統配置信息。其核心特性與功能如下: 一、定義與類型? 片上Flash采用浮柵晶體管技術,具備斷電數據
    的頭像 發表于 05-06 14:26 ?1254次閱讀

    基于小凌派RK2206開發板:OpenHarmony如何使用IoT接口控制FLASH外設

    1、實驗簡介本實驗將演示如何在小凌派-RK2206開發板上使用IOT庫的FLASH接口,進行FLASH編程開發。例程將創建一個任務,實現FLASH讀寫操作。例程源代碼:https
    的頭像 發表于 04-22 14:49 ?913次閱讀
    基于小凌派RK2206開發板:OpenHarmony如何使用IoT接口控制<b class='flag-5'>FLASH</b>外設

    PSoC6怎么設置Flash讀保護,防止用編程器讀出?

    PSoC6 怎么設置Flash讀保護,防止用編程器讀出
    發表于 04-21 06:15