上一篇講到內部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 下位機
推薦閱讀
史海拾趣
設計資源 培訓 開發(fā)板 精華推薦
- Microchip 升級數(shù)字信號控制器(DSC)產品線 推出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使用測試
- 線下研討會|MATLAB助力人工智能與電子產品的開發(fā)
- ADI 痛點問題探索季:征集 | 曬電機控制痛點與難題,一起尋求最優(yōu)解!
- 2024 瑞薩電子MCU/MPU工業(yè)技術研討會——深圳、上海站
- Littelfuse 高效 • 可靠 • 精準的功率控制和電路保護方案在工業(yè)、交通、通訊、醫(yī)療及新能源中的應用
- 有獎直播|大唐恩智浦半導體 | 電池管理芯片方案設計和注意事項
- 感謝有你,感恩龍年,EEWORLD陪你一起“鬧”龍年!
- 國產FPGA有獎直播:安路全新FPSoC產品SF1系列(FPGA+MCU),Demo板介紹和案例解析
- 嵌入式Rust修煉營直播(第二場):MCU上電后,Rust代碼啟動流程解析
- 幸運十一月,器件購買e問e答!
- EEWORLD E金礦榮耀登場!為夢想加分!