?? pflash.c
字號:
/*
------------------------------------------------------------------------------
This file is part of the C166 Compiler package
Copyright KEIL ELEKTRONIK GmbH 2004
Version 1.00
------------------------------------------------------------------------------
PFLASH.C: Programming Routines for PFlash area in XC16x device.
Available Functions:
PFlash_Write: Write 64 Bytes to the PFlash area
PFlash_Erase: Erase Sector in the PFlash area
Check: Wait until the device is done with an operation
------------------------------------------------------------------------------
*/
#include <XC16X.h> // XC16x Special Function Registers
#include <absacc.h> // Absolute Memory Access
#define AC_STEP 3 // AC Step Chip Revision
#define FSR 0xFFF000 // Flash Status Register Address
#pragma RENAMECLASS (FCODE=FLASH_CODE)
union fsreg { // Flash Status Register
struct b {
unsigned short busy : 1;
unsigned short prog : 1;
unsigned short erase : 1;
unsigned short page : 1;
unsigned short oper : 1;
unsigned short res5 : 1;
unsigned short sqer : 1;
unsigned short proer : 1;
unsigned short sber : 1;
unsigned short dber : 1;
unsigned short prodi : 1;
unsigned short proin : 1;
unsigned short sul : 1;
} b;
unsigned short v;
};
unsigned long const base = 0xC00000; // Device Base Address
/*
* Check Status of Flash Device
* Return Value: 0 - OK, 1 - Failed
*/
int Check (void) {
union fsreg fsr;
do {
fsr.v = HVAR(unsigned short, FSR); // Read FSR
} while (fsr.b.busy); // Wait until Flash is Busy
if (fsr.b.oper || fsr.b.sqer || fsr.b.proer) {
HVAR(unsigned short, base | 0xAA) = 0xF0; // Reset to Read Mode
return (1); // Failed
}
if (fsr.b.prog || fsr.b.erase) {
HVAR(unsigned short, base | 0xAA) = 0xF5; // Clear Status
}
return (0); // Done
}
/*
* Erase Block in Flash Memory
* Parameter: adr: Block Address
* Return Value: 0 - OK, 1 - Failed
*/
int PFlash_Erase (unsigned long adr) {
HVAR(unsigned short, base | 0xAA) = 0x80; // Erase Sector (1. Cycle)
HVAR(unsigned short, base | 0x54) = 0xAA; // Erase Sector (2. Cycle)
HVAR(unsigned short, adr) = 0x33; // Erase Sector (3. Cycle)
return (Check()); // Check until Device Ready
}
/*
* Program Block in Flash Memory
* Parameter: adr: Block Address
* buf: Block Data
* Return Value: 0 - OK, 1 - Failed
*/
int PFlash_Write (unsigned long adr, void near *buf) {
unsigned int rev;
unsigned int cnt;
rev = IDCHIP & 0x0F; // Read Chip Revision
// Enter Page Mode
HVAR(unsigned short, base | 0xAA) = 0x50;
if (rev >= AC_STEP) {
HVAR(unsigned short, adr) = 0xAA;
}
// Load Page
for (cnt = 0; cnt < 64; cnt++) {
HVAR(unsigned short, base | 0xF2) = *((unsigned short near *) buf);
buf = (unsigned short near *) buf+1;
}
// Write Page
HVAR(unsigned short, base | 0xAA) = 0xA0;
if (rev >= AC_STEP)
HVAR(unsigned short, base | 0x5A) = 0xAA;
else
HVAR(unsigned short, adr) = 0xAA;
return (Check()); // Check until Device Ready
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -