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

【飛思卡爾 MC9S12】內(nèi)部D-Flash模擬EEPROM

發(fā)布者:美好未來最新更新時間:2020-05-17 來源: eefocus關(guān)鍵字:飛思卡爾  MC9S12  內(nèi)部D-Flash  模擬EEPROM 手機看文章 掃描二維碼
隨時隨地手機看文章

上一篇講到內(nèi)部Flash的讀寫,本篇講述使用D-Flash模擬EEPROM。其實使用P-Flash也可以模擬,只不過D-Flash的Page更?。ú脸龔蛯懻加酶贂r間),而且不會占用代碼空間。


最近剛換工作,一直比較忙,更新會比較慢。若是需要源碼可自行下載:https://download.csdn.net/download/u010875635/11435913


沒有積分可以自己新建工程,下面的代碼基本可以直接使用。


本篇關(guān)于Flash讀寫就不在贅述,跟PFlash除了Sector大小和指令不同,其余一致,后面直接貼出代碼。


模擬EEPROM其實就是模擬其單字節(jié)讀寫功能,原理就是要修改某個Sector內(nèi)某個字節(jié)的數(shù)據(jù)時,先讀出這個扇區(qū)內(nèi)所有數(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中內(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; 

     }

     

        

        

     //更新要寫入的內(nèi)容

     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]
關(guān)鍵字:飛思卡爾  MC9S12  內(nèi)部D-Flash  模擬EEPROM 引用地址:【飛思卡爾 MC9S12】內(nèi)部D-Flash模擬EEPROM

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

推薦閱讀最新更新時間:2025-05-27 00:46

