S3C44B0X中读字节数组出现的问题
最近接触ARM的开发,系统使用 S3C44B0X(CPU) + S29AL032D( 4MB FLASH) + K4S281632K(16MB SDRAM) 配置.读CHAR型数组时发现读出的内容与写入的内容不一致,读INT型数组时内容又是相同的.这是怎么回事.本人第一次使用ARM单片机,原来一直用51单片机.对这个问题一头雾水,望那位高人指点一下,万分感谢!
以下是我的代码有几个地方不清楚,主要是关于SDRAM的配置问题.
void s3c44b0_init(void)
{
// Watchdog Timer
WTCNT = 0x8000;
WTDAT = 0x8000;
WTCON = 0x8000; // WT disable
// interrupt
INTMSK = 0xffffffff; // all interrupt disable
// Clock and Power Management
LOCKTIME = 0x00000fff; // LOCK TIME COUNT REGISTER
PLLCON = 0x00034080; // Fpllo = 60MHZ晶振10MHZ 倍频到60 MHZ
CLKCON = 0x7ff8;
CLKSLOW = 0X09;
// Memory Controller
BWSCON = 0x01000002; // bank6 (0X0C000000 ~ 0X01000000)总线16位宽,零等待,不使用UB/LB。
?????? 使用UB/LB 与 不使用UB/LB 有区别吗?
// bank0 (0x00000000 ~ 0X00400000)总线16位宽。
BANKCON0 = 0x00000600;
BANKCON1 = 0x00000700;
BANKCON2 = 0x00000700;
BANKCON3 = 0x00000700;
BANKCON4 = 0x00000700;
BANKCON5 = 0x00000700;
BANKCON6 = 0x00018009;
BANKCON7 = 0x00018009;
REFRESH= 0x00A60591;
BANKSIZE = 0x00000000;
MRSRB6 = 0x20;
MRSRB7 = 0x20;
// I/O Port
GPACON = 0x000003FF;
GPBCON = 0x000007FF;
GPCCON = 0x4F155545; // FLASH_WP = INPUT GPC14
GPCUP= 0x00000000; // 0 = Pull-up Enabled
GPDCON = 0x00005554;
GPDUP= 0x00000000; // 0 = Pull-up Enabled
GPECON = 0x00004068;
GPEUP= 0x00000000; // 0 = Pull-up Enabled
GPFCON = 0x0008044A;
GPFUP= 0x00000000; // 0 = Pull-up Enabled
GPGCON = 0x00000000;
GPGUP= 0x00000000; // 0 = Pull-up Enabled
SPUCR= 0x00000004;
// interrupt
INTCON = 0x00; // Vectored interrupt mode IRQ interrupt enable FIQ interrupt enable
INTMOD = 0; // IRQ mode
I_ISPC = 0x3ffffff; //
INTMSK = ~INT_GLOBAL; // Global Interrupt Enable
} 回复【楼主位】adan1234567
-----------------------------------------------------------------------
刚才问题没说完,重新来一次.
最近接触ARM的开发,系统使用 S3C44B0X(CPU) + S29AL032D( 4MB FLASH) + K4S281632K(16MB SDRAM) 配置.读CHAR型数组时发现读出的内容与写入的内容不一致,读INT型数组时内容又是相同的.这是怎么回事.
本人第一次使用ARM单片机,原来一直用51单片机.对这个问题一头雾水,望那位高人指点一下,万分感谢!
以下是我的代码有几个地方不清楚,主要是关于SDRAM的配置问题.
void s3c44b0_init(void)
{
// Watchdog Timer
WTCNT = 0x8000;
WTDAT = 0x8000;
WTCON = 0x8000; // WT disable
// interrupt
INTMSK = 0xffffffff; // all interrupt disable
// Clock and Power Management
LOCKTIME = 0x00000fff; // LOCK TIME COUNT REGISTER
PLLCON = 0x00034080; // Fpllo = 60MHZ晶振10MHZ 倍频到60 MHZ
CLKCON = 0x7ff8;
CLKSLOW = 0X09;
// Memory Controller
BWSCON = 0x01000002; // SDRAM 空间 bank6 (0X0C000000 ~ 0X01000000)总线16位宽,零等待,不使用UB/LB。
// ?????? 使用UB/LB 与 不使用UB/LB 有区别吗?
// FLASH 空间 bank0 (0x00000000 ~ 0X00400000)总线16位宽。
BANKCON0 = 0x00000600;
BANKCON1 = 0x00000700;
BANKCON2 = 0x00000700;
BANKCON3 = 0x00000700;
BANKCON4 = 0x00000700;
BANKCON5 = 0x00000700;
BANKCON6 = 0x00018009;
BANKCON7 = 0x00018009;
REFRESH= 0x00A60591; ?????? 591 代表什么意思?
BANKSIZE = 0x00000000;
MRSRB6 = 0x20;
MRSRB7 = 0x20;
// I/O Port
GPACON = 0x000003FF;
GPBCON = 0x000007FF;
GPCCON = 0x4F155545; // FLASH_WP = INPUT GPC14
GPCUP= 0x00000000; // 0 = Pull-up Enabled
GPDCON = 0x00005554;
GPDUP= 0x00000000; // 0 = Pull-up Enabled
GPECON = 0x00004068;
GPEUP= 0x00000000; // 0 = Pull-up Enabled
GPFCON = 0x0008044A;
GPFUP= 0x00000000; // 0 = Pull-up Enabled
GPGCON = 0x00000000;
GPGUP= 0x00000000; // 0 = Pull-up Enabled
SPUCR= 0x00000004;
// interrupt
INTCON = 0x00; // Vectored interrupt mode IRQ interrupt enable FIQ interrupt enable
INTMOD = 0; // IRQ mode
I_ISPC = 0x3ffffff; //
INTMSK = ~INT_GLOBAL; // Global Interrupt Enable
}
unsigned char i=0;
unsigned char aaa;
unsigned char bbb;
unsigned char k=0;
unsigned char k=0;
main(void)
{
s3c44b0_init();
while(1)
{
aaa = i+1;
k = aaa;
bbb = k;
i++;
}
} 开发环境在KEIL的MDK4.13中. 反汇编代码如下:
95: aaa = i+1;
0x0C000380E2820001ADD R0,R2,#0x00000001
0x0C000384E2021007AND R1,R2,#0x00000007
0x0C000388E59F307CLDR R3,
0x0C00038CE7C30001STRB R0,
96: k = aaa;
0x0C000390E2020007AND R0,R2,#0x00000007
0x0C000394E2831000ADD R1,R3,#0x00000000
0x0C000398E7D10000LDRB R0,
0x0C00039CE59F106CLDR R1,
0x0C0003A0E5C10000STRB R0,
97: bbb = k;
0x0C0003A4E2810000ADD R0,R1,#0x00000000
0x0C0003A8E5D00000LDRB R0,
0x0C0003ACE2021007AND R1,R2,#0x00000007
0x0C0003B0E59F305CLDR R3,
0x0C0003B4E7C30001STRB R0,
98: ccc = k;
0x0C0003B8E59F0050LDR R0,
0x0C0003BCE5D00000LDRB R0,
0x0C0003C0E2021007AND R1,R2,#0x00000007
0x0C0003C4E59F304CLDR R3,
0x0C0003C8E7C30001STRB R0,
99: i++;
0x0C0003CCE2820001ADD R0,R2,#0x00000001
0x0C0003D0E20020FFAND R2,R0,#0x000000FF 问题已解决,原来是将nWBE0、nWBE1搞颠倒了。
页:
[1]