<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STC15F2K60S2單片機內部EEPROM讀寫操作的介紹

冬至子 ? 來源:清晨的小樹洞 ? 作者:清晨微風 ? 2023-11-08 17:41 ? 次閱讀

一、STC15F2K60S2單片機內部EEPROM的介紹

STC15系列單片機內部集成了大容量的EEPROM,其與程序空間是分開的。利用ISP/IAP技術可將內部Date Flash當EEPROM,擦寫次數在10萬次以上。EEPROM可分為若干個扇區,每個扇區包含512個字節。使用時,建議同一次修改的數據放在同一個扇區,不是同一次修改的數據放在不同的扇區,不一定要用滿。數據存儲器的擦出操作是按扇區進行的。

EEPROM可用于保存一些需要在應用過程中修改并且掉電不丟失的參數數據。在用戶程序中,可以對EEPROM進行字節讀/字節編程/扇區擦除操作。在工作電壓Vcc偏低時,建議不要進行EEPROM/IAP操作。

圖片

圖1 STC15F2K60S2系列EEPROM空間大小及地址圖

注:以上內容選自STC15系列單片機官方指南書。

通過對STC15系列單片機官方指南書的查閱可知,IAP15系列除外,STC15F2K60S2系列單片機可通過圖1的地址空間開始對其內部EEPROM進行數據的讀寫,而IAP15系列可在用戶應用程序區修改用戶應用程序區,一般從結束扇區末尾地址開始計算。

后面將會給出STC15系列單片機內部EEPROM的驅動程序,只需要調用EEPROM_Read(UINT16 eeprom_address,UINT8 *data_address,UINT8 length)和EEPROM_Write(UINT16 eeprom_address,UINT8 *data_address,UINT8 length)兩個函數即可。

二、STC15F2K60S2內部EEPROM讀寫的驅動程序

1.頭文件

#ifndef EEPROM_H

#define EEPROM_H

#include "STC15F2K60S2.h"

#include

#ifndef UINT8

#define UINT8 unsigned char

#endif

#ifndef UINT16

#define UINT16 unsigned int

#endif

#ifndef EEPROM_BUFFER_LENGTH

#define EEPROM_BUFFER_LENGTH 128 //數據保護緩沖長度

#endif

#define ISP_STANDBY() ISP_CMD = 0 //ISP空閑命令(禁止)

#define ISP_READ() ISP_CMD = 1 //ISP讀出命令

#define ISP_WRITE() ISP_CMD = 2 //ISP寫入命令

#define ISP_ERASE() ISP_CMD = 3 //ISP擦除命令

//sfr ISP_TRIG = 0xC6;

#define ISP_TRIG() ISP_TRIG = 0x5A, ISP_TRIG = 0xA5 //ISP觸發命令

// 7 6 5 4 3 2 1 0 Reset Value

//sfr IAP_CONTR = 0xC7; IAPEN SWBS SWRST CFAIL - WT2 WT1 WT0 0000,x000 //IAP Control Register

#define ISP_EN (1<<7)

#define ISP_SWBS (1<<6)

#define ISP_SWRST (1<<5)

#define ISP_CMD_FAIL (1<<4)

#define ISP_WAIT_1MHZ 7

#define ISP_WAIT_2MHZ 6

#define ISP_WAIT_3MHZ 5

#define ISP_WAIT_6MHZ 4

#define ISP_WAIT_12MHZ 3

#define ISP_WAIT_20MHZ 2

#define ISP_WAIT_24MHZ 1

#define ISP_WAIT_30MHZ 0

#if (MAIN_Fosc >= 24000000L)

#define            ISP_WAIT_FREQUENCY  ISP_WAIT_30MHZ

#elif (MAIN_Fosc >= 20000000L)

#define            ISP_WAIT_FREQUENCY  ISP_WAIT_24MHZ

#elif (MAIN_Fosc >= 12000000L)

#define            ISP_WAIT_FREQUENCY  ISP_WAIT_20MHZ

#elif (MAIN_Fosc >= 6000000L)

#define            ISP_WAIT_FREQUENCY  ISP_WAIT_12MHZ

#elif (MAIN_Fosc >= 3000000L)

#define            ISP_WAIT_FREQUENCY  ISP_WAIT_6MHZ

#elif (MAIN_Fosc >= 2000000L)

#define            ISP_WAIT_FREQUENCY  ISP_WAIT_3MHZ

#elif (MAIN_Fosc >= 1000000L)

#define            ISP_WAIT_FREQUENCY  ISP_WAIT_2MHZ

#else

#define            ISP_WAIT_FREQUENCY  ISP_WAIT_1MHZ

#endif

sfr ISP_DATA = 0xC2;

sfr ISP_ADDRH = 0xC3;

sfr ISP_ADDRL = 0xC4;

sfr ISP_CMD = 0xC5;

sfr ISP_TRIG = 0xC6;

sfr ISP_CONTR = 0xC7;

//定義特殊功能寄存器

void EEPROM_Disable();//關閉eeprom讀寫

void EEPROM_SectorErase(UINT16 eeprom_address);//扇區擦除

void EEPROM_Read(UINT16 eeprom_address,UINT8*data_address,UINT8 length);//讀數據

void EEPROM_Write(UINT16 eeprom_address,UINT8*data_address,UINT8 length);//寫數據

#endif

2.主程序

#include "EEPROM.h"

//STC系列的內置EEPROM讀寫程序。

/************************************************************************

*STC15F2K60S2的EEPROM空間地址范圍:0x0000 - 0x03FF (IAP字節讀取)(1K)

*使用例程:

EEPROM_Read(0x0000,medication_lost_warning_phone_3,12);

    EEPROM_Write(0x0000,medication_lost_warning_phone_3,12);

*************************************************************************/

//========================================================================

// 函數: void EEPROM_Disable()

// 描述: 禁止訪問ISP/IAP.

// 參數: non.

// 返回: non.

//========================================================================

void EEPROM_Disable()

{

ISP_CONTR= 0;                 //禁止ISP/IAP操作

    ISP_CMD   = 0;                 //去除ISP/IAP命令

    ISP_TRIG  = 0;                   //防止ISP/IAP命令誤觸發

    ISP_ADDRH= 0xff;            //清0地址高字節

    ISP_ADDRL= 0xff;             //清0地址低字節,指向非EEPROM區,防止誤操作

}

//========================================================================

// 函數: void EEPROM_Read(UINT16 eeprom_address,UINT8 *data_address,UINT8 length)

// 描述: 從指定EEPROM首地址讀出n個字節放指定的緩沖.

// 參數: eeprom_address: 讀出EEPROM的首地址.

// data_address: 讀出數據放緩沖的首地址.

// length: 讀出的字節長度.

// 返回: non.

//========================================================================

void EEPROM_Read(UINT16 eeprom_address,UINT8*data_address,UINT8 length)

{

EA =0;           //禁止中斷

    ET0 =0;

    ISP_CONTR= (ISP_EN + 3);     //設置等待時間,允許ISP/IAP操作,送一次就夠

    ISP_READ();                                                               //送字節讀命令,命令不需改變時,不需重新送命令

    do

    {

            ISP_ADDRH= eeprom_address / 256;              //送地址高字節(地址需要改變時才需重新送地址)

            ISP_ADDRL= eeprom_address % 256;             //送地址低字節

            ISP_TRIG();                                                 //先送5AH,再送A5H到ISP/IAP觸發寄存器,每次都需要如此

                                                                                 //送完A5H后,ISP/IAP命令立即被觸發啟動

                                                                                 //CPU等待IAP完成后,才會繼續執行程序。

            _nop_();

            *data_address= ISP_DATA;                       //讀出的數據送往

            eeprom_address++;

            data_address++;

    }while(--length);



    EEPROM_Disable();

    EA =1;           //重新允許中斷

    ET0 =1;

}

//========================================================================

// 函數: void EEPROM_SectorErase(UINT16 eeprom_address)

// 描述: 把指定地址的EEPROM扇區擦除.

// 參數: eeprom_address: 要擦除的扇區EEPROM的地址.

// 返回: non.

//========================================================================

void EEPROM_SectorErase(UINT16 eeprom_address)

{

EA =0;           //禁止中斷

    ET0 =0;

                                                                                 //只有扇區擦除,沒有字節擦除,512字節/扇區。

                                                                                 //扇區中任意一個字節地址都是扇區地址。

    ISP_ADDRH= eeprom_address / 256;                      //送扇區地址高字節(地址需要改變時才需重新送地址)

    ISP_ADDRL= eeprom_address % 256;                    //送扇區地址低字節

    ISP_CONTR= (ISP_EN + 3);     //設置等待時間,允許ISP/IAP操作,送一次就夠

    ISP_ERASE();                                                     //送扇區擦除命令,命令不需改變時,不需重新送命令

    ISP_TRIG();

    _nop_();

    EEPROM_Disable();

    EA =1;           //重新允許中斷

    ET0 =1;

}

//========================================================================

// 函數: void EEPROM_Write(UINT16 eeprom_address,UINT8 *data_address,UINT8 length)

// 描述: 把緩沖的n個字節寫入指定首地址的EEPROM.

// 參數: eeprom_address: 寫入EEPROM的首地址.

// data_address: 寫入源數據的緩沖的首地址.

// length: 寫入的字節長度.

// 返回: non.

//========================================================================

void EEPROM_Write(UINT16 eeprom_address,UINT8*data_address,UINT8 length)

