上一篇講到內(nèi)部Flash的讀寫(xiě),本篇講述使用D-Flash模擬EEPROM。其實(shí)使用P-Flash也可以模擬,只不過(guò)D-Flash的Page更小(擦除復(fù)寫(xiě)占用更少時(shí)間),而且不會(huì)占用代碼空間。
最近剛換工作,一直比較忙,更新會(huì)比較慢。若是需要源碼可自行下載:https://download.csdn.net/download/u010875635/11435913
沒(méi)有積分可以自己新建工程,下面的代碼基本可以直接使用。
本篇關(guān)于Flash讀寫(xiě)就不在贅述,跟PFlash除了Sector大小和指令不同,其余一致,后面直接貼出代碼。
模擬EEPROM其實(shí)就是模擬其單字節(jié)讀寫(xiě)功能,原理就是要修改某個(gè)Sector內(nèi)某個(gè)字節(jié)的數(shù)據(jù)時(shí),先讀出這個(gè)扇區(qū)內(nèi)所有數(shù)據(jù)(256Bytes)到數(shù)組,然后擦除這個(gè)Sector,再在RAM中修改那個(gè)字節(jié)的數(shù)據(jù),最后將這個(gè)數(shù)組寫(xiě)回該扇區(qū)。修改多字節(jié)數(shù)據(jù)原理相似。
另外大家可以想一下,若是要往EEPROM中寫(xiě)入跨Sector的數(shù)組怎么辦?(需要判斷數(shù)組地址范圍)
使用范例:
main.c
#include #include "derivative.h" /* derivative-specific definitions */ #include "Typedefs.h" #include "gpio.h" #include "System.h" #include "flash.h" #include "EmulationEEPROM.h" UINT32 m_maincount=0; void main(void) { /* put your own code here */ int result; UINT32 index = 0; UINT32 globalDFlashAddr1 = 0x100000,globalDFlashAddr2 = 0x100002,globalDFlashAddr3=0x13F800; UINT32 globalAddr1 = 0x7F4000,globalAddr2 = 0x7F4002,globalAddr3=0x7db460; UINT8 datas1[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F}; UINT8 datas2[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09}; UINT8 readDatas[100]; McuDrivers_System_Init(); McuDrivers_GPIO_Init(); EnableInterrupts; //for(index = 0;index<129;index++) // HDL_Flash_PFlash_ProgramMultiSectors(globalAddr2+index*8,datas,sizeof(datas)); //HDL_Flash_PFlash_EraseOneSector(0x7F4000); // HDL_Flash_PFlash_EraseMultiSectors(globalAddr2,globalAddr2+1001); //IFsh1_EraseSector(globalAddr2); //HDL_Flash_PFlash_ProgramMultiSectors(globalAddr1,datas,sizeof(datas)); //HDL_Flash_PFlash_ProgramMultiSectors(globalAddr3,datas2,sizeof(datas2)); //HDL_Flash_DFlash_EraseMultiSectors(globalDFlashAddr1,globalDFlashAddr1+1000); //for(index = 0;index<33;index++) // HDL_Flash_DFlash_ProgramMultiSectors(globalDFlashAddr1+index*16,datas1,sizeof(datas1)); //HDL_Flash_DFlash_EraseMultiSectors(globalDFlashAddr1,globalDFlashAddr1+1000); //HDL_Flash_DFlash_ProgramMultiSectors(globalDFlashAddr2,datas1,sizeof(datas1)); result = HAL_EEE_ChangeValue(globalDFlashAddr1,datas1,sizeof(datas1)); result = HAL_EEE_ChangeValue(globalDFlashAddr1+10,datas1,sizeof(datas1)); HAL_EEE_GetValue(globalDFlashAddr1,30,readDatas); for(;;) { m_maincount++; if(m_maincount>100000) { m_maincount = 0; PORTB_PB0 ^=1; } _FEED_COP(); /* feeds the dog */ } /* loop forever */ /* please make sure that you never leave main */ } EmulationEEPROM.h #ifndef _HAL_EmulationEEPROM_H_ #define _HAL_EmulationEEPROM_H_ #include "Typedefs.h" //get value int HAL_EEE_GetValue(UINT32 startGlobalAddr, UINT8 newDataLength, UINT8 * pNewData); //change value int HAL_EEE_ChangeValue(UINT32 startGlobalAddr, UINT8 * pNewData,UINT8 newDataLength); #endif EmulationEEPROM.c #include "EmulationEEPROM.h" #include "flash.h" #define DFLASH_SECTOR_ADDR_MASK 0xFFFFFF00 //256 bytes #define DFLASH_SECTOR_SIZE 256U #define PROGRAM_DFlash_Phrase_SIZE 8U #define PROGRAM_DFlash_Phrase_MASK 0xFFFFFFF8 //get value int HAL_EEE_GetValue(UINT32 startGlobalAddr, UINT8 newDataLength, UINT8 * pNewData) { UINT16 i; UINT8 *far readTmpData; //讀取DFlash中內(nèi)容 for(i=0;i readTmpData = (UINT8 *far)(startGlobalAddr+i); pNewData[i] = (*readTmpData); } } //change value int HAL_EEE_ChangeValue(UINT32 startGlobalAddr, UINT8 * pNewData,UINT8 newDataLength) { UINT32 sectorStartAddr = startGlobalAddr&DFLASH_SECTOR_ADDR_MASK; UINT8 dataContainer[DFLASH_SECTOR_SIZE]={0}; UINT16 *far readTmpData; UINT16 i; volatile int result = 0; //讀取DFlash中此扇區(qū)內(nèi)容 for(i=0;i readTmpData = (UINT16 *far)(sectorStartAddr+i); dataContainer[i] = ((*readTmpData)>>8)&0xFF; //高位在前 dataContainer[i+1] = (*readTmpData)&0xFF; } //更新要寫(xiě)入的內(nèi)容 for(i=startGlobalAddr-sectorStartAddr;i result = HDL_Flash_DFlash_EraseMultiSectors(sectorStartAddr,sectorStartAddr); result = HDL_Flash_DFlash_ProgramMultiSectors(sectorStartAddr,dataContainer,DFLASH_SECTOR_SIZE); return result; } flash.h #ifndef _HDL_FLASH_H_ #define _HDL_FLASH_H_ #define FLASH_BOOT_SEQUENCE_ERROR (-2) #define FLASH_ADDRESS_ERROR (-3) #define FLASH_ERASE_ERROR (-4) #define FLASH_PROGRAM_ERROR (-5) #define FLASH_VERIFICATION_ERROR (-6) #define FLASH_DATALENGTH_ERROR (-8) #define FLASH_NOTAVAIL_ERROR (-9) #define FLASH_PROTECTED_ERROR (-10) #define FLASH_MGSTAT_ERROR (-11) #define FLASH_BUSY_ERROR (-12) #define FLASH_SUCCESS (1) //erase multiple sector int HDL_Flash_DFlash_EraseMultiSectors(UINT32 startGlobalAddr, UINT32 endGlobalAddr); //program multiple phrases int HDL_Flash_DFlash_ProgramMultiSectors(UINT32 globalAddr, UINT8 * pData,UINT16 dataLength); //erase multiple sector int HDL_Flash_PFlash_EraseMultiSectors(UINT32 startGlobalAddr, UINT32 endGlobalAddr); //program multiple phrases int HDL_Flash_PFlash_ProgramMultiSectors(UINT32 globalAddr, UINT8 * pData,UINT16 dataLength); #endif flash.c #include #include "derivative.h" /* derivative-specific definitions */ #include "Typedefs.h" #include "flash.h" #include "string.h" /* 默認(rèn)情況下(ROMHM=0 RAMHM=0)Global Memory Map 如下: 0x000000-0x0007FF Registers 2KB 0x000800-0x000FFF 2K RAM , 擴(kuò)展空間CS3 0x001000-0x0FDFFF 253*4K Paged RAM 0x0FE000-0x0FFFFF 8K RAM(2*4K) 0x100000-0x13FBFF 255*1K Paged EEPROM 0x100000-0x1003FF 1K (EPAGE 0x00) …… 0x103C00-0x103FFF 1K (EPAGE 0x1F) --- 0x13F000-0x13F3FF 1K (EPAGE 0xFC) -- 0x13F400-0x13F7FF 1K (EPAGE 0xFD) | RAM Bufferd 0x13F800-0x13FBFF 1K (EPAGE 0xFE) | 0x13FC00-0x13FFFF 1K EEPROM(EPAGE 0xFF) -- 0x140000-0x1FFFFF 擴(kuò)展空間CS2 0x200000-0x3FFFFF 擴(kuò)展空間CS1 0x400000-0x7F3FFF 253*16K Paged Flash, 擴(kuò)展空間CS0 0x700000-0x73FFFF B3(256KB) 0x740000-0x77FFFF B2(256KB) 0x780000-0x79FFFF B1S(128KB) 0x7A0000-0x7BFFFF B1N(128KB) 0x7C0000-0x7F3FFF B0(208KB) 0x7F4000-0x7F7FFF 16KB Flash(PPAGE 0xFD) 0x7F4000-0x7F7FFF B0(16KB) 0x7F8000-0x7FBFFF 16KB Flash(PPAGE 0xFE) 0x7F8000-0x7FBFFF B0(16KB) 0x7FC000-0x7FFFFF 16KB Flash(PPAGE 0xFF) 0x7FC000-0x7FFFFF B0(16KB) */ /**** P-Flash and D-Flash Commands ****/ #define ERASE_VERIFY_ALL_BLOCKS 0x01 /* Verify that all program and data Flash blocks are erased. */ /* CCOBIX end = 0 */ /* CCOB Params - NONE */ /* MGSTAT set if fault */ #define ERASE_VERIFY_BLOCK 0x02 /* Verify that a Flash block is erased. */ /* CCOBIX end = 0 */ /* CCOB Params - gpage */ /* MGSTAT set if fault */ #define ERASE_ALL_BLOCKS 0x08 /* Erase all program and data Flash blocks. An erase of all Flash blocks is only possible when the FPLDIS, FPHDIS, and FPOPEN bits in the FPROT register and the EPDIS and EPOPEN bits in the EPROM register are set prior to launching the command. */ /* CCOBIX end = 0 */ /* CCOB Params - NONE */ /* MGSTAT set if fault, FPVIOL / ACCERR set where appropriate */ #define UNSECURE_FLASH 0x0B /*Supports a method of releasing MCU security by erasing all program and data Flash blocks and verifying that all program and data Flash blocks are erased. */ /* CCOBIX end = 0 */ /* CCOB Params - NONE */ /* MGSTAT set if fault */ #define SET_USER_MARGIN_LEVEL 0x0D /*Specifies a user margin read level for all program Flash blocks. */ /* CCOBIX end = 1 */ /* CCOB Params - gpage, level setting (0-2) in CCOB[1] */ /* ACCERR set if invalid level */ #define SET_FIELD_MARGIN_LEVEL 0x0E /*Specifies a field margin read level for all program Flash blocks (special modes only). */ /* CCOBIX end = 1 */ /* CCOB Params - gpage, level setting (0-4) in CCOB[1] */ /* ACCERR set if invalid level */ /*-------------------------------*/ /* **** P-Flash Only Commands ****/ #define ERASE_VERIFY_P_FLASH_SECTION 0x03 /*Verify that a given number of words starting at the address provided are erased. */ /* CCOBIX end = 2 */ /* CCOB Params - global address, number of phrases in CCOB[2]*/
上一篇:【飛思卡爾 MC9S12】?jī)?nèi)部Flash讀寫(xiě)
下一篇:【飛思卡爾 MC9S12】BootLoader 下位機(jī)
推薦閱讀最新更新時(shí)間:2025-05-27 00:46


