//============================================================================
//该程序执行片内FLASH的读写操作,将0-9十个数写入到起始地址为0X1000的FLASH空间中.
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <c8051f410.h> // Header file for SiLabs c8051f320 
 // Header file for USB_API.lib
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F32x
//-----------------------------------------------------------------------------
sfr16 DP = 0x82; // data pointer
sfr16 TMR2RL = 0xca; // Timer2 reload value
sfr16 TMR2 = 0xcc; // Timer2 counter
sfr16 TMR3 = 0x94; // Timer3 counter
sfr16 TMR3RL = 0x92; // Timer3 reload value
sfr16 PCA0CP0 = 0xfb; // PCA0 Module 0 Capture/Compare
sfr16 PCA0CP1 = 0xe9; // PCA0 Module 1 Capture/Compare
sfr16 PCA0CP2 = 0xeb; // PCA0 Module 2 Capture/Compare
sfr16 PCA0CP3 = 0xed; // PCA0 Module 3 Capture/Compare
sfr16 PCA0CP4 = 0xfd; // PCA0 Module 4 Capture/Compare
sfr16 PCA0 = 0xf9; // PCA0 counter
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void) 
{
 unsigned char xdata *pwrite; // pointer to FLASH used for writes
 // NOTE: this pointer must be located
 // in <data> or <idata> space!
 unsigned char code *pread; // pointer to FLASH used for reads
 char EA_save; // saves the current state of the
 // interrupt enable bit.
 // test string
unsigned char code test_string[] = "012345678901111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222223333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333344444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555666666666666666666666666666666666666666666666666666666666666666666666666677777777777777777777777777777777777777777777777777777777777777777777777777777777777777778888888888888888888888888888888888888888888888888888888888888888888888888899999999999999999999999999999999999999999999!";
 
 PCA0MD &= ~0x40;//禁止看门狗定时器
 OSCICN = 0x86;//时钟分24.5M的2分频12.25M
 // Disable Watchdog timer
 
 
 RSTSRC |= 0x02; // enable the VDD monitor
 // Disable Watchdog timer // WDTE = 0 (clear watchdog timer
 // enable)
 // erase the FLASH page at 0x1000
 EA_save = EA;
 EA = 0; // disable interrupts (precautionary)
 // initialize write/erase pointer
 pwrite = (unsigned char xdata *) 0x1000;
 PSCTL = 0x03; // MOVX writes erase FLASH page
 FLKEY = 0xA5; // FLASH lock and key sequence 1
 FLKEY = 0xF1; // FLASH lock and key sequence 2
 *pwrite = 0; // initiate page erase
 PSCTL = 0; // MOVX writes target XRAM
 EA = EA_save; // re-enable interrupts
 // copy a string to FLASH memory at address 0x1000
 // initialize FLASH read pointer
 pread = (unsigned char code *) test_string;
 EA_save = EA;
 EA = 0; // disable interrupts (precautionary)
 pwrite = 0x1000; // initialize FLASH write pointer
 PSCTL = 0x01; // MOVX writes target FLASH memory
 while (*pread != '\0') // copy until NULL is detected
 { 
 FLKEY=0xA5;//FLASHlockandkeysequence1
 FLKEY=0xF1;//FLASHlockandkeysequence2
 *pwrite=*pread;//copybyte
 pread++;//advancepointers
 pwrite++;
 }
 FLKEY = 0xA5; // FLASH lock and key sequence 1
 FLKEY = 0xF1; // FLASH lock and key sequence 2
 *pwrite = '\0'; // NULL-terminate string
 PSCTL = 0x00; // MOVX writes target XRAM
 EA = EA_save; // re-enable interrupts 
 
 
 
while (1) 
 { // spin forever
}
}