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



编写两(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

这看起来与有关

http://csserver.evansville.edu/~blandfor/EE311/ARM讲座/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看起来不正确。如果要查看变送器空位,则应使用0xFFFF FFBF。作为风格的一点,我建议对您想要的比特集使用AND,而不是BIC和相反的比特集。让它更容易看到。如果您在输出中没有看到任何内容,这很可能是问题所在,因为LSR[4]处的BI(中断指示符)位可能永远不会变高,因此您的代码将永远循环。

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

最新更新