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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51MCU ISP與IAP作用于內部EEPROM

[復制鏈接]
跳轉到指定樓層
樓主
ID:94349 發表于 2015-11-10 02:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
ISP和IAP:
ISP(In SystemProgramable):在系統編程,即在已經焊好的板子上,不用取下就可以對其進行編程。
IAP(In ApplicationProgramable):在應用編程。即片子提供一系列機制,當片子在運行程序時,了以提供一種改變Flash數據的方法。

也即:程序可以自己往程序存儲器里面寫數據或者更改程序,其典型應用就是使用boot或者叫做bootloader的一下段代碼來進行跳轉,從而進行程序的升級。

ISP/IAP相關寄存器列表:

ISP_DATA---ISP/IAP操作時的數據寄存器,包括:
ISP/IAP從Flash讀出的數據放于此處,向Flash寫入的數據也放于此處。

ISP_ADDRH---ISP/IAP操作時的地址寄存器高八位
ISP_ADDRL---ISP/IAP操作時的地址寄存器低八位


ISP_CMD---ISP/IAP操作時的命令模式寄存器,須命令觸發寄存器觸發方可生效,其模式設置如圖:

程序在系統ISP程序區時,可以對用戶應用程序/數據Flash區(EEPROM)進行字節讀/字節編程/扇區擦除,
程序在用戶應用程序區時,盡可以對數據Flash區(EEPROM)進行字節讀/字節編程/扇區擦除
ST89C51RC/RD+系列MCU出場時已經固化有ISP引導碼,并設置為上電復位進入ISP程序去,并且出廠時就已經完全加密。

ISP_TRIG---ISP/IAP操作時的命令觸發寄存器。
在ISPEN(ISP_CONTR.7)=1時,對ISP_TRIG 寫入46H,在寫入B9H,ISP/IAP 命令才會生效。

STC89C52RC,STC89LE52RC內部可用data Flash(EEPROM)地址列表:

每個扇區為5112B,寫程序時,將一次修改的數據放在同一個扇區,,因為擦除的時候,一次至少擦除一個扇區的數據。
更新數據前,必須先擦除原來的數據,不能再原來的數據基礎上更新內容。

具體實現代碼:
-----------------------------------------------------------------------------------------------------------------------
#include
#include

#define  uchar unsigned char
#define uint  unsigned int
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
#define RDCommand0X01         //定義ISP操作命令
#define PrgCommand 0X02
#define EraseCommand 0X03

#define    error 1
#define OK  0

