📄 flash.txt
字号:
#include <ADUC812.H>
#include <stdio.h>
#include "flash.h"
char code msgbuf [] = "This is a test to see if this thing really works.";
char xdata strbuf [101];
long test_eeprom (void)
{
unsigned long i;
unsigned char dbuf;
unsigned char rbuf;
flash_erase_all (); //擦除EEPROM
for (dbuf=0, i=flash_size (); i>0; i--, dbuf++) //写满EEPROM
{
flash_write (&dbuf, sizeof (dbuf), i-1);
}
for (dbuf=0, i=flash_size (); i>0; i--, dbuf++) //从EEPROM读并比较写的值
{ //如果不匹配反回失败地址
flash_read (&rbuf, sizeof (dbuf), i-1);
if (rbuf != dbuf)
{
return (i-1);
}
}
//-1指示所有值匹配
return (-1);
}
void main (void)
{
long addr;
#ifndef MON51
SCON = 0x50; //SCON:模式1, 8-bit UART, 开rcvr
TMOD |= 0x20; //TMOD: timer 1,模式2, 8-bit重载
TH1 = 0xF4; //TH1: 重载2400 baud @ 11.0592 MHz
TR1 = 1; //TR1: timer 1运行
TI = 1; //TI: 设置TI 发送第1个UART字符
#endif
//测试 EEPROM并打印结果
printf ("Testing the ERPROM\n");
addr = test_eeprom ();
if (addr == -1)
{
printf ("ERPROM test passed!\n");
}
else
{
printf ("ERPROM test failed at %lu\n", addr);
}
printf ("Erasing the EEPROM\n");
flash_erase_all ();
printf ("EEPROM Size = %lu bytes\n", (unsigned long) flash_size ());
printf ("Writing \"%s\" to the EEPROM\n", msgbuf);
flash_write (msgbuf, sizeof (msgbuf), 0);
flash_read (strbuf, sizeof (msgbuf), 0);
printf ("Read \"%s\" from the EEPROM\n", strbuf);
printf ("Erasing the EEPROM\n");
flash_erase_all ();
while (1);
}
//f_erase.c
#include <ADUC812.H>
#include "f_adi.h"
char flash_erase_all (void)
{
ECON = ADI_EE_ERASE_ALL;
return (0);
}
//fread.c
#include <ADUC812.H>
#include "f_adi.h"
unsigned long flash_read (
void *buffer, // Buffer
unsigned long len, //读字节
unsigned long address) // 读FLASH 地址
{
unsigned char *s = buffer;
unsigned long i;
unsigned int addr;
//如果地址太大,退出
if (address >= ADI_EEMEM_SIZE)
return (0UL);
//否则开始读
addr = (unsigned int) address;
EADRL = addr >> 2;
ECON = ADI_EE_READ_PAGE;
for (i = 0; i < len; i++)
{
//到EE byte
switch (addr & 0x03)
{
case 0: s[i] = EDATA1; break;
case 1: s[i] = EDATA2; break;
case 2: s[i] = EDATA3; break;
case 3: s[i] = EDATA4; break;
}
if (++addr >= ADI_EEMEM_SIZE)
break;
if ((addr & 0x03) == 0)
{
EADRL = addr >> 2;
ECON = ADI_EE_READ_PAGE;
}
}
return (i);
}
// f_size.c
#include <ADUC812.H>
#include "f_adi.h"
unsigned long flash_size (void)
{
return (ADI_EEMEM_SIZE);
}
// f_write .c
#include <ADUC812.H>
#include "f_adi.h"
unsigned long flash_write (
const void *buffer, //存Buffer
unsigned long len, //缓冲区Buffer长
unsigned long address) //FLASH 地址
{
const unsigned char *s = buffer;
unsigned int i;
unsigned int addr;
//如果地址太大,退出
if (address >= ADI_EEMEM_SIZE)
return (0UL);
addr = (unsigned int) address;
for (i = 0; i < len; i++)
{
//读
if ((i == 0) || (addr & 0x03) == 0)
{
EADRL = addr >> 2;
ECON = ADI_EE_READ_PAGE;
}
//升级数据
switch ((addr++) & 0x03)
{
case 0:
EDATA1 = s[i];
break;
case 1:
EDATA2 = s[i];
break;
case 2:
EDATA3 = s[i];
break;
case 3:
EDATA4 = s[i];
WRITE_EEPROM:
ECON = ADI_EE_ERASE_PAGE;
ECON = ADI_EE_WRITE_PAGE;
break;
}
//升级地址
if (addr >= ADI_EEMEM_SIZE)
break;
}
//写最终页IFF地址不在新页的开始处
if (addr & 0x03)
{
addr = ADI_EEMEM_SIZE;
goto WRITE_EEPROM;
}
return (i);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -