上一篇講到內部Flash的讀寫,本篇講述使用D-Flash模擬EEPROM。其實使用P-Flash也可以模擬,只不過D-Flash的Page更?。ú脸龔蛯懻加酶贂r間),而且不會占用代碼空間。
最近剛換工作,一直比較忙,更新會比較慢。若是需要源碼可自行下載:https://download.csdn.net/download/u010875635/11435913
沒有積分可以自己新建工程,下面的代碼基本可以直接使用。
本篇關于Flash讀寫就不在贅述,跟PFlash除了Sector大小和指令不同,其余一致,后面直接貼出代碼。
模擬EEPROM其實就是模擬其單字節(jié)讀寫功能,原理就是要修改某個Sector內某個字節(jié)的數(shù)據(jù)時,先讀出這個扇區(qū)內所有數(shù)據(jù)(256Bytes)到數(shù)組,然后擦除這個Sector,再在RAM中修改那個字節(jié)的數(shù)據(jù),最后將這個數(shù)組寫回該扇區(qū)。修改多字節(jié)數(shù)據(jù)原理相似。
另外大家可以想一下,若是要往EEPROM中寫入跨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中內容 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ū)內容 for(i=0;i readTmpData = (UINT16 *far)(sectorStartAddr+i); dataContainer[i] = ((*readTmpData)>>8)&0xFF; //高位在前 dataContainer[i+1] = (*readTmpData)&0xFF; } //更新要寫入的內容 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" /* 默認情況下(ROMHM=0 RAMHM=0)Global Memory Map 如下: 0x000000-0x0007FF Registers 2KB 0x000800-0x000FFF 2K RAM , 擴展空間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 擴展空間CS2 0x200000-0x3FFFFF 擴展空間CS1 0x400000-0x7F3FFF 253*16K Paged Flash, 擴展空間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】內部Flash讀寫
下一篇:【飛思卡爾 MC9S12】BootLoader 下位機
推薦閱讀最新更新時間:2025-05-27 00:46


設計資源 培訓 開發(fā)板 精華推薦
- Microchip 升級數(shù)字信號控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領先的新器件
- 意法半導體STM32MP23x:突破成本限制的工業(yè)AI應用核心
- 意法半導體推出用于匹配遠距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設置字重-ESP32篇
- 使用樹莓派進行 ESP32 Jtag 調試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- L7806A 固定輸出穩(wěn)壓器的典型應用
- 帶時鐘的觸摸調光臺燈
- 【課程設計】液位控制系統(tǒng)
- 使用 Analog Devices 的 LTC2900 的參考設計
- 使用 ON Semiconductor 的 NCP1216A 的參考設計
- 使用 NXP Semiconductors 的 ISP1161 的參考設計
- 用于 1.2V 和 1V 輸出跟蹤的 LTM4628EY DC/DC 模塊穩(wěn)壓器的典型應用電路
- USB3.0讀卡器,基于GL3224方案,設有SD卡與TF卡卡槽
- LTM4643IV 2.375V 至 5V 輸入、四路 1V、1.2V、1.5V、1.8V 輸出降壓穩(wěn)壓器的典型應用
- L7885C 高輸入輸出穩(wěn)壓器的典型應用
- PCIe M.2接口測試的現(xiàn)狀、挑戰(zhàn)與泰克解決方案
- ABB在中國推出面向電子制造業(yè)的兩大全新機器人系列
- ABB在中國推出PoWa協(xié)作機器人系列
- 西門子 NX 新增 AI 助手等多項功能
- 貿(mào)澤即日起開售適用于數(shù)據(jù)中心和網(wǎng)絡應用的 全新TE Connectivity QSFP 112G SMT連接器
- ABB推出三大全新機器人系列,強化中國機器人市場領導地位
- 新思科技關于美國解除近期對華出口限制的聲明
- Wolfspeed 1700 V MOSFET 技術,助力重塑輔助電源系統(tǒng)的耐用性和成本
- 英飛凌大中華區(qū) 2025 生態(tài)創(chuàng)新峰會,究竟探討了哪些創(chuàng)新與生態(tài)合作?
- Microchip攜手Nippon Chemi-Con和NetVision 打造日本汽車市場首個ASA-ML攝像頭開發(fā)生態(tài)系統(tǒng)