#define WaitTime0x01         //定義CPU的等待時間
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
sfrISP_DATA=0XE2;            //寄存器聲明
sfr ISP_ADDRH=0XE3;
sfr ISP_SDDRL=0XE4;
sfr ISP_CMD=0XE5;
sfr ISP_TRIG=0XE6;
sfr ISP_CONTR=0XE7;
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//打開ISP/IAP功能
void ISP_IAP_Enable(void)
{
   EA=0;                      //關中斷
   ISP_CONTR=ISPCONTR &0X18;       //00011000
   ISP_CONTR=ISPCONTR | WaitTime;  //寫入硬件延時
   ISP_CONTR=ISPCONTR |0X80;      //ISPEN=1
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//關閉ISP/IAP功能
void ISP_IAP_Disable(void)
{
   ISP_CONTR=ISP_CONTR &0X7F;      //ISPEN=0
   ISP_TRIG=0X00;
   EA=1;                     //開中斷   
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//觸發代碼
void ISP_Trig(void)
{
   ISP_IAP_Enable();             //打開ISP/IAP功能
    ISP_TRIG=0X46;               //觸發ISP/IAP命令字節1
    ISP_TRIG=0XB9;               //觸發ISP/IAP命令字節2
   _nop_();
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//指定地址---字節讀
uchar  Byte_Read(uint byte_addr)
{
    ISP_ADDRH=(uchar)(byte_addr>>8);           //地址賦值
    ISP_ADDRL=(uchar)(byte_addr&0X00FF);
    ISP_CMD=ISP_CMD &0XF8;               //清除低三位
    ISP_CMD=ISP_CMD |RDCommand;            //寫入讀命令
   ISP_Trig();                            //觸發執行
   ISP_IAP_Disable();                      //關閉ISP/IAP功能
    return(ISP_DATA);                     //返回讀到的數據
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//指定地址---扇區擦除
void Sector_Erase(uint sector_addr)
{
    uintSector_Addr;
    Sector_Addr=sector_addr &0XFE00;         //取扇區地址
    ISP_ADDRH=(uchar)(Sector_Addr>>8);
    ISP_ADDRL=0X00;
    ISP_CMD=ISP_CMD &0XF8;               //清空低三位
    ISP_CMD=ISP_CMD |EraseCommand;         //擦出命令3
   ISP_Trig();                            //觸發執行
   ISP_IAP_Disable();                     //關閉ISP/IAP功能
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//指定地址---字節寫
void Byte_Write(uint byte_addr,uchar original_data)
{
    ISP_ADDRH=(uchar)(byte_addr>>8);          //取地址
    ISP_ADDRL=(uchar)(byte_addr & 0X00FF);
    ISP_CMD=ISP_CMD &0XF8;               //清除低三位
    ISP_CMD=ISP_CMD |PrgCommand;             //寫命令2
    ISP_DATA=original_data;               //寫入數據準備
   ISP_Trig();                            //觸發執行
   ISP_IAP_Disable();                     //關閉ISP/IAP功能
}
-----------------------------------------------------------------------------------------------------------------------

最后對于代碼的一些部分做一定的解釋

ISP_ADDRH= (uchar)(Sector_Addr>>8); //Sector_Addr右移8位,然后賦值給ISP_ADDRH
ISP_ADDRL= (uchar)(byte_addr & 0X00FF);//byte_addr與上0X00FF,賦值給ISP_ADDRL

次處:
dataFlash(EEPROM)的最小扇區的地址為:
2000H=0010 0000 0000 0000B ,
共計16為,而ISP_ADDRH共8位,
且為地址寄存器的高八位,右移8位,相當于舍去低8位,把地址寄存器的高8為賦予給ISP_ADDRH

對于寄存器地址,byte_addr與上0X00FF,取byte_addr的低8位,強制轉換成uchar,然后賦值給ISP_ADDRL且ISP_ADDRL為地址寄存器的低8位.



評分

參與人數 1黑幣 +5 收起 理由
秋葉原48 + 5 很給力!

查看全部評分

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

使用道具 舉報

沙發
ID:258924 發表于 2017-12-20 14:43 | 只看該作者
那個硬件延時什么意思啊
回復

使用道具 舉報

板凳
ID:718987 發表于 2023-1-27 13:33 | 只看該作者
荊棘鳥1996 發表于 2017-12-20 14:43
那個硬件延時什么意思啊

就是需要配置運行這條指令CPU需要等待或消耗的時間,stc單片機說明書里規定了的。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91麻豆精品国产91久久久更新资源速度超快 | 亚洲第一视频网站 | 综合成人在线 | 国产精品久久一区二区三区 | 成人三级电影 | 中文字幕第一页在线 | 日韩久久久久久 | 日日夜夜精品视频 | 日韩精品免费视频 | 国产精品久久久久久久久久久久冷 | 久久久久久精 | 91xxx在线观看 | 久久中文字幕一区 | 亚洲一区二区中文字幕 | 成人无遮挡毛片免费看 | 久久久www成人免费精品张筱雨 | 国产成人精品区一区二区不卡 | 国产区一区二区三区 | 亚洲欧美一区二区三区情侣bbw | 久久久久国产精品一区二区 | 日本不卡免费新一二三区 | 天天操人人干 | 九九热免费在线观看 | 91小视频| 久久久久欧美 | av黄在线观看 | 久久天堂网 | 91精品国产综合久久国产大片 | 欧美黄色一级毛片 | 久久欧美精品 | 大香网伊人| 紧缚调教一区二区三区视频 | 2019精品手机国产品在线 | 91精品国产色综合久久不卡98 | 欧美在线观看一区 | 精品久久久久久 | 97精品国产97久久久久久免费 | 日韩欧美国产一区二区三区 | 国产午夜精品一区二区三区 | av资源在线看 | 亚洲视频www|