Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C UARTs&;登记册_C_Embedded_Uart - Fatal编程技术网

C UARTs&;登记册

C UARTs&;登记册,c,embedded,uart,C,Embedded,Uart,因此,我是新手,尝试学习寄存器和UART,并获得了以下代码进行学习 #include <stdint.h> typedef volatile struct { uint32_t DR; uint32_t RSR_ECR; uint8_t reserved1[0x10]; const uint32_t FR; uint8_t reserved2[0x4]; uint32_t LPR; uint32_t IBRD; uin

因此,我是新手,尝试学习寄存器和UART,并获得了以下代码进行学习

#include <stdint.h>

typedef volatile struct {
    uint32_t DR;
    uint32_t RSR_ECR;
    uint8_t reserved1[0x10];
    const uint32_t FR;
    uint8_t reserved2[0x4];
    uint32_t LPR;
    uint32_t IBRD;
    uint32_t FBRD;
    uint32_t LCR_H;
    uint32_t CR;
    uint32_t IFLS;
    uint32_t IMSC;
    const uint32_t RIS;
    const uint32_t MIS;
    uint32_t ICR;
    uint32_t DMACR;
} pl011_T;

enum {
    RXFE = 0x10,
    TXFF = 0x20,
};

pl011_T * const UART0 = (pl011_T *)0x101f1000;
pl011_T * const UART1 = (pl011_T *)0x101f2000;
pl011_T * const UART2 = (pl011_T *)0x101f3000;

static inline char upperchar(char c) {
    if((c >= 'a') && (c <= 'z')) {
        return c - 'a' + 'A';
    } else {
        return c;
    }
}

static void uart_echo(pl011_T *uart) {
    if ((uart->FR & RXFE) == 0) {
        while(uart->FR & TXFF);
        uart->DR = upperchar(uart->DR);
    }
}

void c_entry() {
    for(;;) {
        uart_echo(UART0);
        uart_echo(UART1);
        uart_echo(UART2);
    }
}
#包括
typedef volatile结构{
uint32_t DR;
uint32_t RSR_ECR;
uint8_t reserved1[0x10];
const uint32_t FR;
uint8_t reserved2[0x4];
uint32_t LPR;
uint32国际复兴开发银行;
uint32_t FBRD;
uint32_t LCR_H;
uint32_t CR;
uint32_t IFLS;
uint32_t IMSC;
const uint32_t RIS;
施工管理信息系统;
uint32_t ICR;
uint32_t DMACR;
}pl011_T;
枚举{
RXFE=0x10,
TXFF=0x20,
};
pl011_T*常量UART0=(pl011_T*)0x101f1000;
pl011_T*常量UART1=(pl011_T*)0x101f2000;
pl011_T*常量UART2=(pl011_T*)0x101f3000;
静态内联字符upperchar(字符c){
如果((c>='a')&(c FR&RXFE)==0){
而(uart->FR&TXFF);
uart->DR=upperchar(uart->DR);
}
}
无效c_条目(){
对于(;;){
uart_回波(UART0);
uart_回波(UART1);
uart_回波(UART2);
}
}
我只是想知道是否有人能解释一下
pl011
DR
FR
寄存器如何通过相关的UART外围设备发送和接收数据。
任何帮助都将不胜感激

这里有一些关于UART的很好的文档-

该程序的工作方式受UART是否处于
FIFO
模式的影响。我没有阅读足够的文档,不知道哪个是默认状态。Tx和Rx的操作根据此模式略有不同。看起来代码只对单个单词起作用,所以可能它不在FIFO模式下(或者这与代码无关)

  • FR
    是UART标志寄存器(也称为
    UARTFR
    )。它包含一组位,可以查询这些位以查看UART的状态。这一问题的两个重要问题是:

    • TXFF
      FR
      中的一个位,当传输缓冲区满时,它变为
      1
    • RXFE
      FR
      中的一个位,当接收缓冲区为空时,它变为
      1
  • DR
    是UART数据寄存器(也称为
    UARTDR
    )。它保存要发送的数据和已接收的数据

那么看看代码的主要工作部分~

static void uart_echo( pl011_T *uart ) 
{
    if ( ( uart->FR & RXFE ) == 0 )      // While the receive buffer is NOT empty
    {
        while( uart->FR & TXFF );        // Do <nothing> while the Tx buffer is full

        // Read the content of the Data Register, converting it to uppercase(),
        // then make a write to the DR, which initiates a transmit
        uart->DR = upperchar(uart->DR);  
    }
}  
静态无效uart\U回波(pl011\U T*uart)
{
如果((uart->FR&RXFE)==0)//而接收缓冲区不为空
{
while(uart->FR&TXFF);//发送缓冲区满时执行
//读取数据寄存器的内容,将其转换为大写(),
//然后写入DR,DR将启动传输
uart->DR=upperchar(uart->DR);
}
}  

所以这个函数会回显它读到的任何内容,但是是大写的。程序依次为三个UART中的每一个调用此命令。

如果没有UART的数据表,代码很难理解。请看一下该文档,这应该能解释很多。如果您能告诉我们您使用的是哪个处理器,这也会非常有帮助。我只知道,这个嵌入式MCU有3个UART。pl011_T就是这种结构,它在这三个地址(从0x101F1000、0x101F2000和0x10F3000开始)上作为硬件寄存器组成。FR似乎是一个标志寄存器,其中设置了TX和RX标志RXFE和TXFF。DR是用于接收和发送数据的寄存器,不是吗?请告诉我们您使用哪种硬件,有MCU的数据表和手册……您到底不了解什么?你知道DR和FR寄存器实际上是硬件的一部分吗?这些寄存器的行为由硬件中的晶体管定义。当硬件检测到您正在写入或读取与这些寄存器相关的地址时,它可以执行特殊操作。代码中的
typedef
仅帮助您使用程序员友好的名称写入正确的UART寄存器地址;它并没有真正定义寄存器。