adan1234567 发表于 2010-11-11 15:05:28

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 发表于 2010-11-11 15:13:25

回复【楼主位】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++;
        }
}

adan1234567 发表于 2010-11-11 15:19:41

开发环境在KEIL的MDK4.13中.

adan1234567 发表于 2010-11-11 15:35:26

反汇编代码如下:

    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

adan1234567 发表于 2010-11-12 15:17:02

问题已解决,原来是将nWBE0、nWBE1搞颠倒了。
页: [1]
查看完整版本: S3C44B0X中读字节数组出现的问题