飛思卡爾芯片k66單片機溢出_PWM 初試溢出中斷
/*****************頭文件****************************************/ #include /* for EnableInterrupts macro */ #include derivative.h /* include peripheral declarations */ /*********************變量和函數(shù)定義****************************/ void PWMInit(void); void delay(long ); /*********************主函數(shù)*******************
[單片機]
freescale MC9S12G128 中斷代碼實現(xiàn)方法
寫法1: 中斷函數(shù)指明中斷向量號: main.c #pragma CODE_SEG __NEAR_SEG NON_BANKED interrupt 中斷向量號 void 中斷服務函數(shù)名(void) { // 中斷服務程序代碼段 } #pragma CODE_SEG DEFAULT 中斷向量號在mc9s12g128.h文件里有定義,如: /**************** interrupt vector numbers ****************/ #define VectorNumber_Vportj 24U 寫法2: 修改prm文件,在Project.prm文件聲明中斷函數(shù): main.c: #pragma CODE
[單片機]
飛思卡爾16位單片機(十一)—— 數(shù)碼管動態(tài)掃描測試
一、數(shù)碼管掃描介紹 這個實驗是我們對GPIO輸出功能的一個擴展,用GPIO驅(qū)動數(shù)碼管進行動態(tài)掃描,達到顯示數(shù)字的目的。本實驗的硬件電路采用一個4位8段共陰數(shù)碼管。 所謂“4位”指的是數(shù)碼管上有4個子單元。每個子單元如下圖所示。 所謂“8段”指的是每個子單元由8個發(fā)光二極管組成,如上圖所示,八段分別為:A、B、C、D、E、F、G、DP。 數(shù)碼管按照連接方式可以分為共陰數(shù)碼管和共陽數(shù)碼管。二者的區(qū)別在于每一位的8個發(fā)光二極管是陰極連接在一起還是陽極連接在一起。共陰數(shù)碼管的陰極連接在一起,共陽數(shù)碼管的陽極連接在一起。 共陰數(shù)碼管的內(nèi)部原理圖如下圖所示。 數(shù)碼管的管腳圖如下圖所示。
[單片機]
<font color='red'>飛思卡爾</font>16位單片機(十一)—— 數(shù)碼管動態(tài)掃描測試
基于Freescale Kinetis L系列的故障指示器方案
方案簡介 線路故障指示器是一種安裝在架空線路上、電力電纜及開關(guān)柜母線排上,用于指示故障電流通路的裝置。一旦線路發(fā)生短路,巡線人員可借助指示器上的紅色報警顯示,迅速確定故障區(qū)段、分支、及故障點。但傳統(tǒng)故障指示器查找故障還必須依靠人力從變電站開始一部分一部分的查看,自動化水平不高,本方案采用無線通訊方式,將現(xiàn)場的故障指示器的信息送給監(jiān)控中心(如配電管理系統(tǒng)),實時監(jiān)測線路的各種運行狀態(tài),進一步提高故障處理能力,縮短處理時間。國家電網(wǎng)在未來三年(2015-2017年)計劃投入1200億人民幣用于電網(wǎng)改造,主要針D,E類用戶(郊區(qū)及農(nóng)村),200億投入于配電自動化改造。在這個時機,國網(wǎng)電科院討論制定了國家電網(wǎng)公司企業(yè)標準:配電線路故障監(jiān)測
[單片機]
基于<font color='red'>Freescale</font> Kinetis L系列的故障指示器方案
飛思卡爾那些事之pwm輸出控制伺服電機轉(zhuǎn)向
資源: 1、伺服電機。PWM輸出周期在一定范圍內(nèi),舵機的轉(zhuǎn)向會和PWM的占空比成正比例關(guān)系。 2、HCS12的PWM輸出。 方案: 1、HCS12中的PWM模塊,通過硬件進行PWM輸出。 2、HCS12中的ECT的比較輸出模塊,通過比較輸出進行PWM的輸出。 鑒于PWM模塊為輸出PWM專用模塊,通過設置相應寄存器即可實現(xiàn)PWM輸出,簡單方便,而且精確。故選用PWM模塊進行PWM輸出。 說明: 1、通過PWM控制舵機的轉(zhuǎn)角,舵機接口一般為3根線,黑色地線,紅色為電源線,一般采用4.8V和6V兩種標準。另外一根線為控制信號線。 2、通過級聯(lián)方式實現(xiàn)16位PWM輸出。 3、周期為18MS~20MS即輸出周期為56Hz~50Hz。 4、對齊
[單片機]
飛思卡爾進一步擴展其系統(tǒng)電源管理產(chǎn)品組合
支持QorIQ LS1處理器,確保物聯(lián)網(wǎng)安全。VR500多輸出降壓式穩(wěn)壓器為連接新一代互連產(chǎn)品的高安全性新型IoT網(wǎng)關(guān)供電。 2014年11月11日,(electronica 2014)慕尼黑訊 –飛思卡爾半導體日前宣布推出高效的VR500穩(wěn)壓器,擴展其系統(tǒng)電源管理產(chǎn)品組合,為行業(yè)領(lǐng)先的嵌入式網(wǎng)絡產(chǎn)品系列的重要成員提供支持。該產(chǎn)品經(jīng)過特殊設計,專門用于支持采用飛思卡爾QorIQ Layerscape LS1處理器的綜合系統(tǒng)解決方案,實現(xiàn)包括物聯(lián)網(wǎng)安全基礎設施設備在內(nèi)的各種應用。這款產(chǎn)品現(xiàn)已開始供貨。 VR500是飛思卡爾日益擴大的系統(tǒng)電源管理產(chǎn)品組合中的新產(chǎn)品。該電源管理組合里的解決方案對早已普及的飛思卡爾微處理器
[物聯(lián)網(wǎng)]
FTF論壇:飛思卡爾展示最新汽車電子技術(shù)
??? 2014年5月20日,飛思卡爾半導體(Freescale Semiconductor)主辦的飛思卡爾技術(shù)論壇(FTF)中國站在深圳舉辦。 ??? 論壇開幕演講中,飛思卡爾總裁兼CEO Gregg Lowe講述了飛思卡爾對于融合了大數(shù)據(jù)、安全性和云計算的智能互聯(lián)新世界的展望,并在此后環(huán)節(jié)中展現(xiàn)了多項創(chuàng)新技術(shù)。 ??? 例如,飛思卡爾為比亞迪秦電動車搭載了遙控駕駛、全景影像等多項行業(yè)領(lǐng)先的電子化配置。還可通過車中的云服務3G集成網(wǎng),實現(xiàn)人對車輛的遠程控制,通過手機終端可遠程預約開啟空調(diào)、解鎖及車輛上鎖、定位車輛位置及查詢車輛運行狀況等。 聯(lián)網(wǎng)設備數(shù)量激增 ??? 2010年,連網(wǎng)設備數(shù)已超過全球人口總量。
[汽車電子]
飛思卡爾推出工業(yè)級32位微控制器
飛思卡爾半導體推出業(yè)界首款基于ARM? Cortex?-M0+處理器的5V 32位MCU。全新Kinetis E系列MCU具有強大的系統(tǒng)電磁抗噪能力(過去只有8位和16位MCU具有這種能力),如白色家電 和工業(yè)應用,同時提供高效率和最佳代碼密度。 全新的Kinetis E系列產(chǎn)品是洗碗機、冰箱、家庭和樓宇控制系統(tǒng)、電機控制風機、工業(yè)轉(zhuǎn)換器以及通常在高噪聲環(huán)境中運行的其他設備等應用的理想選擇。利用這些器件的耐用設計和32位處理能力,系統(tǒng)設計人員可以只采用一個器件,而不是以前所需的多個MCU。此外,大間距封裝選件和高靜電放電保護性能支持單層板設計,減少其他電路保護組件的需求,從而降低系統(tǒng)成本。 飛思卡爾MCU業(yè)務部營銷和業(yè)務開發(fā)
[單片機]
小廣播
設計資源 培訓 開發(fā)板 精華推薦

最新單片機文章
隨便看看

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

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