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

【飛思卡爾 MC9S12】?jī)?nèi)部D-Flash模擬EEPROM

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

上一篇講到內(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       /* 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; 

     }

     

        

        

     //更新要寫(xiě)入的內(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"

 

 

/*

默認(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]*/

[1] [2] [3] [4]
關(guān)鍵字:飛思卡爾  MC9S12  內(nèi)部D-Flash  模擬EEPROM 引用地址:【飛思卡爾 MC9S12】?jī)?nèi)部D-Flash模擬EEPROM

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

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

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

最新單片機(jī)文章
隨便看看

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車(chē)開(kāi)發(fā)圈

 
機(jī)器人開(kāi)發(fā)圈

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