久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5902|回復: 0
打印 上一主題 下一主題
收起左側

stc單片機IAP讀寫規則

[復制鏈接]
跳轉到指定樓層
樓主
ID:26188 發表于 2015-2-18 00:58 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/*IAP讀寫規則******************************************
1:EEPROM讀取沒有規則,按地址讀取就可以了.
2:并不需要按地址順序讀取和寫入,兩種操作都可以設置隨機地址.
3:除非進行IAP過程,否則寫入EEPROM的數據即使在刷程序后仍然存
在.
4:寫操作時,如果當前地址已經寫入過一次,則沒有進行擦除操作時
,寫操作將在原數據上疊加,結果會造成讀取錯誤.
5:擦除操作的地址是扇區地址,而非字節地址,例如60S2有兩個扇區
,擦除0x0000H將擦除從0x0000H到0x01FFH的所有512字節數據擦
除0x0001H將擦除從0x0200H到0x03FFH地址內的所有數據
******************************************************/
#include "intrins.h"
//IAP相關端口定義(備忘,不須寫)
/*
sfr  IAP_DATA   = 0xC2;      //Flash 數據寄存器
sfr  IAP_ADDRH  = 0xC3;      //Flash 高位地址
sfr  IAP_ADDRL  = 0xC4;      //Flash 低位地址
sfr  IAP_CMD    = 0xC5;      //Flash 命令寄存器
sfr  IAP_TRIG   = 0xC6;      //Flash 命令觸發
sfr  IAP_CONTR  = 0xC7;      //Flash 控制寄存器
*/
//IAP命令常數
#define   CMD_IDLE      0    //待機
#define   CMD_READ      1    //位-讀
#define   CMD_WRITE     2    //位-程序
#define   CMD_ERASE     3    //扇區-擦除
//IAP時間常數
#define   ENABLE_IAP   0x80    //如果系統時鐘<30MHz
//#define   ENABLE_IAP   0x81    //如果系統時鐘<24MHz
//#define   ENABLE_IAP   0x82    //如果系統時鐘<20MHz
//#define   ENABLE_IAP   0x83    //如果系統時鐘<12MHz
//#define   ENABLE_IAP   0x84    //如果系統時鐘<6MHz
//#define   ENABLE_IAP   0x85    //如果系統時鐘<3MHz
//#define   ENABLE_IAP   0x86    //如果系統時鐘<2MHz
//#define   ENABLE_IAP   0x87    //如果系統時鐘<1MHz
#define    IAP_ADDRESS   0x0000  //STC12C5A60S2 系列 EEPROM 起點地址
//void Delay(unsigned char n);
void IapIdle();                                          //退出IAP過程
unsigned char IapReadByte(unsigned int addr);            //IAP讀
void IapWriteByte(unsigned int addr, unsigned char dat); //IAP寫
void IapEraseSector(unsigned int addr);                  //擦除扇區
/**********************************************************
** 函數名稱: void IapIdle();
** 功能描述: 退出IAP過程
**********************************************************/
void IapIdle()
{
    IAP_CONTR = 0;       //關閉 IAP 功能
    IAP_CMD   = 0;       //清除命令寄存器進入待機模式
    IAP_TRIG  = 0;       //清除觸發寄存器
    IAP_ADDRH = 0xFF;    //IAP指針移動到非 EEPROM 區域
    IAP_ADDRL = 0xFF;
}
/**********************************************************
** 函數名稱: unsigned char IapReadByte(unsigned int addr);
** 功能描述: 讀EEPROM
** 輸   入: unsigned int addr  地址
** 輸   出: unsigned char dat  數據
**********************************************************/
unsigned char IapReadByte(unsigned int addr)
{
    unsigned char dat;        //數據緩沖
    IAP_CONTR = ENABLE_IAP;   //打開 IAP 過程, 并設置等待時間
    IAP_CMD   = CMD_READ;     //設置 ISP/IAP/EEPROM 為讀命令
    IAP_ADDRL = addr;         //設置 ISP/IAP/EEPROM 低位地址
    IAP_ADDRH = addr >> 8;    //設置 ISP/IAP/EEPROM 高位地址
    IAP_TRIG  = 0x5a;         //發送觸發命令 1 (0x5a)
    IAP_TRIG  = 0xa5;         //發送觸發命令 2 (0xa5)
    _nop_();                  //MCU 延遲等待 ISP/IAP/EEPROM 作業完成
    _nop_();                  //兼容15F104E一個bug,NOP3次
    _nop_();                  //
    dat = IAP_DATA;           //讀取 ISP/IAP/EEPROM 數據
    IapIdle();                //關閉 ISP/IAP/EEPROM 過程
    return dat;               //返回 Flash 數據
}
/**********************************************************
** 函數名稱: void IapWriteByte(unsigned int addr, unsigned char dat);
** 功能描述: 寫EEPROM扇區
** 輸   入: unsigned int addr  寫地址
             unsigned char dat  寫數據
**********************************************************/
void IapWriteByte(unsigned int addr, unsigned char dat)
{
    IAP_CONTR = ENABLE_IAP;    //打開 IAP 過程, 并設置等待時間
    IAP_CMD   = CMD_WRITE;     //設置 ISP/IAP/EEPROM 為寫命令
    IAP_ADDRL = addr;          //設置 ISP/IAP/EEPROM 低位地址
    IAP_ADDRH = addr >> 8;     //設置 ISP/IAP/EEPROM 高位地址
    IAP_DATA  = dat;           //寫 ISP/IAP/EEPROM 數據
    IAP_TRIG  = 0x5a;          //發送觸發命令 1 (0x5a)
    IAP_TRIG  = 0xa5;          //發送觸發命令 2 (0xa5)
    _nop_();                   //MCU 延遲等待 ISP/IAP/EEPROM 作業完成
    _nop_();                   //兼容15F104E一個bug,NOP3次
    _nop_();                   //
    IapIdle();                 //關閉 ISP/IAP/EEPROM 過程
}
/**********************************************************
** 函數名稱: void IapEraseSector(unsigned int addr);
** 功能描述: 擦除EEPROM扇區
** 輸   入: unsigned int addr 擦除地址
**********************************************************/
void IapEraseSector(unsigned int addr)
{
    IAP_CONTR = ENABLE_IAP;   //打開 IAP 過程, 并設置等待時間
    IAP_CMD   = CMD_ERASE;    //設置 ISP/IAP/EEPROM 為擦除命令
    IAP_ADDRL = addr;         //設置 ISP/IAP/EEPROM 低位地址
    IAP_ADDRH = addr >> 8;    //設置 ISP/IAP/EEPROM 高位地址
    IAP_TRIG  = 0x5a;         //發送觸發命令 1 (0x5a)
    IAP_TRIG  = 0xa5;         //發送觸發命令 2 (0xa5)
    _nop_();                  //MCU 延遲等待 ISP/IAP/EEPROM 作業完成
    _nop_();                  //兼容15F104E一個bug,NOP3次
    _nop_();                  //
    IapIdle();                //關閉 ISP/IAP/EEPROM 過程
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲播放| 日韩在线综合 | 免费成人在线网站 | 久久国产婷婷国产香蕉 | 韩国久久 | 中文字幕成人在线 | 国产精品99久久久久久宅男 | 精品欧美一区免费观看α√ | 黄色国产大片 | 午夜丁香视频在线观看 | 九九热在线免费视频 | 9久久精品 | 狠狠av | 色天堂影院 | 日韩精品在线免费观看视频 | 黄色片网站国产 | 国产精品婷婷 | 国产伦一区二区三区久久 | 欧美精品久久久 | 欧美日韩中文在线 | 精品国产乱码久久久久久蜜臀 | 精品国产伦一区二区三区观看方式 | 欧美视频精品 | 天天爽夜夜爽精品视频婷婷 | 99久久婷婷国产综合精品电影 | 日韩中文字幕高清 | 亚洲精品黑人 | 欧美日韩在线精品 | www.日韩 | 欧美日韩视频在线第一区 | 国产精品1区2区3区 一区中文字幕 | 天堂资源 | 精品毛片在线观看 | 在线看无码的免费网站 | 97精品久久| 成人午夜免费福利视频 | 在线精品一区二区 | 日本一二三区在线观看 | 一级毛片色一级 | 色综合天天天天做夜夜夜夜做 | 国产精品揄拍一区二区久久国内亚洲精 |