📄 main.c
字号:
/*********************************************************
External Bus Selection Register
EBSR: 1 0 0 0 0 0 0 0 0 0 0 0 0
* 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
* EGCR: - - - - - F1 F0 - WPE - EN - ARDY HOLD HOLDA NOHOLD
* F1F0: 00b CPU时钟频率 01b CPU的1/2频率
* WPE :
* EN : 时钟输出允许
* ADRY: 外部准备信号[读]
* HOLD: 外部请求保持
* HOLDA: CPU应答外部请求
* NOHOLD: 外部请求允许 1:不允许 0:允许
* 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
* CEn1 : - MEMORY TYPE [11-8:READ SETUP] [7-2:READ STROBE] [1-0: READ HOLD]
* MEMORT TYPE: 000:8位异步存储器
001:16位异步存储器
010:32位异步存储器
011:32位同步DRAM(SDRAM)
100:32位同步突发RAM(SBSRAM)
* READ SETUP : 读数据建立时间 (1<=time<=15) 用于异步
* READ STROBE: 读数据选通时间 (1<=time<=63) 用于异步
* READ HOLD : 读数据保持时间 (0<=time<=3) 用于异步
* 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
* CEn2 : READ EXT HOLD [WRITE EXT HOLD] [WRITE SETUP] [7-2:WRITE STROBE] WRITE HOLD
* READ EXT HOLD : 读外部数据保持时间 (0<=time<=3) 用于异步
* CEn3 : 15-8 7-0
保留 TIMEOUT
* TIMEOUT : 超时时间 (0<=time<=255) 0:关闭
1 0 1 1 0 0 1 0 1 0 1 1 0 0 0
* 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
* SDC1: [15-11:TRC] SDSIZE SDWID RFEN [7-4:TRCD] [0-3:TRP]
* TRC :
* SDSIZE:SDWID: 00b 4M x 16 bits (64M bits)
10b 8M x 16 bits (128M bits)
* RFEN: 自动更新命令 1:允许
* 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
* SDC2: [15-11:TRC] SDACC TMRD RFEN [7-4:TRAS] [0-3:TACTV2ACTV]
*
**********************************************************/
void SDRAM_init( void )
{
ioport unsigned int *ebsr =(unsigned int *)0x6c00; //
ioport unsigned int *egcr =(unsigned int *)0x800;
ioport unsigned int *emirst=(unsigned int *)0x801; // EMIF 复位寄存器 写任何数据都可复位
//ioport unsigned int *emibe =(unsigned int *)0x802; // 错误寄存器
ioport unsigned int *ce01 =(unsigned int *)0x803;
//ioport unsigned int *ce02 =(unsigned int *)0x804;
//ioport unsigned int *ce03 =(unsigned int *)0x805;
ioport unsigned int *ce11 =(unsigned int *)0x806;
//ioport unsigned int *ce12 =(unsigned int *)0x807;
//ioport unsigned int *ce13 =(unsigned int *)0x808;
ioport unsigned int *ce21 =(unsigned int *)0x809;
//ioport unsigned int *ce22 =(unsigned int *)0x80A;
//ioport unsigned int *ce23 =(unsigned int *)0x80B;
ioport unsigned int *ce31 =(unsigned int *)0x80C;
//ioport unsigned int *ce32 =(unsigned int *)0x80D;
//ioport unsigned int *ce33 =(unsigned int *)0x80E;
ioport unsigned int *sdc1 =(unsigned int *)0x80F;
//ioport unsigned int *sdper =(unsigned int *)0x810; // 设定 CLKMEN 的周期
//ioport unsigned int *sdcnt =(unsigned int *)0x811; // 当前 CLKMEN 的周期
ioport unsigned int *init =(unsigned int *)0x812; // EMIF 初始化寄存器 写任何数据都可初始化
ioport unsigned int *sdc2 =(unsigned int *)0x813;
//ioport unsigned int *sdc3 =(unsigned int *)0x814;[此寄存器只用于5510,5509中无]
*ebsr = 0x221;//221//1321 // ** 全EMIF模式 Pallel Port
*egcr = 0x220; // ** EMIF 全局控制寄存器
*ce01 = 0x3000; // **
*ce11 = 0x1fff;
*ce21 = 0x1fff;
*ce31 = 0x1fff;
*emirst = 0; // ** 复位 EMIF
*sdc1 = 0x5958; // ** SDRAM 控制器
*sdc2 = 0x38F;
*init = 0; // ** 启动 EMIF
}
void delay(unsigned int t){
unsigned int i;
for (; t != 0; t--) for (i=1000; i != 0; i--);
}
void writeSRAM(unsigned long addr,unsigned int dat)
{
/* addr <<= 1;
if ((addr>>14)&0x1) addr++;
addr&=0x3FFFFF;
*/
*((unsigned int *)0x40000+addr) = dat;
}
unsigned int readSRAM(unsigned long addr)
{
/* addr <<= 1;
if ((addr>>14)&0x1) addr++;
addr&=0x3FFFFF;
*/
return *((unsigned int *)0x40000+addr);
}
main()
{
unsigned int i,array[5];;
SDRAM_init();
delay(1);
for (i = 0; i!= 5; i++) // 1111111111111111111001
writeSRAM(0x0FFFF0+i,i); // 1111111111111111111100
for (i = 0; i!= 5; i++)
array[i] = readSRAM(0x0FFFF0+i);
while(1)
{
asm(" bclr XF ");
delay(100);
asm(" bset XF ");
delay(100);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -