对于ARM嵌入式系统教程的外部存储器接口实验的半字(16位)数据编程的解释:
#include
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned int uint32;
#define TRUE 1
#define FALSE 0
#define FLASH_ADDR 0x81000000 //FLASH的起始地址(分配为Bank1块)
#define GetAddr(addr) (volatile uint16 *)(FLASH_ADDR | (addr<<1))
void DelayNS(uint32 dly){
uint32 i,j;
for(i=dly;i>0;i--)
for(j=5000;j>0;j--);
}
uint8 WordProgram(uint32 Addr,uint16 Data){
volatile uint16 *ip;
uint16 temp1,temp2;
ip=GetAddr(0x5555);
ip[0]=0xaaaa;
ip=GetAddr(0x2aaa);
ip[0]=0x5555;
ip=GetAddr(0x5555);
ip[0]=0xa0a0;
ip=(volatile uint16 *)(FLASH_ADDR | (Addr&0x1FFFFFFF));
*ip=Data;
while(1){
temp1=*ip;
temp2=*ip;
if(temp1==temp2){
if(temp1!=Data)
return FALSE;
else
return TRUE;
}
}
}
uint8 ChipErase(void){
volatile uint16 *ip;
uint16 temp1,temp2;
ip=GetAddr(0x5555);
ip[0]=0xaaaa;
ip=GetAddr(0x2aaa);
ip[0]=0x5555;
ip=GetAddr(0x5555);
ip[0]=0x8080;
ip=GetAddr(0x5555);
ip[0]=0xaaaa;
ip=GetAddr(0x2aaa);
ip[0]=0x5555;
ip=GetAddr(0x5555);
ip[0]=0x1010;
while(1){
temp1=*ip;
temp2=*ip;
if(temp1==temp2){
if(temp1!=0xffff)
return FALSE;
else
return TRUE;
}
}
}
int main(void){
uint8 i;
uint8 err=0;
volatile uint16 *addr;
PINSEL0=0x00000000;
IO0DIR=0x00000080;
ChipErase();
addr=(volatile uint16 *)FLASH_ADDR+0;
for(i=0;i<100;i++){
if(0xffff!=(*addr))
err=1;
err++;
}
WordProgram(0x0,0x55AA);
addr=(volatile uint16 *)FLASH_ADDR+0;
if(0x55AA!=(*addr))
err=1;
if(0==err){
IO0CLR=0x00000080;
DelayNS(20);
IO0SET=0x00000080;
DelayNS(20);
}
else{
while(1){
IO0CLR=0x00000080;
DelayNS(20);
IO0SET=0x00000080;
DelayNS(20);
}
}
while(1);
}