国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

歷史上的今天

今天是:2025年05月17日(星期六)

2020年05月17日 | 【飛思卡爾 MC9S12】內部D-Flash模擬EEPROM

發(fā)布者:美好未來 來源: eefocus關鍵字:飛思卡爾  MC9S12  內部D-Flash  模擬EEPROM 手機看文章 掃描二維碼
隨時隨地手機看文章

上一篇講到內部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       /* common defines and macros */

#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        dataContainer[i] =  pNewData[i-startGlobalAddr+sectorStartAddr];

        

     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       /* common defines and macros */

#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]*/

[1] [2] [3] [4]
關鍵字:飛思卡爾  MC9S12  內部D-Flash  模擬EEPROM 引用地址:【飛思卡爾 MC9S12】內部D-Flash模擬EEPROM

上一篇:【飛思卡爾 MC9S12】內部Flash讀寫
下一篇:【飛思卡爾 MC9S12】BootLoader 下位機

推薦閱讀

  眾所周知,2018年1月11日,華為向深圳中級人民法院訴三星侵犯知識產權案一審公開宣判,法院宣判三星立即停止制造、銷售、允諾銷售等方式侵害華為專利權,華為一審勝訴。如不服本判決,三星方面可依法上訴。下面就隨手機便攜小編一起來了解一下相關內容吧?! ?jù)集微網(wǎng)此前報道,美國地方法院法官奧瑞克(William H. Orrick)裁定,三星電子可以繼續(xù)在...
去年摩托羅拉發(fā)布了P30手機,它的情況如下:外觀方面,摩托羅拉P30的機身尺寸為155.5X75.95X7.69mm,重量小于170g,采用了劉海屏的設計,后置豎排雙攝像頭,摩托羅拉的logo與指紋識別鍵合二為一,機身提供極光色、冰玉白、亮黑三種配色。 硬件配置方面,摩托羅拉P30采用了6.2英寸的FHD+IPS屏幕,搭載高通驍龍636處理器,提供6+64GB/6+128GB兩個...
(文章來源:智能制造網(wǎng)) 每當我們談論安全話題,大家總會很有共鳴。因為隨著時代的快速發(fā)展,眼下不僅人們的人身安全面臨著愈發(fā)嚴峻的考驗,同時個人隱私和信息安全也正成為新的威脅。值此背景,再加上恰逢肺炎疫情在全球肆虐,如今人們對于安全話題的關注也是尤為強烈。 而隨著“全國安全教育日”的到來,當前人們對于安全問題的關注更是集中在了中...
調研機構Canalys近日發(fā)布了一份游戲手機市場的報告,報告顯示vivo子品牌iQOO出乎意料的以23%的份額領跑游戲手機市場。在不少人心中,做游戲手機的品牌也就是黑鯊、ROG、紅魔、拯救者這幾個,為何在Canalys的報告中,一加、OPPO等都被統(tǒng)計進去了?從Canalys給出的品牌或者手機型號名單看,無論是iQOO還是Redmi K系列、realme X系列等,它們都在產品的發(fā)布...

史海拾趣

小廣播
設計資源 培訓 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved