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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 12070|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

STC15F2K60S2單片機(jī)內(nèi)部DataFlash讀寫(xiě)測(cè)試程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:104126 發(fā)表于 2016-1-22 19:02 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
出自:無(wú)量壽經(jīng)大俠的《51單片機(jī)輕松入門(mén)—基于STC15W4K系列》:http://www.zg4o1577.cn/bbs/dpj-37954-1.html
7.2.2  DataFlash操作實(shí)例(斷電瞬間存儲(chǔ)數(shù)據(jù))
例7.3  STC15F2K60S2單片機(jī)內(nèi)部DataFlash讀寫(xiě)測(cè)試
本程序上電時(shí)先擦除DataFlash的第1個(gè)扇區(qū),然后將前半扇區(qū)與后半扇區(qū)分別寫(xiě)入數(shù)據(jù)0~256,然后讀出數(shù)據(jù)并判斷與寫(xiě)入的數(shù)據(jù)是否一致,并通過(guò)串口助手顯示程序運(yùn)行過(guò)程中的數(shù)據(jù)與最終結(jié)果是否正常,R/C時(shí)鐘頻率22.1184MHz,串口通信波特率9600。
程序主要使用到2個(gè)模塊文件FLASH.H與FLASH.C,在程序移植過(guò)程中,F(xiàn)LASH.H里需要定義晶振頻率與FLASH存儲(chǔ)單元地址,F(xiàn)LASH.C無(wú)需作任何更改。
//////////////////////////////////  FLASH.H  /////////////////////////////////
#ifndef __FLASH_H__
#define __FLASH_H__
#include "STC15W4K.H "              //        FLASH操作要控制中斷開(kāi)關(guān)EA  
#include <intrins.h>              // FLASH讀寫(xiě)要用到 _nop_();
// FLASH讀寫(xiě)擦除延時(shí)等待時(shí)間需要用到晶振頻率
#define SYSclk         22118400L        // 定義CPU實(shí)際運(yùn)行的系統(tǒng)時(shí)鐘
#define        EEP_address        0x0000            // 主程序從0000地址開(kāi)始讀寫(xiě)數(shù)據(jù)
/******************** 寫(xiě)N個(gè)字節(jié)函數(shù) 最多255字節(jié)一次 *****************/
void EEPROM_write_n(unsigned int EE_address,unsigned char *DataAddress,unsigned char lenth);
/******************** 讀N個(gè)字節(jié)函數(shù) 最多255字節(jié)一次 *****************/
void EEPROM_read_n(unsigned int EE_address,unsigned char *DataAddress,unsigned char lenth);         
/******************** 扇區(qū)擦除函數(shù) *****************/
void EEPROM_SectorErase(unsigned int EE_address);
#endif
【傳說(shuō)】無(wú)量壽經(jīng)(347305156) 16:51:18
//////////////////////////////////////  FLASH.C  ////////////////////////////////////////
//                      此文件直接復(fù)制使用,用戶無(wú)需任何更改。
#include "FLASH.h"  
// 寄存器定義,雖然頭文件已有定義,但不會(huì)沖突,這里列出來(lái)方便理解程序。
sfr ISP_DATA  = 0xC2;
sfr ISP_ADDRH = 0xC3;
sfr ISP_ADDRL = 0xC4;
sfr ISP_CMD   = 0xC5;
sfr ISP_TRIG  = 0xC6;
sfr ISP_CONTR = 0xC7;
///////////////////////////////// FLASH 操作延時(shí)等待參數(shù)  ////////////////////////////
#if (SYSclk >= 24000000L)
#define         ISP_WAIT_FREQUENCY        0
#elif (SYSclk >= 20000000L)
#define         ISP_WAIT_FREQUENCY        1
#elif (SYSclk >= 12000000L)
#define         ISP_WAIT_FREQUENCY2
#elif (SYSclk >= 6000000L)
#define         ISP_WAIT_FREQUENCY        3
#elif (SYSclk >= 3000000L)
#define         ISP_WAIT_FREQUENCY        4
#elif (SYSclk >= 2000000L)
#define         ISP_WAIT_FREQUENCY        5
#elif (SYSclk >= 1000000L)
#define         ISP_WAIT_FREQUENCY        6
#else
#define         ISP_WAIT_FREQUENCY        7
#endif          
/*************************禁止操作FLASH ( 固定不變 )*******************************/
void DisableEEPROM(void)         // 以下語(yǔ)句可以不用,只是出于安全考慮而已
{
ISP_CONTR = 0;         // 禁止ISP/IAP操作
ISP_CMD   = 0;         // 去除ISP/IAP命令
ISP_TRIG  = 0;         // 防止ISP/IAP命令誤觸發(fā)
ISP_ADDRH = 0xff;         // 指向非EEPROM區(qū),防止誤操作
ISP_ADDRL = 0xff;         // 指向非EEPROM區(qū),防止誤操作
}
/******************** 寫(xiě)N個(gè)字節(jié)函數(shù) 最多255字節(jié)一次( 固定不變 ) *****************/
void EEPROM_write_n(unsigned int EE_address,unsigned char *DataAddress,unsigned char lenth)
{
EA = 0;                  // 禁止中斷            
ISP_CONTR = 0x80 + ISP_WAIT_FREQUENCY;  // 允許操作FLASH + 延時(shí)等待時(shí)間,送一次就夠
ISP_CMD = 2        ;                                // 字節(jié)寫(xiě)命令,命令不需改變時(shí),不需重新送命令
do
{
ISP_ADDRH = EE_address / 256;         // 送地址高字節(jié)(地址需要改變時(shí)才需重新送地址)
ISP_ADDRL = EE_address % 256;         // 送地址低字節(jié)
ISP_DATA  = *DataAddress;         // 送數(shù)據(jù)到ISP_DATA,只有數(shù)據(jù)改變時(shí)才需重新送
ISP_TRIG = 0x5A;// ISP觸發(fā)命令,先送5AH,再送A5H到ISP/IAP觸發(fā)寄存器,每次都需要如此
ISP_TRIG = 0xA5;// ISP觸發(fā)命令,寫(xiě)字節(jié)最長(zhǎng)需要55uS,因此本行語(yǔ)句會(huì)暫停55uS以上的時(shí)間
_nop_();
EE_address++;         // 下一個(gè)地址
DataAddress++;         // 下一個(gè)數(shù)據(jù)
}while(--lenth);         // 直到結(jié)束
DisableEEPROM();
EA = 1;                          // 重新允許中斷
}
【傳說(shuō)】無(wú)量壽經(jīng)(347305156) 16:51:34
/******************** 讀N個(gè)字節(jié)函數(shù) 最多255字節(jié)一次 ( 固定不變 )*****************/
void EEPROM_read_n(unsigned int EE_address,unsigned char *DataAddress,unsigned char lenth)
{
EA = 0;                 // 禁止中斷
ISP_CONTR = 0x80 + ISP_WAIT_FREQUENCY;  // 允許操作FLASH + 延時(shí)等待時(shí)間,送一次就夠
ISP_CMD = 1        ;         // 字節(jié)讀命令,命令不需改變時(shí),不需重新送命令
do
{
ISP_ADDRH = EE_address / 256;         // 送地址高字節(jié)(地址需要改變時(shí)才需重新送地址)
ISP_ADDRL = EE_address % 256;         // 送地址低字節(jié)
ISP_TRIG = 0x5A;         // ISP觸發(fā)命令
ISP_TRIG = 0xA5;
  // ISP觸發(fā)命令,讀一個(gè)字節(jié)最長(zhǎng)需要2個(gè)時(shí)鐘,因此本行語(yǔ)句會(huì)暫停2個(gè)時(shí)鐘以上的時(shí)間
_nop_();
*DataAddress = ISP_DATA;         // 讀出的數(shù)據(jù)送往外部變量地址
EE_address++;
DataAddress++;
}while(--lenth);
DisableEEPROM();             
EA = 1;                // 重新允許中斷
}  
/******************** 扇區(qū)擦除函數(shù)( 固定不變 )  *****************/
void EEPROM_SectorErase(unsigned int EE_address)
{
EA = 0;                  // 禁止中斷
// 只有扇區(qū)擦除,沒(méi)有字節(jié)擦除,512字節(jié)/扇區(qū)。扇區(qū)中任意一個(gè)字節(jié)地址都是扇區(qū)地址。
ISP_ADDRH = EE_address / 256;         // 送扇區(qū)地址高字節(jié)(地址需要改變時(shí)才需重新送地址)
ISP_ADDRL = EE_address % 256;         // 送扇區(qū)地址低字節(jié)
ISP_CONTR = 0x80 + ISP_WAIT_FREQUENCY;  // 允許操作FLASH + 延時(shí)等待時(shí)間,送一次就夠
ISP_CMD = 3;                             // 送扇區(qū)擦除命令,命令不需改變時(shí),不需重新送命令
ISP_TRIG = 0x5A;         // ISP觸發(fā)命令
ISP_TRIG = 0xA5;        // ISP觸發(fā)命令,擦除最長(zhǎng)需要21mS,因此本行語(yǔ)句會(huì)暫停21mS以上的時(shí)間
_nop_();
DisableEEPROM();         // 禁止命令
EA = 1;                 // 重新允許中斷
}
///////////////////////////////////  主程序:Flash_Test.C  /////////////////////////////////
#include "FLASH.H"
#include "uart_debug.h"          
void main()
{         
unsigned char a;
unsigned int i;         
UART_init();                        // 占用定時(shí)器1,波特率:9600 /22.1184MHZ
UART_Send_Str("開(kāi)始擦除\n");
    EEPROM_SectorErase(EEP_address);   // 扇區(qū)擦除
UART_Send_Str("擦除完畢\n");
    for (i=0; i<512; i++)              // 檢測(cè)是否擦除成功(全FF檢測(cè))
    {
EEPROM_read_n(EEP_address+i,&a,1);          // 地址、數(shù)據(jù)、長(zhǎng)度
UART_Send_StrNum("擦除值:",a)        ;
if (a!=0xff)  goto Error;             // 如果校驗(yàn)錯(cuò)誤,則退出
}  
UART_Send_Str("開(kāi)始寫(xiě)入\n");            
    for (i=0; i<512; i++)           // 編程512字節(jié)
    {
               a=i;
    EEPROM_write_n(EEP_address+i,&a,1);  // 地址、數(shù)據(jù)、長(zhǎng)度
    }
UART_Send_Str("寫(xiě)入完畢\n");   
    for (i=0; i<512; i++)           // 校驗(yàn)512字節(jié)
    {
EEPROM_read_n(EEP_address+i,&a,1);            // 地址、數(shù)據(jù)、長(zhǎng)度
UART_Send_StrNum("數(shù)據(jù):",a);
if (a!=i%256)  goto Error;              // 如果校驗(yàn)錯(cuò)誤,則退出
    }
UART_Send_Str("讀出結(jié)束,測(cè)試正常");
    while (1);
Error:
    UART_Send_Str("數(shù)據(jù)錯(cuò)誤");                  //0xxx,xxxx IAP操作失敗
    while (1);
}  

本程序使用“丁丁版本的串口調(diào)試助手”在電腦上顯示接收到的數(shù)據(jù),文本模式,9600波特率,測(cè)試結(jié)果正常,由于接收的數(shù)據(jù)量較大,其它串口助手可能會(huì)出現(xiàn)亂碼或開(kāi)始接收到的數(shù)據(jù)被后來(lái)的數(shù)據(jù)覆蓋掉而不能完整顯示的問(wèn)題。

在程序移植過(guò)程中,F(xiàn)LASH.H里需要定義晶振頻率與FLASH存儲(chǔ)單元地址(地址可以不改),F(xiàn)LASH.C無(wú)需作任何更改。

復(fù)制粘貼使用就行了,想理解程序模塊內(nèi)部每條語(yǔ)句意義需要看書(shū)才行,因?yàn)閮?nèi)部無(wú)需任何修改,也可以不管內(nèi)部原理。

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

使用道具 舉報(bào)

沙發(fā)
ID:99525 發(fā)表于 2016-1-23 17:24 | 只看該作者
漏了uart_debug.h文件
回復(fù)

使用道具 舉報(bào)

板凳
ID:238048 發(fā)表于 2017-10-9 16:45 | 只看該作者
下來(lái)看看
回復(fù)

使用道具 舉報(bào)

