chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

3天內不再提示

恩智浦經典LPC系列MCU內部Flash IAP驅動介紹

痞子衡嵌入式 ? 來源:痞子衡嵌入式 ? 2023-03-30 09:19 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

LPC 系列 MCU 是恩智浦公司于 2003 年開始推出的非常具有代表性的產品,距今已經有近 20 年的生命。按時間線演進來說,其主要分為三代:

- 元老:基于 ARM7/9 內核的 LPC2000/3000 系列
- 中堅:基于 Cortex-M0/0+/3/4 內核的 LPC800/1100/1200/1300/1500/1700/1800/4000/4300/54000
- 新銳:基于 Cortex-M33 內核的 LPC5500 系列。

其中堅產品即是痞子衡今天要重點聊的經典 MCU,從其第一顆 LPC1800 到至今仍有新型號出來的 LPC800,仍然深受廣大開發(fā)者喜愛。今天痞子衡想討論的是內部 Flash 驅動這個對嵌入式軟件開發(fā)者來說既冷門又不冷門的話題:

Note:本文內容主要以 LPC845 這個型號為例,未必完全適用其它經典 LPC 型號,具體需要查看相應手冊。

一、關于MCU內部Flash的基本概念

痞子衡先解釋下為什么內部 Flash 驅動這個話題既冷門又不冷門。說它冷門是因為大部分嵌入式軟件開發(fā)工程師寫的應用代碼里很少包含 Flash 操作功能(除非應用需要 OTA 升級或者斷電保存參數),因此對 Flash 模塊的關注度不如其它外設模塊。說它不冷門則是在 IDE 中調試或者編程器做量產又離不開 Flash 操作,所以避不可免地關注 Flash 擦寫算法、性能、壽命、效率等。

話說回來,Flash 外設一般由兩部分組成:Flash 控制器 + Flash Memory 介質,其 Memory 介質部分從原理上屬于并行 NOR Flash,MCU 上電 Flash 外設總是使能的,可以通過 AHB 總線直接讀取其映射空間內任意 Flash 地址處的數據/指令,所以其最主要的作用就是存儲可執(zhí)行代碼。

如果應用程序需要做 OTA 升級,則需要借助 Flash 控制器完成擦除和寫入操作。這里就有一些概念性的東西出現了,比如 Flash 擦除正常是按 Block/Sector 為單元(不排除有些支持按 Page 擦除),并且擦除操作是將 Block/Sector 里全部 bit 從 0 恢復為 1。而 Flash 寫入則是按 PUnit 為最小單元的(可能是 1/2/4/8 bytes),一次性最多寫入一個 Page 的數據(這里指一次完整命令執(zhí)行等待過程)。擦除和寫入操作都不是立刻就完成的,需要等待 Memory 介質更新完成(讀 Flash 控制器相應狀態(tài)位寄存器)。

LPC845 內部 Flash 一共 64KB,劃分為 64 個 Sector,每個 Sector 大小為 1KB。每個 Sector 包含 16 個 Page,每個 Page 大小為 64Bytes。支持按 Sector/Page 擦除,IAP 僅支持按 Page 寫入(但是控制器底層最小寫入單元是 4bytes),不支持 RWW 特性。

    64KB          N/A            N/A           1KB          64Bytes       4Bytes
Flash Memory > Flash Bank >= Flash Block > Flash Sector > Flash Page >= Flash PUnit >= Flash Byte
                   |              |             |              |             |
                RWW單元        擦除單元        擦除單元      最大寫入單元    最小寫入單元

關于 Flash 擦寫操作,還有一個重要概念叫 Read-While-Write(簡稱 RWW),因為默認代碼是執(zhí)行在 Flash 里,如果我們這個時候還做 Flash 擦寫操作,就會讓同一個 Flash 處于又做擦寫處理同時也要響應 AHB 總線來的讀指令請求,大部分 Flash 是無法支持這個特性的,因此常見的操作是將觸發(fā) Flash 擦寫命令以及讀 Flash 狀態(tài)的代碼重定向到 RAM 里去執(zhí)行。而 LPC 上不一樣的 Flash IAP 驅動設計正是為了解決這個 RWW 限制的。

