|
本帖最后由 Antecer 于 2016-1-10 11:49 编辑
以下是我用于测试的代码:- #include <xc.h>
- // CONFIG1
- #pragma config FOSC = INTOSC // Oscillator Selection Bits (INTOSC oscillator: I/O function on CLKIN pin)
- #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
- #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
- #pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
- #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
- #pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
- #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
- #pragma config IESO = OFF // Internal/External Switchover Mode (Internal/External Switchover Mode is disabled)
- #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)
- // CONFIG2
- #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
- #pragma config CPUDIV = NOCLKDIV// CPU System Clock Selection Bit (NO CPU system divide)
- #pragma config USBLSCLK = 48MHz // USB Low SPeed Clock Selection bit (System clock expects 48 MHz, FS/LS USB CLKENs divide-by is set to 8.)
- #pragma config PLLMULT = 3x // PLL Multipler Selection Bit (3x Output Frequency Selected)
- #pragma config PLLEN = ENABLED // PLL Enable Bit (3x or 4x PLL Enabled)
- #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
- #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
- #pragma config LPBOR = OFF // Low-Power Brown Out Reset (Low-Power BOR is disabled)
- #pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)
- #define UINT8 unsigned char
- #define UINT16 unsigned int
- #define NV_MEM_SIZE 32
- extern const unsigned char NVMEM[NV_MEM_SIZE];
- #define NV_ADDRESS (0x2000U - NV_MEM_SIZE)
- const UINT8 NVMEM[NV_MEM_SIZE]@NV_ADDRESS = {
- 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
- 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13,
- 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b,
- 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23
- };
- UINT8 GetData[NV_MEM_SIZE];
- void ReadFlash(UINT16 FlashAddr, UINT8 *Data, UINT8 DataLength) {
- PMADR = FlashAddr; //读取数据的首地址
- for (UINT8 i = 0; i < DataLength; i++) //循环读取连续数据
- {
- CFGS = 0;
- RD = 1;
- NOP();
- NOP();
- *Data = PMDATL; //取数据低8位存入数组
- PMADR++;
- Data++;
- }
- }
- void UnlockFlash(){
- PMCON2 = 0x55;
- PMCON2 = 0xAA;
- WR = 1;
- NOP();
- NOP();
- }
- void EraseFlash(UINT16 address){
- OSCCON = 0b11101100; //切换到1MHz x 3PLL;
- GIE = 0;
- PMCON1bits.CFGS = 0;
- PMADR = address;
- PMCON1bits.FREE = 1; //启用程序闪存擦除启用
- PMCON1bits.WREN = 1; //允许编程
- UnlockFlash(); //解锁序列
- PMCON1bits.WREN = 0; //禁止编程
- GIE = 1;
- }
- void main(void) {
- ReadFlash(NV_ADDRESS,GetData,NV_MEM_SIZE);
- EraseFlash(NV_ADDRESS);
- while (1);
- }
复制代码
|
|