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

📄 aduc70xxflash.c

📁 AD公司的FlashADuC70xx的Flashloader
💻 C
字号:
/*************************************************************************
 *
 *    Used with ICCARM and AARM.
 *
 *    (c) Copyright IAR Systems 2005
 *
 *    File name   : ADuC70xxFlash.c
 *    Description : ADuC70xx Flash driver
 *
 *    History :
 *    1. Data         : July 6, 2005
 *       Author       : Stanimir Bonev
 *       Description  : Create
 *    1. Data         : July 8, 2005
 *       Author       : Stanimir Bonev
 *       Description  : Modify
 *    Add initialization of FEEMOD for ADuC702x
 *    $Revision: 1.1.2.1 $
**************************************************************************/

#ifdef __ADuC7030
#include <ioaduc7030.h>
#define FLASH_BLOCK_NUMB (30 * 2) // 30KB User memory blocks
#define FEEADD_BASE_ADD  (unsigned long *)&FEE0STA
#define FEEADD_OFFSET   ((unsigned long *)&FEE0ADR - (unsigned long *)&FEE0STA)
#define FEEDATA_OFFSET  ((unsigned long *)&FEE0DAT - (unsigned long *)&FEE0STA)
#define FEECMD_OFFSET   ((unsigned long *)&FEE0CON - (unsigned long *)&FEE0STA)
#define FEESTA_OFFSET   ((unsigned long *)&FEE0DAT - (unsigned long *)&FEE0DAT)
#define __ADuC703x_32K  0x1
#else
#ifdef __ADuC7032
#include <ioaduc7032.h>
#define FLASH_BLOCK_NUMB (94 * 2) // 94KB User memory blocks
#define FEEADD_BASE_ADD  (unsigned long *)&FEE0STA
#define FEEADD_BASE1_ADD (unsigned long *)&FEE1STA
#define FEEADD_OFFSET   ((unsigned long *)&FEE0ADR - (unsigned long *)&FEE0STA)
#define FEEDATA_OFFSET  ((unsigned long *)&FEE0DAT - (unsigned long *)&FEE0STA)
#define FEECMD_OFFSET   ((unsigned long *)&FEE0CON - (unsigned long *)&FEE0STA)
#define FEESTA_OFFSET   ((unsigned long *)&FEE0DAT - (unsigned long *)&FEE0DAT)
#else
#ifdef __ADuC7033
#include <ioaduc7033.h>
#define FLASH_BLOCK_NUMB (94 * 2) // 94KB User memory blocks
#define FEEADD_BASE_ADD  (unsigned long *)&FEE0STA
#define FEEADD_BASE1_ADD (unsigned long *)&FEE1STA
#define FEEADD_OFFSET   ((unsigned long *)&FEE0ADR - (unsigned long *)&FEE0STA)
#define FEEDATA_OFFSET  ((unsigned long *)&FEE0DAT - (unsigned long *)&FEE0STA)
#define FEECMD_OFFSET   ((unsigned long *)&FEE0CON - (unsigned long *)&FEE0STA)
#define FEESTA_OFFSET   ((unsigned long *)&FEE0DAT - (unsigned long *)&FEE0DAT)
#else
#ifdef __ADuC702x
#include <ioaduc7020.h>
#define FLASH_BLOCK_NUMB (62 * 2) // 62KB User memory blocks
#define FEEADD_BASE_ADD  (unsigned long *)&FEESTA
#define FEEADD_OFFSET   ((unsigned long *)&FEEADR - (unsigned long *)&FEESTA)
#define FEEDATA_OFFSET  ((unsigned long *)&FEEDAT - (unsigned long *)&FEESTA)
#define FEECMD_OFFSET   ((unsigned long *)&FEECON - (unsigned long *)&FEESTA)
#define FEESTA_OFFSET   ((unsigned long *)&FEEDAT - (unsigned long *)&FEEDAT)
#else
#ifdef __ADuC712x
#include <ioaduc7128.h>
#define FLASH_BLOCK_NUMB (126 * 2) // 126KB User memory blocks
#define FEEADD_BASE_ADD  (unsigned long *)&FEE0STA
#define FEEADD_BASE1_ADD (unsigned long *)&FEE1STA
#define FEEADD_OFFSET   ((unsigned long *)&FEE0ADR - (unsigned long *)&FEE0STA)
#define FEEDATA_OFFSET  ((unsigned long *)&FEE0DAT - (unsigned long *)&FEE0STA)
#define FEECMD_OFFSET   ((unsigned long *)&FEE0CON - (unsigned long *)&FEE0STA)
#define FEESTA_OFFSET   ((unsigned long *)&FEE0DAT - (unsigned long *)&FEE0DAT)
#else
#ifdef __ADuC7031
#include <ioaduc7030.h>
#define FLASH_BLOCK_NUMB (30 * 2) // 30KB User memory blocks
#define FEEADD_BASE_ADD  (unsigned long *)&FEE0STA
#define FEEADD_OFFSET   ((unsigned long *)&FEE0ADR - (unsigned long *)&FEE0STA)
#define FEEDATA_OFFSET  ((unsigned long *)&FEE0DAT - (unsigned long *)&FEE0STA)
#define FEECMD_OFFSET   ((unsigned long *)&FEE0CON - (unsigned long *)&FEE0STA)
#define FEESTA_OFFSET   ((unsigned long *)&FEE0DAT - (unsigned long *)&FEE0DAT)
#define __ADuC703x_32K  0x1
#else
#error Not define MCU Type: __ADuC702x,__ADuC7030,__ADuC7032 or __ADuC7033!!!
#endif
#endif
#endif
#endif
#endif
#endif


#include "Interface.h"

// Every block is present by bit
unsigned long eraseFlags[(FLASH_BLOCK_NUMB/32) + ((FLASH_BLOCK_NUMB%32)?1:0)];

/*************************************************************************
 * Function Name: ProgramHalfword
 * Parameters: unsigned long addr, int halfwor
 * Return: int : 0 - Pass
 *               1 - Error
 *
 * Description: Erase/Write Word to flash at addr.
 *
 *************************************************************************/
static int ProgramHalfword (unsigned long addr, int halfword) {
unsigned long Ind = (addr & 0x1FFFF) >> 9;
  // Is block already erased
  if(Ind >= FLASH_BLOCK_NUMB)
  {
#ifdef __ADuC703x_32K
    FlMessageBox("Program fail");
#else                                                 
    FlMessageBox("Application is too large");
#endif
    FlErrorExit();
    return 1;
  }
unsigned int Mask = 1<<(Ind & 0x1F);

#ifdef __ADuC702x
unsigned long *FlashRegBase = FEEADD_BASE_ADD;
#else
#ifdef __ADuC703x_32K

  FEE0ADR = addr;     //  Set Address to write too
  FEE0DAT = halfword; //  Load Data to write
  if(eraseFlags[Ind>>5] & Mask)
  {
    // Already eresed
    FEE0CON = 0x02;   //  Execute Write
  }
  else
  {
    // Set Block Erase flag
    eraseFlags[Ind>>5] |= Mask;
    // Must be erased
    FEE0CON = 0x03;   //  Execute Erase/Write
  }
  // Start Program Command, We write in half words
  // Wait until complete or fail
unsigned long Flash_Status;
  do
  {
    Flash_Status = FEE0STA; //  Load Status of Flash
    if (Flash_Status & 2)  //  Fail if Fail Bit set
    {
      return 1;                   //  Command Failed
    }
  }
  while (Flash_Status & 4);       //  Wait until Flash Command finish

#else
unsigned long *FlashRegBase;
  if(Ind >= 64*2)
  {
    FlashRegBase = FEEADD_BASE_ADD;
  }
  else
  {
    FlashRegBase = FEEADD_BASE1_ADD;
  }
#endif
#endif

#ifndef __ADuC703x_32K
  *(FlashRegBase + FEEADD_OFFSET) = addr;     //  Set Address to write too
  *(FlashRegBase + FEEDATA_OFFSET)= halfword; //  Load Data to write
  if(eraseFlags[Ind>>5] & Mask)
  {
    // Already eresed
    *(FlashRegBase + FEECMD_OFFSET) = 0x02;   //  Execute Write
  }
  else
  {
    // Set Block Erase flag
    eraseFlags[Ind>>5] |= Mask;
    // Must be erased
    *(FlashRegBase + FEECMD_OFFSET) = 0x03;   //  Execute Erase/Write
  }
  // Start Program Command, We write in half words
  // Wait until complete or fail
unsigned long Flash_Status;
  do
  {
    Flash_Status = *(FlashRegBase + FEESTA_OFFSET); //  Load Status of Flash
    if (Flash_Status & 2)         //  Fail if Fail Bit set
    {
      return 1;                   //  Command Failed
    }
  }
  while (Flash_Status & 4);       //  Wait until Flash Command finish
#endif
  return 0;
}


