C UARTs&;登记册
因此,我是新手,尝试学习寄存器和UART,并获得了以下代码进行学习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
#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模式下(或者这与代码无关)
是UART标志寄存器(也称为FR
)。它包含一组位,可以查询这些位以查看UART的状态。这一问题的两个重要问题是:UARTFR
是TXFF
中的一个位,当传输缓冲区满时,它变为FR
1
是RXFE
中的一个位,当接收缓冲区为空时,它变为FR
1
是UART数据寄存器(也称为DR
)。它保存要发送的数据和已接收的数据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寄存器地址;它并没有真正定义寄存器。