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

📄 pflash.c

📁 xc164 IAP (flash in chip)例子
💻 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 res12 : 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 + -