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 输入输出,我做错了啥。的主要内容,如果未能解决你的问题,请参考以下文章

这个 AFNetworking JSON 帖子我做错了啥?

这个 MERGE / INSERT 查询我做错了啥?

django - Ajax 实时搜索,我做错了啥?

用 C++ 中的 AKS 素性测试计算孪生素数我做错了啥?

我为指数编写的这个基本程序只适用于整数——我做错了啥?

sectionName TableView - 我做错了啥?