二、一般Flash驅動設計

在講 LPC Flash IAP 特色驅動之前,我們先來看看一般 MCU 上 Flash 驅動設計,就以恩智浦 Kinetis MK60DN512Z 系列為例。它的 Flash 外設是 FTFL (詳見參考手冊里 Chapter 28 Flash Memory Module (FTFL) 章節(jié)),Flash 大小為 512KB,分為兩個 256KB Block (這里就相當于Bank),支持 RWW 特性(以 Block 為單元)。每個 Block 包含 128 個 Sector,每個 Sector 大小為 2KB。它其實沒有明確的 Page 概念(但是最大寫入單元是專用 4KB FLEXRAM 的一半,可以理解為 Page 大小就是 2KB),支持的最小寫入單元是 4bytes。

   512KB         256KB          256KB          2KB            2KB         4Bytes
Flash Memory > Flash Bank >= Flash Block > Flash Sector >= Flash Page > Flash PUnit >= Flash Byte
                   |              |             |              |             |
                RWW單元        擦除單元        擦除單元      最大寫入單元    最小寫入單元

在官方驅動 SDK_2_2_0_TWR-K60D100MdevicesMK60D10driversfsl_flash.c 里我們重點關注如下 5 個基本函數,這些函數都是直接操作 FTFL 外設寄存器來完成相應 Flash 擦寫功能的。其中 flash_command_sequence() 內部函數設計是核心,每一個 API 基本都會調用它,這里面有一個關于解決 RWW 限制的黑科技設計,后面痞子衡會寫文章專門介紹。

//一般初始化函數,主要是軟件層面初始化
status_tFLASH_Init(flash_config_t*config);
//為了解決RWW限制而特殊設計的命令觸發(fā)執(zhí)行函數
status_tFLASH_PrepareExecuteInRamFunctions(flash_config_t*config);
staticstatus_tflash_command_sequence(flash_config_t*config)
//擦除函數,長度不限(需要按Sector對齊),key參數是為了降低誤擦除風險
status_tFLASH_Erase(flash_config_t*config,uint32_tstart,uint32_tlengthInBytes,uint32_tkey);
//寫入函數,長度不限(僅最小寫入單元對齊限制),函數內部自動結合Page和PUnit寫入命令做處理
status_tFLASH_Program(flash_config_t*config,uint32_tstart,uint32_t*src,uint32_tlengthInBytes);

三、LPC Flash IAP驅動設計原理

終于來到本文核心 - LPC Flash IAP 驅動了。按照我們一般經驗,首先是翻看 LPC845 用戶手冊尋找 Flash 外設,但是很遺憾,用戶手冊里并沒有 Flash 外設詳細介紹,取而代之的是 Chapter 5: LPC84x ISP and IAP 章節(jié)。因為 LPC 全系列都包含 BootROM(映射地址為 0x0F00_0000 - 0x0F00_3FFF),而 BootROM 代碼里包含了 Flash 擦寫驅動,因此官方直接推薦用戶調用 ROM 里的 Flash 驅動 API 來完成操作,而不是按照傳統(tǒng)方式提供直接操作 Flash 外設寄存器的 SDK 源碼。

BootROM 提供的 API 不止 Flash IAP 一個,可以在 Boot Process 章節(jié)里如下圖里找到全部 API。這里我們可以看到 Flash IAP 函數的統(tǒng)一入口地址是 0x0F001FF1,這在 SDK 里 LPC845_features.h 文件里有如下專門宏:

/*@briefPointertoROMIAPentryfunctions*/
#defineFSL_FEATURE_SYSCON_IAP_ENTRY_LOCATION(0x0F001FF1)
04988e6a-ce98-11ed-bfe3-dac502259ad0.png