/*************************************************************************
 * Function Name: FlashWriteByte
 * Parameters: unsigned long addr, int byte
 * Return: none
 *
 * Description: Write byte to flash at addr. the bytes are buffered in halfrord
 * If byte == -1 the flash loader framework signals a flush operation
 * at the end of the input file.
 *
 *************************************************************************/
static void FlashWriteByte(unsigned long addr, int byte)
{
static unsigned short data = 0xFFFF;
static unsigned long last_addr = 0;
  while(1)
  {
    if(byte == -1)
    {
      if(last_addr & 1)
      {
        // Flush Buffer
        ++last_addr;
      }
      else
      {
        // Buffer is empty
        return;
      }
    }
    else if (addr == last_addr)
    {
      if(++last_addr & 1)
      {
        // Add new byte to buffer
        data = byte | 0xFF00;
        return;
      }
      else
      {
        // Flush Buffer
        data &= 0x00FF | (byte << 8);
        // For exit
        byte = -1;
      }
    }
    else
    {
      if(++last_addr & 1)
      {
        last_addr = addr;
        continue;
      }
      // Flush Buffer
    }
    if(ProgramHalfword(last_addr-2,data))
    {
      FlMessageBox("Program fail");
      FlErrorExit();
    }
  }
}

/*************************************************************************
 * Function Name: FlashDriverInitialize
 * Parameters: int argc, char const* argv[]
 * Return: none
 *
 * Description: Init Flash driwer and Register the flash byte write function
 *
 *************************************************************************/
int a,b,sta;

void FlashDriverInitialize(int argc, char const* argv[])
{
  // Allow Write/Erase operations
#ifdef __ADuC703x_32K
  FEE0MOD = 0x8;
#else
#ifdef __ADuC7032
  FEE0MOD = 0x8;
  FEE1MOD = 0x8;
#else
#ifdef __ADuC7033
  FEE0MOD = 0x8;
  FEE1MOD = 0x8;
#else
#ifdef __ADuC712x
  FEE0MOD = 0x8;
  FEE1MOD = 0x8;
#else
#ifdef __ADuC702x
  unsigned int Rev = *(unsigned int *)0xffff042c & 0xFF00;
  if(Rev == 0x0200)
  {
    FEEMOD = 0;
  }
  else
  {
    FEEMOD = 0x8;
  }
#endif
#endif
#endif
#endif
#endif
  // Register the flash write function.
  FlRegisterWriteFunction(FlashWriteByte);
}


/*************************************************************************
 * Function Name: FlashDriverInitialize
 * Parameters: int argc, char const* argv[]
 * Return: none
 *
 * Description: For test porpoise only
 *
 *************************************************************************/
#if 0
int Add;
int main (void)
{
//  Mass erase
  FlashDriverInitialize(0, (char const **)0);
//  FEEMOD= 0x08;
//  FEEADR= 0xFFC3;
//  FEEDAT= 0x3CFF;
//  FEECON= 0x06; // Mass-Erase command
//  while (!(FEESTA & 0x01)){}; //Wait for command to finish
/*
  FEE1MOD= 0x08;
  FEE1ADR= 0xFFC3;
  FEE1DAT= 0x3CFF;
  FEE1CON= 0x06; // Mass-Erase command
  while (!(FEE1STA & 0x01)){}; //Wait for command to finish
*/
// Write test
  for (Add = 0; Add < 0x1000; ++Add)
  {
    FlashWriteByte(Add,0xFFFF);
  }
  FlashWriteByte(Add, -1);
  return(0);
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -