繁体   English   中英

ARM Cortex-M4,使用UART_DR和FIFO进行读/写

[英]ARM Cortex-M4, Read/Write using UART_DR and FIFO

因此,我正在学习ASM,并拥有LM4F120XL ARM Cortex-M4 MCU。 我正在使用Keil uVision V4.54。

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

我所坚持的是例如通过串行方式对TeraTerm / Putty进行读写。

我了解RxFE = 0,FIFO不为空-从中读取数据; 并且TxFF = 0,FIFO未满-对其进行写入。

但是,在比较并满足了这些条件之后,我实际上正在将哪些数据写入数据寄存器UART_DR? 这仅仅是将数据寄存器加载到寄存器中,然后将该地址中的值加载到另一个寄存器中,然后...因为im不改变位而丢失的情况,我正在添加新数据-然后将其存储在该寄存器返回数据寄存器。

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

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

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

; -------

ReadChar

    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  

; -------

OutputChar

    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

; -------

是的,您正在编写在串行/ 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为空。

听起来您还不太了解这种“寄存器”的工作原理。 不要将其视为存储数据的存储盒(例如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 (我认为这是一个适当的,零件编号似乎已更改),在数据字节上方有一些只读接收状态位,因此您可以将LDRB更改为LDR以在数据旁边捕获那些状态位,但是在这种情况下,我真的不会打扰-串行通讯的内部工作与学习汇编完全相关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM