ARM汇编语言uART0输入输出,我做错了什么。

时间:2014-02-25 21:34:51

标签: assembly input arm output uart

编写两(2)个ARM汇编语言子例程,名为output_char和read_char。 这些子程序允许用户输入字符并通过UART在PuTTy中显示字符。 所有用户输入都应回显到显示屏

我尝试编写代码但是没有用。

U0LSR EQU 0x14          
register EQU 0xE000C000


    STMFD SP!,{lr}  

read_character
    LDR r0, =0xE000C014
    LDRB r1, [r0]
    BIC r1, r1, #0xFFFFFFFE
    CMP r1, #0
    BEQ read_character
    LDR r6, =register
    LDR r2, [r6]



output_character
    LDR r0, =0xE000C014
    LDRB r1, [r0]
    BIC  r1, r1, #0xFFFFFFEF
    MOV r1, r1, LSR #1
    CMP r1, #0
    BEQ output_character
    LDR r6, =register
    STR r2, [r6]

    LDMFD sp!, {lr}
    BX lr

1 个答案:

答案 0 :(得分:1)

这看起来很相关

http://csserver.evansville.edu/~blandfor/EE311/ARMLecture/UARTNotes.pdf

考虑到这些应该是两个独立的功能,以上的评论适用。此外,我将假设,因为问题不是指初始化UART,否则它确实成功。 STMFD / LDMFD / BX三重应与两个功能相关联。另外,考虑ARM程序调用标准

http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf

如果可能的话,你可能应该在程序中将自己限制在R0-R3。如果需要更多,则需要将它们添加到STMFD / LDMFD指令中,这样就不会修改寄存器而不将它们恢复到先前的状态。

编写问题语句的方式是,read_char函数需要调用write_char函数来回显键入屏幕的字符。你的答案中缺少这个。看起来持有字符的寄存器与发送字符的寄存器相同,所以这很好。否则read_character函数看起来没问题。

你的write_character函数看起来不太正确,但是你的BIC 0xFFFF FFEF看起来不正确。你想看看Transmitter Empty位,你应该使用0xFFFF FFBF。作为一种风格,我建议使用AND与你想要的位设置与BIC和逆。让它更容易看到。如果您没有在输出上看到任何内容,这很可能是问题,因为LSR [4]处的BI(中断指示符)位可能永远不会变高,因此您的代码将永远循环。

最后,问题语句说使用read_char和output_char作为函数名,因此需要将这些标签添加到STMFD指令中。您的BEQ很好,它需要循环回从线路状态寄存器读取的寄存器,因此它需要一个单独的目标标签。