有了 IAP 入口地址,調用起來就簡單了,芯片用戶手冊里直接給了參考 C 代碼,可以看到 API 設計上將全部支持的 13 個函數集中在一起了,復用了輸入參數列表 command_param 和輸出結果列表 status_result。痞子衡之前寫過一篇 《二代 Kinetis 上的 Flash IAP 設計》,那個 API 接口設計更偏向現代嵌入式軟件開發(fā)者的習慣,而 LPC Flash IAP 接口設計是 2008 年推出來的,那時候看是超前時代。

unsignedintcommand_param[5];
unsignedintstatus_result[5];

typedefvoid(*IAP)(unsignedint[],unsignedint[]);
#defineIAP_LOCATION*(volatileunsignedint*)(0x0F001FF1)
IAPiap_entry=(IAP)IAP_LOCATION;

iap_entry(command_param,status_result);
04b45f14-ce98-11ed-bfe3-dac502259ad0.png

四、LPC Flash IAP驅動快速上手

最后看一下官方驅動 SDK_2_13_0_LPCXpresso845MAXdevicesLPC845driversfsl_iap.c ,這相當于將 Flash IAP 做了二次封裝,我們重點關注如下 6 個基本函數。其中 iap_entry() 最終調用的是 ROM 中代碼,直接執(zhí)行在 ROM 區(qū)域,不會和 Flash 訪問沖突,天然沒有 RWW 限制問題。

擦除函數 IAP_ErasePage()/IAP_EraseSector() 沒什么好說的,就是這個寫入函數 IAP_CopyRamToFlash() 命名有點繞,不符合一般習慣,然后需要特別注意的是寫入長度 numOfBytes 必須是 Page 倍數,且不能超過一個 Sector 大?。ǖ菍崪y可以橫跨兩個 Sector 一次性寫入多個 Page 數據,所以這僅僅是軟件代碼人為規(guī)定,不是 Flash 控制器限制)。

最后還有一個注意點就是擦寫操作都是所謂的 two step process,就是需要先調用一下 IAP_PrepareSectorForWrite() 函數才行,這個設計其實是為了降低程序跑飛出現誤擦寫的風險。

//一般初始化函數,主要是配置Flash訪問時間
voidIAP_ConfigAccessFlashTime(uint32_taccessTime);
//進入ROMIAP的入口函數
staticinlinevoidiap_entry(uint32_t*cmd_param,uint32_t*status_result);
//擦除和寫入前準備函數
status_tIAP_PrepareSectorForWrite(uint32_tstartSector,uint32_tendSector);
//擦除函數,按Page/Sector為單位
status_tIAP_ErasePage(uint32_tstartPage,uint32_tendPage,uint32_tsystemCoreClock);
status_tIAP_EraseSector(uint32_tstartSector,uint32_tendSector,uint32_tsystemCoreClock);
//寫入函數,長度最大限定為一個Sector
status_tIAP_CopyRamToFlash(uint32_tdstAddr,uint32_t*srcAddr,uint32_tnumOfBytes,uint32_tsystemCoreClock);






審核編輯:劉清

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

    關注

    114

    文章

    17503

    瀏覽量

    188489
  • 寄存器
    +關注

    關注

    31

    文章

    5495

    瀏覽量

    127794
  • OTA
    OTA
    +關注

    關注

    7

    文章

    623

    瀏覽量

    37559
  • NOR flash
    +關注

    關注

    2

    文章

    95

    瀏覽量

    23747
  • MCU芯片
    +關注

    關注

    3

    文章

    257

    瀏覽量

    12396

原文標題:為什么說內部Flash驅動是個既冷門又不冷門的話題 | LPC Flash IAP

文章出處:【微信號:pzh_mcu,微信公眾號:痞子衡嵌入式】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    各經銷商現提供LPC800開發(fā)板

    半導體(納斯達克代碼:NXPI)近日宣布正通過其主要產品經銷商提供LPC810和LPC812微控制器的評估樣品。LPC800
    發(fā)表于 03-06 15:43 ?2235次閱讀

    LPC55S16 MCU獲得了PSA 2級和SESIP 2級保證認證

    LPC55S16 MCU屬于EdgeVerse?計算和安全產品組合,是基于Arm? Cortex?-M33內核的通用LPC5500
    發(fā)表于 11-21 09:28 ?2004次閱讀

    8位MCU P89LPC982 Demo板

    [size=0.83em]8位MCU P89LPC982 Demo板.jpg(72.79 KB, 下載次數: 0)下載附件[color=rgb(153, 153, 153
    發(fā)表于 06-12 14:11

    i.MX RTxxx系列MCU的特性

      大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是i.MX RTxxx系列MCU的基本特性?! ?/div>
    發(fā)表于 11-04 07:08

    基于ARM968核的全新LPC292x系列微控制器

    基于ARM968核的全新LPC292x系列微控制器 半導體(NXP Semicon
    發(fā)表于 10-13 08:47 ?1123次閱讀

    推出基于Cortex-M0微控制LPC1100微控制器

    推出基于Cortex-M0微控制LPC1100微控制器系列 半導體(NXP Sem
    發(fā)表于 11-18 09:04 ?1757次閱讀

    LPC2200_flash內部Flash和外部Flash分散加載

    LPC2200_flash內部Flash和外部Flash分散加載示例。
    發(fā)表于 05-20 16:08 ?17次下載

    2009年MCU產品系列總覽

    2009年MCU產品系列總覽,又需要的下來看看。
    發(fā)表于 12-15 15:05 ?22次下載

    發(fā)布新的LPC微控制器系列產品,鞏固其在MCU市場的領先地位

    拉斯維加斯 –(CES 2017)– 2017年1月4日 - 半導體NXP Semiconductors N.V.(Nasdaq: NXPI)正以LPC800和LPC54000
    發(fā)表于 01-06 15:33 ?1337次閱讀

    無線MCU產品及方案介紹

    無線MCU產品及方案介紹
    發(fā)表于 10-16 15:42 ?9次下載
    <b class='flag-5'>恩</b>智<b class='flag-5'>浦</b>無線<b class='flag-5'>MCU</b>產品及方案<b class='flag-5'>介紹</b>

    關于LPC產品系列的關鍵功能的介紹(三)

    我們將帶您了解LPC800和LPC1100產品系列的關鍵功能,以及這些低功耗、低成本MCU如何帶來與8位架構相比的諸多優(yōu)勢。在本次會議中,我們將探討如何利用
    的頭像 發(fā)表于 06-28 19:50 ?3993次閱讀

    關于高性能智能攪拌機的技術介紹

    采用LPC MCU和NFC技術的高性能智能攪拌機
    的頭像 發(fā)表于 06-28 17:34 ?5023次閱讀

    對比系列MCU的GPIO電平中斷設計差異

    大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是系列MCU(包含Kinetis,
    的頭像 發(fā)表于 02-07 09:01 ?1928次閱讀

    新款首發(fā)!一站網羅MCU應用程序-AppCodeHub

    內部 MCU 專家們開發(fā)的各種應用筆記配套代碼(AN SW),通用代碼片段,應用軟件包(SW Pack)和綜合參考例程(Demo),涵蓋
    的頭像 發(fā)表于 08-17 08:45 ?1020次閱讀
    新款首發(fā)!一站網羅<b class='flag-5'>恩</b>智<b class='flag-5'>浦</b><b class='flag-5'>MCU</b>應用程序-AppCodeHub

    ACH拉近您與MCU專家的距離

    這個 ACH 將會匯聚內部 MCU 專家們開發(fā)的各種應用筆記配套代碼(AN SW),通用代碼片段,應用軟件包(SW Pack)和綜合參考例程(Demo),涵蓋
    的頭像 發(fā)表于 08-17 15:18 ?1161次閱讀
    ACH拉近您與<b class='flag-5'>恩</b>智<b class='flag-5'>浦</b><b class='flag-5'>MCU</b>專家的距離