地板
ID:464959 發(fā)表于 2019-2-1 21:18 | 只看該作者
學(xué)習(xí)一下,謝謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91一区二区三区 | 毛片a级 | 国产999精品久久久 日本视频一区二区三区 | 精品成人在线视频 | 日韩精品一区二区三区第95 | 91精品久久久久久久 | 国产欧美在线观看 | 欧美日韩国产一区 | 欧美精选一区二区 | 中文天堂在线一区 | 久久国| 天天干夜夜操 | 久久99视频这里只有精品 | 国产日韩欧美 | 91免费观看 | 免费观看一级特黄欧美大片 | 成人亚洲精品久久久久软件 | 国产美女高潮 | 国产这里只有精品 | 国产成人精品综合 | 91性高湖久久久久久久久_久久99 | 国产传媒在线观看 | 美女逼网站 | 成人国产在线观看 | 亚洲a在线观看 | 在线观看av网站永久 | 日韩精品视频在线 | 中国一级特黄视频 | 国产精品成人在线播放 | 精品亚洲一区二区三区四区五区高 | 亚洲激情网站 | 久久99蜜桃综合影院免费观看 | 九九热在线免费视频 | 国产成人一区 | av天空 | 国产高清一区二区 | 久久精品国产一区二区电影 | 欧美成人aaa级毛片在线视频 | 91在线视频| 天天色图| 九九精品网 |