搜索
bottom↓
回复: 4

S3C44B0X中读字节数组出现的问题

[复制链接]

出0入0汤圆

发表于 2010-11-11 15:05:28 | 显示全部楼层 |阅读模式
最近接触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
}

出0入0汤圆

 楼主| 发表于 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[8];
unsigned char bbb[8];
unsigned char k=0;

unsigned char k=0;
main(void)
{
        s3c44b0_init();
        while(1)
        {
                aaa[i&0x07] = i+1;
                k = aaa[i&0x07];
                bbb[i&0x07] = k;
                i++;
        }
}

出0入0汤圆

 楼主| 发表于 2010-11-11 15:19:41 | 显示全部楼层
开发环境在KEIL的MDK4.13中.

出0入0汤圆

 楼主| 发表于 2010-11-11 15:35:26 | 显示全部楼层
反汇编代码如下:

    95:                 aaa[i&0x07] = i+1;
0x0C000380  E2820001  ADD       R0,R2,#0x00000001
0x0C000384  E2021007  AND       R1,R2,#0x00000007
0x0C000388  E59F307C  LDR       R3,[PC,#0x007C]
0x0C00038C  E7C30001  STRB      R0,[R3,R1]
    96:                 k = aaa[i&0x07];
0x0C000390  E2020007  AND       R0,R2,#0x00000007
0x0C000394  E2831000  ADD       R1,R3,#0x00000000
0x0C000398  E7D10000  LDRB      R0,[R1,R0]
0x0C00039C  E59F106C  LDR       R1,[PC,#0x006C]
0x0C0003A0  E5C10000  STRB      R0,[R1]
    97:                 bbb[i&0x07] = k;
0x0C0003A4  E2810000  ADD       R0,R1,#0x00000000
0x0C0003A8  E5D00000  LDRB      R0,[R0]
0x0C0003AC  E2021007  AND       R1,R2,#0x00000007
0x0C0003B0  E59F305C  LDR       R3,[PC,#0x005C]
0x0C0003B4  E7C30001  STRB      R0,[R3,R1]
    98:                 ccc[i&0x07] = k;
0x0C0003B8  E59F0050  LDR       R0,[PC,#0x0050]
0x0C0003BC  E5D00000  LDRB      R0,[R0]
0x0C0003C0  E2021007  AND       R1,R2,#0x00000007
0x0C0003C4  E59F304C  LDR       R3,[PC,#0x004C]
0x0C0003C8  E7C30001  STRB      R0,[R3,R1]
    99:                 i++;
0x0C0003CC  E2820001  ADD       R0,R2,#0x00000001
0x0C0003D0  E20020FF  AND       R2,R0,#0x000000FF

出0入0汤圆

 楼主| 发表于 2010-11-12 15:17:02 | 显示全部楼层
问题已解决,原来是将nWBE0、nWBE1搞颠倒了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-11 02:55

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表