发个修改后可用的程序来,请大家指正。<br /><br />使用方法,在keil安装目录中的ARMFLASH目录中新建一个目录,从FLASH目录下的其他目录(如AM29F160DB)中拷贝所有文件到这个新建的目录中,然后修改项目名称。打开项目,将里面的FlashPrg.C和FlashDev.C替换掉,修改项目option中的output的名字和user中的文件名,编译后就可以选择使用AM29LV160DB了。<br />/***********************************************************************/<br />/* This file is part of the ARM Toolchain package */<br />/* Copyright KEIL ELEKTRONIK GmbH 2003 - 2004 */<br />/***********************************************************************/<br />/* */<br />/* FlashPrg.C: Flash Programming Functions adapted */<br />/* for AM29LV160DB (16-bit Bus) */<br />/* */<br />/***********************************************************************/<br /><br />#include "..FlashOS.H" // FlashOS Structures<br /><br />#define M8(adr) (*((volatile unsigned char *) (adr)))<br />#define M16(adr) (*((volatile unsigned short *) (adr)))<br />#define M32(adr) (*((volatile unsigned long *) (adr)))<br /><br />#define STACK_SIZE 64 // Stack Size<br /><br /><br />union fsreg { // Flash Status Register<br /> struct b {<br /> unsigned int q0:1;<br /> unsigned int q1:1;<br /> unsigned int q2:1;<br /> unsigned int q3:1;<br /> unsigned int q4:1;<br /> unsigned int q5:1;<br /> unsigned int q6:1;<br /> unsigned int q7:1;<br /> } b;<br /> unsigned int v;<br />} fsr;<br /><br />unsigned long base_adr;<br /><br /><br />/*<br />* Check if Program/Erase completed<br />* Parameter: adr: Block Start Address<br />* Return Value: 0 - OK, 1 - Failed<br />*/<br /><br />/*int Polling (unsigned long adr) {<br /> unsigned int q6;<br /><br /> fsr.v = M16(adr);<br /> q6 = fsr.b.q6;<br /> do {<br /> fsr.v = M16(adr);<br /> if (fsr.b.q6 == q6) return (0); // Done<br /> q6 = fsr.b.q6;<br /> } while (fsr.b.q5 == 0); // Check for Timeout<br /> fsr.v = M16(adr);<br /> q6 = fsr.b.q6;<br /> fsr.v = M16(adr);<br /> if (fsr.b.q6 == q6) return (0); // Done<br /> M16(adr) = 0xF0; // Reset Device<br /> return (1); // Failed<br />} */<br />int Polling (unsigned long adr) {<br /> unsigned int q6;<br /><br /> // Check Toggle Bit<br /> do {<br /> fsr.v = M16(adr);<br /> q6 = fsr.b.q6;<br /> fsr.v = M16(adr);<br /> } while (fsr.b.q6 != q6);<br /> return (0); // Done<br />}<br /><br /><br />/*<br />* Initialize Flash Programming Functions<br />* Parameter: adr: Device Base Address<br />* clk: Clock Frequency (Hz)<br />* Return Value: 0 - OK, 1 - Failed<br />*/<br /><br />int Init (unsigned long adr, unsigned long clk,unsigned long fnc) {<br /> base_adr = adr;<br /> return (0);<br />}<br /><br /><br />/*<br />* De-Initialize Flash Programming Functions<br />* Return Value: 0 - OK, 1 - Failed<br />*/<br /><br />int UnInit (unsigned long fnc) {<br /> return (0);<br />}<br /><br /><br />/*<br />* Erase complete Flash Memory <br />* Return Value: 0 - OK, 1 - Failed<br />*/<br /><br />int EraseChip (void) {<br /><br /> // Start Chip Erase Command<br /> M16(base_adr + (0x555<<1)) = 0xAA;<br /> M16(base_adr + (0x2AA<<1)) = 0x55;<br /> M16(base_adr + (0x555<<1)) = 0x80;<br /> M16(base_adr + (0x555<<1)) = 0xAA;<br /> M16(base_adr + (0x2AA<<1)) = 0x55;<br /> M16(base_adr + (0x555<<1)) = 0x10;<br /><br /> return (Polling(base_adr)); // Wait until Erase completed<br />}<br /><br /><br />/*<br />* Erase Sector in Flash Memory<br />* Parameter: adr: Sector Address<br />* Return Value: 0 - OK, 1 - Failed<br />*/<br /><br />int EraseSector (unsigned long adr) {<br /><br /> // Start Erase Sector Command<br /> M16(base_adr + (0x555<<1)) = 0xAA;<br /> M16(base_adr + (0x2AA<<1)) = 0x55;<br /> M16(base_adr + (0x555<<1)) = 0x80;<br /> M16(base_adr + (0x555<<1)) = 0xAA;<br /> M16(base_adr + (0x2AA<<1)) = 0x55;<br /> M16(adr) = 0x30;<br /><br /> do {<br /> fsr.v = M16(adr);<br /> } while (fsr.b.q3 == 0); // Wait for Sector Erase Timeout<br /><br /> return (Polling(adr)); // Wait until Erase completed<br />}<br /><br /><br />/*<br />* Program Page in Flash Memory<br />* Parameter: adr: Page Start Address<br />* sz: Page Size<br />* buf: Page Data<br />* Return Value: 0 - OK, 1 - Failed<br />*/<br /><br />int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {<br /> int i;<br /><br /> for (i = 0; i < ((sz+1)/2); i++) {<br /> // Start Program Command<br /> M16(base_adr + (0x555<<1)) = 0xAA;<br /> M16(base_adr + (0x2AA<<1)) = 0x55;<br /> M16(base_adr + (0x555<<1)) = 0xA0;<br /> M16(adr) = *((unsigned short *) buf);<br /> if (Polling(adr) != 0) return (1);<br /> buf += 2;<br /> adr += 2;<br /> }<br /> return (0);<br />}<br /><br /><br />/***********************************************************************/<br />/* This file is part of the ARM Toolchain package */<br />/* Copyright KEIL ELEKTRONIK GmbH 2003 - 2004 */<br />/***********************************************************************/<br />/* */<br />/* FlashDev.C: Device Description for AM29LV160DB (16-bit Bus) */<br />/* */<br />/***********************************************************************/<br /><br />#include "..FlashOS.H" // FlashOS Structures<br /><br /><br />struct FlashDevice const FlashDevice = {<br /> FLASH_DRV_VERS, // Driver Version, do not modify!<br /> "AM29LV160DB Flash", // Device Name<br /> EXT16BIT, // Device Type<br /> 0x000000, // Device Start Address<br /> 0x200000, // Device Size in Bytes (2MB)<br /> 1024, // Programming Page Size<br /> 0, // Reserved, must be 0<br /> 0xFF, // Initial Content of Erased Memory<br /> 100, // Program Page Timeout 100 mSec<br /> 3000, // Erase Sector Timeout 3000 mSec<br /><br />// Specify Size and Address of Sectors<br /> 0x10000, 0x000000, // Sector Size 64kB (31 Sectors)<br /> 0x08000, 0x1F0000, // Sector Size 32kB (1 Sector)<br /> 0x02000, 0x1F8000, // Sector Size 8kB (2 Sectors)<br /> 0x04000, 0x1FC000, // Sector Size 16kB (1 Sector)<br /> SECTOR_END<br />};<br /> |
|