ARM 汇编语言 uART0 输入输出,我做错了啥。
Posted
技术标签:
【中文标题】ARM 汇编语言 uART0 输入输出,我做错了啥。【英文标题】:ARM Assembly Language uART0 Input Output, What am I doing wrong.ARM 汇编语言 uART0 输入输出,我做错了什么。 【发布时间】:2014-03-28 09:59:11 【问题描述】:编写两 (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
【问题讨论】:
这与您之前提出的问题 (***.com/questions/22025929/…) 有何不同? 我实际上提出了这个问题。对不起,这是我第一次来这里。我将删除之前的问题。 尝试从只输出 0x30 到 0x39 字符的循环开始。用 for(r2=0x30;r2 @dwelch 和 output_character 吃掉堆栈(你会得到堆栈下溢)。推送链接寄存器在顶部,不能称为无入口点(标签)。 我们不知道您的 UART 是否设置正确,或者您的电缆等是否连接正确。串行通信无法工作的方式数不胜数,我们无法通过博客修复代码和硬件。 【参考方案1】:这看起来是相关的
http://csserver.evansville.edu/~blandfor/EE311/ARMLecture/UARTNotes.pdf
考虑到这些应该是两个独立的函数,上面的 cmets 适用。另外,我会假设由于问题不涉及初始化 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 没问题,它需要循环回从线路状态寄存器读取的寄存器,所以它需要一个单独的目标标签。
【讨论】:
以上是关于ARM 汇编语言 uART0 输入输出,我做错了啥。的主要内容,如果未能解决你的问题,请参考以下文章