- 熱門(mén)資源推薦
- 熱門(mén)放大器推薦
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無(wú)線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開(kāi)發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹(shù)莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁(yè)和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- L7806A 固定輸出穩(wěn)壓器的典型應(yīng)用
- 帶時(shí)鐘的觸摸調(diào)光臺(tái)燈
- 【課程設(shè)計(jì)】液位控制系統(tǒng)
- 使用 Analog Devices 的 LTC2900 的參考設(shè)計(jì)
- 使用 ON Semiconductor 的 NCP1216A 的參考設(shè)計(jì)
- 使用 NXP Semiconductors 的 ISP1161 的參考設(shè)計(jì)
- 用于 1.2V 和 1V 輸出跟蹤的 LTM4628EY DC/DC 模塊穩(wěn)壓器的典型應(yīng)用電路
- USB3.0讀卡器,基于GL3224方案,設(shè)有SD卡與TF卡卡槽
- LTM4643IV 2.375V 至 5V 輸入、四路 1V、1.2V、1.5V、1.8V 輸出降壓穩(wěn)壓器的典型應(yīng)用
- L7885C 高輸入輸出穩(wěn)壓器的典型應(yīng)用
- 磁翻板液位計(jì)選購(gòu)指南
- 瑞薩電子推出全新RA4入門(mén)級(jí)產(chǎn)品群,通過(guò)平衡的低功耗性能
- 新思科技解決方案獲三星5nm、4nm和3nm工藝認(rèn)證
- 為什么說(shuō)PHEV還有各種架構(gòu)之分?其中又有何優(yōu)缺點(diǎn)?
- 奧托立夫?yàn)镹uro的自動(dòng)駕駛汽車(chē)搭載外部安全氣囊 保護(hù)弱勢(shì)道路使用者
- 示波器測(cè)不到波形真的是壞了嗎
- 瑞薩電子發(fā)布首顆22納米微控制器樣片
- 給癌細(xì)胞植入“特洛伊木馬”,機(jī)械納米手術(shù)或改善腦癌治療
- 虹科脈沖發(fā)生器在讀出電子測(cè)試中的應(yīng)用
- 臺(tái)積電計(jì)劃兩年后停止氮化鎵晶圓生產(chǎn),納微轉(zhuǎn)投力積電
- 研華新品搭載最新 AMD Ryzen 嵌入式 8000 系列處理器,驅(qū)動(dòng)AI 智能新篇章
- 美國(guó)EDA恢復(fù)供應(yīng)?
- 從追趕到超越:的盧深視的“AI +三維機(jī)器視覺(jué)“破局之戰(zhàn)
- 常用的音頻處理器有哪些應(yīng)用場(chǎng)景
- 研究顯示2035年全球酒店服務(wù)機(jī)器人市場(chǎng)規(guī)模有望達(dá)125億美元
- i9-14900HX對(duì)比一款換湯不換藥的馬甲老U R9-8945HX
- 納祥科技2W 24位數(shù)字功放NX4920,可用于AI語(yǔ)音播報(bào)、WIFI播放器
- 常用解調(diào)器的定義和工作原理
- 從性能與網(wǎng)絡(luò)傳輸出發(fā),講講鐵威馬MAX系列為什么一騎絕塵
- 24課:動(dòng)態(tài)掃描顯示接口電路及程序
- 23課:LED數(shù)碼管靜態(tài)顯示接口與編程
- 22課:單片機(jī)串行口通信程序設(shè)計(jì)
- 21課:單片機(jī)串行口介紹
- 20課:單片機(jī)定時(shí)/計(jì)數(shù)器實(shí)驗(yàn)
- 海爾“無(wú)外桶”免清洗洗護(hù)方案_原創(chuàng)才是實(shí)力
- AWE2018知名家電企業(yè)亮相_智慧生活與智能家電品牌之戰(zhàn)打響
- 基于STC單片機(jī)的ISP下載線設(shè)計(jì)
- 中國(guó)家電產(chǎn)業(yè)的絢爛多姿_以家電為中心的科技盛宴AWE
- 洗碗機(jī)烤箱等家電興起_智能廚電趨勢(shì)新格局