#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;//定义接口时序
第二步,切换主机时钟为主时钟。