⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash.txt

📁 单片机应用开发实例.rar
💻 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 + -