1

所以我正在学习 ASM,并且有一个 LM4F120XL ARM Cortex-M4 MCU。我正在使用 Keil uVision V4.54。

我熟悉设置端口等,初始化 GPIO 和 UART。

例如,我坚持的是通过串行读取和写入 TeraTerm/Putty。

我了解 RxFE = 0,FIFO 不为空 - 从中​​读取;并且 TxFF = 0,FIFO 未满 - 写入它..

但是在比较并满足这些条件之后,我实际上将什么数据写入 UART_DR,数据寄存器..?是否只是将数据寄存器加载到寄存器中,将此地址处的值加载到另一个寄存器中,然后......我丢失了,因为我没有更改位我正在添加新数据 - 然后你会从这个寄存器回到数据寄存器寄存器..

因此,如果数据寄存器中存在数据,那么它会及时传递出去..?我可以使用正确的 COM 端口连接到 TeraTerm,调整 BAUD 和 PARITY 设置。但再一次,如果数据寄存器中存在数据,在到期周期后会自动发送......?

另外,如何从键盘读取字符..?或其他计算机外围设备..是否知道地址,将值加载到寄存器中,然后将其存储到数据寄存器中?如果数据寄存器保存数据,则需要以非破坏性方式完成。

为什么每篇关于 MCU 编码的文章都是用 C++ 而不是 ASM 编写的?我也在学习 C++ 但不知道为什么没有人使用汇编/机器代码..

;--------

读取字符

    PUSH {R0, R1}

inloop LDR R0, =UART_FR LDR R1, [R0] AND R1, #0x10 CMP R1, #0x0 BNE inloop

    LDR R0, =UART_DR
    LDR R1, [R0]
    ************??
    STR R1, [R0]

    POP {R0, R1}

    BX LR  

;--------

输出字符

    PUSH {R0, R1}

外环回 LDR R0, =UART_FR LDR R1, [R0] AND R1, #0x20 CMP R1, #0x0 BNE 外环回

    LDR R0, =UART_DR
    LDR R1, [R0]
    ************??
    STR R1, [R0]

    POP {R0, R1}

    BX LR

;--------

4

2 回答 2

2

听起来您还没有完全了解这种“寄存器”如何工作的正确概念。不要把它看成一个保存数据的存储盒(就像 CPU 的通用寄存器),把它想成一个邮箱——当你向它写入一个字节时,那个字节会被带入 Tx FIFO 缓冲区,但是,当您从中读取时,您会从 Rx FIFO 中获得一个字节。通过读-修改-写操作改变位的想法确实没有意义,因为读取和写入这样的寄存器意味着完全不同的事情。

传输一个字节(一旦设置好)就像这样简单:

; byte to transmit is in r0
; <wait for space in Tx FIFO>
LDR  r1, =UART_DR
STRB r0, [r1]

写入 FIFO 后,您的工作(作为软件)就完成了,您可以让硬件负责将缓冲区的内容传输到线路。

接收大致相同,但读取而不是写入:

; <wait for data in Rx FIFO>
LDR  r1, =UART_DR
LDRB r0, [r1]
; received byte now in r0

根据MCU的 TRM(我认为这是一个合适的,零件号似乎已更改)在数据字节上方有一些只读接收状态位,因此您可以更改LDRBLDR捕获数据旁边的那些,但我在这种情况下真的不会打扰 - 串行通信的内部工作完全与学习汇编无关。

于 2014-08-26T14:36:59.547 回答
1

是的,您正在编写在串行/UART 接口上输出的字符。如果您使用的是哑终端,ASCII 是最容易使用的。一个简单的测试循环:

unsigned char ra;
...
for(ra=0;;ra++)
{
    ra&=7;
    UART_DR = 0x30+ra;
    timed_delay();
}

定时延迟长于发送字符所需的时间(10 位周期、开始、数据、停止,以任何速率 9600、115200 等,或只是长时间延迟)

然后

unsigned char ra;
...
for(ra=0;;ra++)
{
    ra&=7;
    uart_putc(ra);
}

在这种情况下,uart_putc 等待 tx 缓冲区/fifo 中有一个开口,然后将传递的值插入该 fifo。

您的终端将显示的是 01234567(您可能想告诉它换行)。如果第二个程序不是 01234567 而是那些 03715 的一些修改......那么你不会等待 tx 为空。

于 2014-08-26T13:50:35.823 回答