?? aduc70xxflash.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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -