主题 : 出现奇怪问题 ads   简单led 汇编语言 实现mini2440 复制链接 | 浏览器收藏 | 打印
裸机好啊,对熟悉硬件有帮助另外看见裸字会流鼻血
级别: 新手上路
UID: 62242
精华: 0
发帖: 10
金钱: 50 两
威望: 10 点
综合积分: 20 分
注册时间: 2012-01-18
最后登录: 2012-03-15
楼主  发表于: 2012-03-09 22:57

 出现奇怪问题 ads   简单led 汇编语言 实现mini2440

    只亮 5  6  7三个灯,把8号灯代码复制到5号前就亮8 5 6


明明写了四个灯的   不管怎么改顺序,只亮前三个




; asm.s   我的跑马灯程序

GPBCON    EQU   0x56000010
GPBDAT    EQU   0x56000014
GPBUP     EQU   0x56000018

    
    
     EXPORT LEDTEST
     AREA  LEDTESTASM,CODE,READONLY   ;该伪指令定义一个代码段,段名为LEDTESTASM,属性只读
     ENTRY
     CODE32
    
LEDTEST
    
                       ;;;设置GPF4-GPF7为OUTPUT
     ldr r0,=GPBCON            ;
     ;ldr r1,[r0]
     ;bic r1,r1,#0xff00        ;bicBIC{cond}{S} Rd,Rn,operand2 BIC指令将Rn 的值与操作数operand2 的反码按位逻辑”与”,结果存放到目的寄存器Rd 中。指令示例:BIC R0,R0,#0x0F ;将R0最低4位清零,其余位不变。
     ldr r1,=0x00015400        ;        1 0101 0100 0000 0000
     str r1,[r0]               ;GPFCON8  [17:16]  01=OUTPUT   ,,, GPFCON5   [11:10]   01=0UTPUT     ,,,GPFCON6 [13:12]  为01   ,,,GPFCON7 [15:14]  也为01
    
                       ;;;禁止GPF4-GPF7端口的上拉电阻
     ;ldr r0,=GPBUP             ;GPFUP    是8位的
     ;ldr r1,=0x1e0
    ;orr r1,r1,#0x1e0          ;r1  赋值为   1 1110   0000
     ;str r1,[r0]               ;将GPF[5:8] 位赋值为1   1是禁止
    
looptest    
                       ;;;将数据端口F的数据寄存器的地址附给寄存器r2
                      
      
    
      
      
                       ;;;先让5号灯先亮
     ldr r2,=GPBDAT            ;
     ldr r3,[r2]               ;
     bic r3,r3,#0x1e0          ;清0   %%%%%%%%%%%%%%%%%%%%%%%%%%% 这样写是有BUG的(参看led6的这一行)  应该用32位的指令ldr
     orr r3,r3,#0x1c0          ;  低4位 置0 低4位不是led的    ,,,0001 1100 0000 让GPFDAT5 号灯亮  0代表低电位,灯亮
     str r3,[r2]  
     ldr r0,=0x8ffff           ;这句什么意思?   答: 这个给r0设个初值:这样就可以 在delay 这个子函数中,用每次减1的方法进行循环
     bl delay                  ;调用延迟子程序
      
                       ;;;6号该亮了    
     ldr r2,=GPBDAT
     ldr r3,[r2]    
     bic r3,r3,#0x1e0           ;
     orr r3,r3,#0x1a0           ; 0001 1010 0000  6号开亮
     str r3,[r2]  
     ldr r0,=0x8ffff
     bl delay      
  
     ;b li                      ;B或BL指令引起处理器转移到“子程序名”处开始执行。两者的不同之处在于BL指令在转移到子程序执行之前,将其下一条指令的地址拷贝到R14(LR,链 接寄存器)
                                ;可用  mov pc,lr就可以返回
                                
                                
                       ;;;7号
     ldr r2,=GPBDAT                  
     ;ldr r3,[r2]    
     ;bic r3,r3,#0x1e
     ;orr r3,r3,#0xf7f          ;
     mov r3,#0x060              ;  0001 0110 0000        %%%%%%%%%应该这样写
     str r3,[r2]  
     ldr r0,=0x8ffff
     bl delay      
                    
                       ;;;8号
      ldr r2,=GPBDAT
     ;;ldr r3,[r2]    
     ;;bic r3,r3,#0x1e  
     ;;orr r3,r3,#0x0e0          
     mov r3,#0x0e0              ; 0000 1110 0000
     str r3,[r2]  
     ldr r0,=0x8ffff     ;
     bl delay        

;li    
    
                       ;;; 跳回到looptest  进行循环
     b looptest
    
    
    
delay    
                       ;;; 跑马灯延时程序
     sub r0,r0,#1             ;sub 减法
     cmp r0,#0x0              ;将r0 与0比较
     bne delay                ;b是跳   ne 是不相等  ,不相等就跳到delay
     mov pc,lr                ;lr 里存的是调用函数时的下一条指令,让Pc指针指向lr就可以完成函数的返回
    
     END                      ;程序结束符
    
    
          
    
浓眉毛,ROCK LEE:

学习吧, 燃烧的青春!