天嵌 ARM开发社区

 找回密码
 注册
楼主: mobilefzb

恳求指教!TQ2440的按键控制LED的裸机程序问题

[复制链接]
 楼主| mobilefzb 发表于 2010-10-20 22:29:44 | 显示全部楼层
问题初步解决!!!!
GPFCON = GPFCON & GPF0 & GPF1 & GPF2 & GPF4;

GPFCON = GPFCON & GPF0 & GPF1 & GPF2 & GPF4 | (2 << 4) | (2 << 0) \
                        | (2 << 8) | (2 << 2);
方式都可以点亮led。问题出在赋值上!!
请看代码
        while(1)
        {       
          if(GPFDAT & GPF1_in)
                {
                        GPBDAT = 0x000001f0;
                }
                else
                {
                        GPBDAT = 0x00000000;
                }
             }
        return 0;
}
我去掉了key_data = GPFDAT;!!
这个是上面代码反汇编后while语句里面的代码
7c:        e2033002         and        r3, r3, #2        ; 0x2
  80:        e3530000         cmp        r3, #0        ; 0x0
  84:        0a000004         beq        9c <main+0x84>
  88:        e3a03456         mov        r3, #1442840576        ; 0x56000000
  8c:        e2833014         add        r3, r3, #20        ; 0x14
  90:        e3a02e1f         mov        r2, #496        ; 0x1f0
  94:        e5832000         str        r2, [r3]
  98:        eafffff4         b        70 <main+0x58>
  9c:        e3a03456         mov        r3, #1442840576        ; 0x56000000
  a0:        e2833014         add        r3, r3, #20        ; 0x14
  a4:        e3a02000         mov        r2, #0        ; 0x0
  a8:        e5832000         str        r2, [r3]
下面这个是添加了key_data = GPFDAT;且将while循环内的if语句的GPFDAT换为key_data后的反汇编代码:
70:        e3a03456         mov        r3, #1442840576        ; 0x56000000
  74:        e2833054         add        r3, r3, #84        ; 0x54
  78:        e5933000         ldr        r3, [r3]
  7c:        e50b3010         str        r3, [fp, #-16]
  80:        e51b3010         ldr        r3, [fp, #-16]
  84:        e2033002         and        r3, r3, #2        ; 0x2
  88:        e3530000         cmp        r3, #0        ; 0x0
  8c:        0a000004         beq        a4 <main+0x8c>
  90:        e3a03456         mov        r3, #1442840576        ; 0x56000000
  94:        e2833014         add        r3, r3, #20        ; 0x14
  98:        e3a02e1f         mov        r2, #496        ; 0x1f0
  9c:        e5832000         str        r2, [r3]
  a0:        eafffff2         b        70 <main+0x58>
  a4:        e3a03456         mov        r3, #1442840576        ; 0x56000000
  a8:        e2833014         add        r3, r3, #20        ; 0x14
  ac:        e3a02000         mov        r2, #0        ; 0x0
  b0:        e5832000         str        r2, [r3]
看来我堆栈设置有问题,但是 这个设置代码 在我以前一个板子2410上都没有问题…………
感谢大家的解答!!
回复

使用道具 举报

 楼主| mobilefzb 发表于 2010-10-20 23:15:13 | 显示全部楼层
局部变量压栈估计失败了,我设置了sp到4096但是,变量就是用不起………………
回复

使用道具 举报

 楼主| mobilefzb 发表于 2010-10-21 08:44:25 | 显示全部楼层
问题看来是我对nor flash的理解出现了偏差!!!!
nor flash的状态下和nand flash状态下是有区别的。
nor flash在系统上电后就变成一个只可读不可写的内存区域,由于我程序的堆栈设置在系统分配给nor flash的区域,所以造成堆栈无法建立!!
nand flash上电后由于arm芯片会自动将nand flash开头4kb的代码拷贝到arm内部一块ram里面,那个是可读写的!!
感谢版主的解答!!感谢大家的解答!!
回复

使用道具 举报

天嵌_support1 发表于 2010-10-21 11:38:52 | 显示全部楼层
15# mobilefzb


按下后电平是低的,那么它相应的位和1进行and 的时候是0

(key_data & GPF2_in)==0
不知道你是怎么编译测试了。从你的代码结构看,你似乎不是在裸奔的基础上弄的。
我好想在哪本书上见过这个程序。你可以在你的if 语句中输出一些语句,用于判断结果
回复

使用道具 举报

吕氏春秋8266 发表于 2010-11-19 20:45:24 | 显示全部楼层
需要说明的是,根据电路图,当按键未按下时,其输入为1,看看你的代码
if(key_data & GPF0_in)  ;K1未按下,(key_data & GPF0_in=1)
                {
                        GPBDAT &= ~GPB5_out;
                }
                else                 ;K1按下,(key_data & GPF0_in=0)
                {
                        GPBDAT |= GPB5_out;
                }

你逻辑错误,
参考一下我写的汇编代码
AREA KEYLED,CODE,READONLY
        get s3c2440.inc
        EXPORT TestMain
TestMain
        ldr r0,=GPFCON
        ldr r1,=0x0
        str r1,[r0]
       
        ldr r0,=GPBCON
        ldr r1,=0x15400
        str r1,[r0]
       
        ldr r0,=GPBDAT
        ldr r1,=(0xf<<5)
        str r1,[r0]
       
loop
    ldr r0,=GPFDAT
    ldr r1,[r0]
       
        mov r2,#0xf                 
   
    tst r1,#2                     ;K1键是否按下
    andeq r2,r2,#0xe
   
    tst r1,#0x10                  ;K2键是否按下
    andeq r2,r2,#0xd
   
    tst r1,#4                     ;K3键是否按下
    andeq r2,r2,#0xb
   
    tst r1,#1                     ;K4键是否按下
    andeq r2,r2,#7
   
    mov r1,r2,lsl#5
   
    ldr r0,=GPBDAT
    str r1,[r0]
   
    b loop
    end
希望对你有所帮助
回复

使用道具 举报

天嵌_support1 发表于 2010-11-20 16:26:47 | 显示全部楼层
15# mobilefzb


上面的配置是我在裸奔代码中测试出来可以运行的。
网友。那是可以正确工作的,怎么这么久了你又跑出来说不行,
我都不知道测试代码放哪了都。
你耐心再测试一下好吧。我是把你的代码放在裸奔代码的main.c 的main函数中运行的,我记得。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2025-5-2 04:40 , Processed in 2.031939 second(s), 18 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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