{

UINT8  sector_location;//待寫入數據在扇區內的起始地址

    UINT8  xdata data_buffer[EEPROM_BUFFER_LENGTH];

    UINT16i;

   

    sector_location= (UINT8)(eeprom_address & 0x01ff);

    eeprom_address&= 0xfe00;

   

    EEPROM_Read(eeprom_address,data_buffer,EEPROM_BUFFER_LENGTH);

   

    for(i=0;i< length; i++)

    {

            data_buffer[sector_location+i]= data_address[i];

    }

   

    EEPROM_SectorErase(eeprom_address);

    length= EEPROM_BUFFER_LENGTH;

    data_address= data_buffer;

   

    EA =0;           //禁止中斷

    ET0 =0;



    ISP_CONTR= (ISP_EN + 3);     //設置等待時間,允許ISP/IAP操作,送一次就夠

    ISP_WRITE();                                                     //送字節寫命令,命令不需改變時,不需重新送命令

    do

    {

            ISP_ADDRH= eeprom_address / 256;              //送地址高字節(地址需要改變時才需重新送地址)

            ISP_ADDRL= eeprom_address % 256;             //送地址低字節

            ISP_DATA  = *data_address;                     //送數據到ISP_DATA,只有數據改變時才需重新送

            ISP_TRIG();

            _nop_();

            eeprom_address++;

            data_address++;

    }while(--length);



    EEPROM_Disable();

    EA =1;           //重新允許中斷

    ET0 =1;

}

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 驅動器
    +關注

    關注

    51

    文章

    7570

    瀏覽量

    143638
  • EEPROM
    +關注

    關注

    9

    文章

    930

    瀏覽量

    80626
  • STC15F2K60S2
    +關注

    關注

    9

    文章

    25

    瀏覽量

    17200
  • Flash存儲
    +關注

    關注

    0

    文章

    38

    瀏覽量

    8254
  • 數據存儲器
    +關注

    關注

    1

    文章

    68

    瀏覽量

    17729
收藏 人收藏

    評論

    相關推薦

    STC15F2K60S2 無法下載程序??偸钦f“內部振蕩器的頻率未調...

    正在檢測目標單片機 ... 單片機型號: STC15F2K60S2固件版本號: 7.1.1S當前芯片的硬件選項為:. 下次冷啟動后系統時鐘源為內部
    發表于 06-23 00:22

    STC15F2K60S2,LCD1602無法顯示問題求助??!

    采用傳統51單片機STC89C52可以正常顯示。但是,換用STC增強型STC15F2K60S2后卻不能使LCD1602正常顯示,不清楚是為什么?求高手指教!
    發表于 08-12 10:29

    請教stc15f2k60s2驅動tft彩屏的問題。

    小弟將在89C51能正常運行的tft顯示代碼直接移到stc15f2k60s2單片機上,屏幕不能正常顯示。請問是不是哪個地方需要延時?
    發表于 09-02 10:08

    stc15f2k60s2單片機(自帶8路AD)內部是否有采樣保持電路

    哪位大神解惑下,stc15f2k60s2單片機(自帶8路AD)內部是否有采樣保持電路
    發表于 05-20 17:20

    stc15F2K60S2單片機支持float類型嗎?

    這幾天使用STC15F2K60S2單片機,發現當變量定義為float類型時,程序就會卡死,請問這是不是因為此款單片機不支持浮點數運算,有用過的朋友說一下吧。
    發表于 12-12 13:16

    使用單片機STC15F2K60S2制作的888光立方

    使用單片機STC15F2K60S2制作的888光立方
    發表于 03-09 12:26

    STC15F2K60S2系列學習板電路圖資料分享

    本次分享的是來自STC官網的STC15F2K60S2系列學習板-32KSRAM電路圖。STC15F2K60S2單片機是一種增強型的8051單片機
    發表于 11-09 14:30

    STC15F2K60S2單片機入門:編寫頭文件 精選資料分享

    單片機入門:頭文件包含引言具體操作引言軟件知識小白,分享單片機入門的一些經驗知識問題描述在STC15F2K60S2單片機開發使用過程中,常常
    發表于 07-15 09:25

    怎樣去搭建一種stc15f2k60s2單片機開發環境

    stc15f2k60s2單片機開發環境構建?時間:2020-12-22開發環境構建… 11.開發軟件… 21.1.Keil5… 22.問題1:keil軟件工程包沒有STC15F2K60S2芯片的資源包,所以構建項目工程文件會失敗
    發表于 07-29 09:25

    STC15F2K60S2的PWM怎么實現?

    STC15F2K60S2的PWM怎么實現?基于STC15F2K60S2的智能循跡小車硬件電機控制代碼分享
    發表于 09-24 07:11

    STC15F2K60S2單片機的特點有哪些呢

    STC15F2K60S2單片機是什么?STC15F2K60S2單片機的特點有哪些呢?
    發表于 11-03 07:56

    STC15F2K60S2具有哪些引腳功能?

    STC15F2K60S2具有哪些引腳功能?STC15F2K60S2單片機內部結構由哪幾部分組成?
    發表于 11-09 07:13

    如何利用STC15F2K60S2點亮一個LED燈

    STC15F2K60S2單片機評估版開發日志①
    發表于 11-18 06:48

    STC15F2K60S2單片機評估版開發日志

    STC15F2K60S2單片機評估版開發日志②
    發表于 11-25 08:33

    STC15F2K60S2單片機評估版的相關資料分享

    STC15F2K60S2單片機評估版開發日志③
    發表于 12-06 07:38
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>