NorFlash的读写程序

#include"at91rm9200.h"
unsigned short *sp=(unsigned short *)0x10000000;  //short占用2个字节


void pio_init()
{
 AT91C_BASE_SYS->PIOA_PDR=0XC0000000;
 AT91C_BASE_SYS->PIOA_ASR=0XC0000000;//发送端口
}


void dbgu_init()//ok
{
 AT91C_BASE_SYS->DBGU_CR=0X10C;//复位
 AT91C_BASE_SYS->DBGU_CR=0X50;
 AT91C_BASE_SYS->DBGU_MR=0X800;//模式
 AT91C_BASE_SYS->DBGU_BRGR=0X78;//波特率9600 直接调试的
}


void ebi_init()
{
 AT91C_BASE_SYS->EBI_CSA=0X00;//片选0
 AT91C_BASE_SYS->EBI_CFGR=0X00;
}

void smc_init()
{
 AT91C_SMC2_CSR[0]=0X77003FFF;
}


void send_char(char temp)   //发送单个字符
{
 if(temp<10)          //0 1 2 3 4 5 6 7 8 9
  temp=temp+48;    //‘0‘的ASCII码为48(十进制的)
 else                 //A B C D E F
  temp=temp+55;    //’A’的ASCII码为65(十进制的)
 while((AT91C_BASE_SYS->DBGU_CSR & 0X02)==0);//发送就绪
 AT91C_BASE_SYS->DBGU_THR=temp;
}


//**********擦出*****************
void erase_one_sector()
{
 unsigned short DQ7;
 *(sp+0x555)=0xAA;
 *(sp+0x2AA)=0X55;
 *(sp+0x555)=0x80;
 *(sp+0x555)=0xAA;
 *(sp+0x2AA)=0X55;
 *(sp+0x10000)=0x50;
 do
 {
  DQ7=((*(sp+0x10000)) & 0x80);
 }
 while(DQ7==0); //st_DQ7为1时说明擦出结束 
}


//*********写入数据*******************
void write_data()
{
 unsigned short DQ7;
 *(sp+0x555)=0xAA;
 *(sp+0x2AA)=0x55;
 *(sp+0x555)=0xA0;
 *(sp+0x10000)='j';
 do
 {
  DQ7=((*(sp+0x10000)) & 0x80);
 }
 while(DQ7==0x80); //st_DQ7为1时 写结束

 *(sp+0x555)=0xAA;
 *(sp+0x2AA)=0x55;
 *(sp+0x555)=0xA0;
 *(sp+0x10001)='i';
 do
 {
  DQ7=((*(sp+0x10001)) & 0x80);
 }
 while(DQ7==0x80); //st_DQ7为1时 写结束
 
 *(sp+0x555)=0xAA;
 *(sp+0x2AA)=0x55;
 *(sp+0x555)=0xA0;
 *(sp+0x10002)='a';
 do
 {
  DQ7=((*(sp+0x10002)) & 0x80);
 }
 while(DQ7==0x80); //st_DQ7为1时 写结束
 
 *(sp+0x555)=0xAA;
 *(sp+0x2AA)=0x55;
 *(sp+0x555)=0xA0;
 *(sp+0x10003)='n';
 do
 {
  DQ7=((*(sp+0x10003)) & 0x80);
 }
 while(DQ7==0x80); //st_DQ7为1时 写结束
 

 *(sp+0x555)=0xAA;
 *(sp+0x2AA)=0x55;
 *(sp+0x555)=0xA0;
 *(sp+0x10004)='g';
 do
 {
  DQ7=((*(sp+0x10004)) & 0x80);
 }
 while(DQ7==0x80); //st_DQ7为1时 写结束

}


//*********终端显示数据*********************************
void print_data() 
{
 while((AT91C_BASE_SYS->DBGU_CSR & 0X02)==0);//发送就绪
 AT91C_BASE_SYS->DBGU_THR=*(sp+0x10000);
 
 while((AT91C_BASE_SYS->DBGU_CSR & 0X02)==0);//发送就绪
 AT91C_BASE_SYS->DBGU_THR=*(sp+0x10001);
 
 while((AT91C_BASE_SYS->DBGU_CSR & 0X02)==0);//发送就绪
 AT91C_BASE_SYS->DBGU_THR=*(sp+0x10002);
 
 while((AT91C_BASE_SYS->DBGU_CSR & 0X02)==0);//发送就绪
 AT91C_BASE_SYS->DBGU_THR=*(sp+0x10003);
 
 while((AT91C_BASE_SYS->DBGU_CSR & 0X02)==0);//发送就绪
 AT91C_BASE_SYS->DBGU_THR=*(sp+0x10004);
}


int main()
{
 pio_init();
 ebi_init();
 smc_init();
 dbgu_init(); 
 
 erase_one_sector();  //擦出扇区  扇区的地址
 
 write_data();   //写数据 
 
 print_data();  //串口发送数据
 
 while(1);
}

 

---------------------------------------------------------------------------------------------

NOR Flash中主要固化的是Bootloader引导程序和一些简单的用户程序,如果系统不基于Linux
作系统,可将uC/OS-II固化于其中。
系统使用16位外部引导模式(复位时BMS=0),即从NCS0为片选的16位外部存储器执行程
,该NCS0所指向的地址空间为0x10000000-0x101fffff,重映射前,地址0x00000000-0x000fffff
1M字节内部存储空间又被映射为NCS0所对应的空间。
由于系统上电时采用32768Hz的慢时钟工作,所以在把主机时钟切换到180MHz主时钟之前,
须设置好EBI的存储器参数,以防止引导时因总线接口时序不匹配导致程序跑飞。
第一步,配置NCS0静态存储器参数:
AT91C_BASE_EBI->EBI_CSA|=AT91C_EBI_CS0A_SMC;//NSC0=SMC
AT91C_BASE_EBI->EBI_CFGR=(AT91C_EBI_DBPUC&0x00)|(AT91C_EBI_EBSEN&0x00);
AT91C_BASE_SMC2->SMC2_CSR[0]=(AT91C_SMC2_NWS&0x4)|
AT91C_SMC2_WSEN|
(AT91C_SMC2_TDF&0x200)|
AT91C_SMC2_BAT|
AT91C_SMC2_DBW_16;//定义接口时序
第二步,切换主机时钟为主时钟。

你可能感兴趣的:(atmel,Linux,驱动,bootloader)