新聞中心

        C8051F020的Flash操作

        作者: 時間:2016-11-24 來源:網(wǎng)絡(luò) 收藏
        C8051F020的Flash可以實現(xiàn)IAP功能(In Application Programming),即程序可對Flash存儲區(qū)進行編程,也就是說Flash除了可以存放程序代碼,還可以在剩下的空間內(nèi)存儲數(shù)據(jù),即起到EEPROM的功能,下圖是C8051F020的存儲組織結(jié)構(gòu)圖

        本文引用地址:http://www.104case.com/article/201611/320879.htm


        可以看到它的結(jié)構(gòu)是64K+128字節(jié)的形式,0xfe00~0xffff為工廠保留區(qū),不能進行操作,當64K的Flash用作存儲數(shù)據(jù)時,先確定程序代碼的位置,以免覆蓋程序?qū)е鲁鲥e,還有操作Flash前必須禁止中斷,否則可能會出現(xiàn)無法預(yù)知的錯誤,下面是我寫的驅(qū)動,經(jīng)測試沒問題:

        void Flash_area_Erase(bit type,uint addr)
        {//flash擦除,type為0代表128字節(jié)儲存區(qū),為1代表64K存儲區(qū)(512字節(jié)/扇區(qū))
        bit EA_S;
        EA_S=EA;
        EA=0;
        if(!type) PSCTL=0x07;
        else PSCTL=0x03;
        FLSCL=0x01;//允許寫
        *(uchar xdata *)addr=0xff;
        PSCTL=0;
        FLSCL=0;
        EA=EA_S;
        }

        uchar Flash_area_Read(bit type,uint addr)
        {//flash讀取,type為0代表128字節(jié)儲存區(qū),為1代表64K存儲區(qū)(512字節(jié)/扇區(qū))
        uchar dat;
        bit EA_S;
        EA_S=EA;
        EA=0;
        if(!type) PSCTL=0x04;
        else PSCTL=0;
        dat=*(uchar code *)addr;
        PSCTL=0;
        EA=EA_S;
        return(dat);
        }

        void Flash_area_Write(bit type,uint addr,uchar dat)
        {//flash寫入,type為0代表128字節(jié)儲存區(qū),為1代表64K存儲區(qū)(512字節(jié)/扇區(qū))
        bit EA_S;
        EA_S=EA;
        EA=0;
        if(!type) PSCTL=0x05;
        else PSCTL=0x01;
        FLSCL=0x01;
        *(uchar xdata *)addr=dat;
        PSCTL=0;
        FLSCL=0;
        EA=EA_S;
        }

        這里要指出的是,在*(uchar code *)addr中,addr轉(zhuǎn)化為指向ROM的uchar型變量的指針,即它指向的數(shù)是uchar型的,但其本身作為一個地址是uint型的。



        關(guān)鍵詞: C8051F020Flash操

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 革吉县| 昌吉市| 四会市| 兴宁市| 利辛县| 成武县| 苍梧县| 泰来县| 四会市| 咸阳市| 台湾省| 凤凰县| 康乐县| 台南县| 奎屯市| 健康| 德兴市| 北碚区| 黎平县| 镇安县| 什邡市| 凌云县| 武汉市| 白山市| 岑巩县| 资溪县| 房产| 南漳县| 喀喇沁旗| 易门县| 青岛市| 富宁县| 庐江县| 绿春县| 涞源县| 兴业县| 拜城县| 芜湖县| 荥阳市| 鹿邑县| 大冶市|