3.UART相关介绍
https://www.jianshu.com/p/14ae99223683
1.uart初始化
#define LCR_BAUD_LATCH (1<<7) // 1000 0000
#define LCR_EIGHT_BITS (3<<0) // 11
#define FCR_FIFO_ENABLE (1<<0)// 1
#define FCR_FIFO_CLEAR (3<<1) // 110
#define IER_RX_ENABLE (1<<0) // 1
#define IER_TX_ENABLE (1<<1) // 10
void uartinit(void) {
// 关闭中断
WriteReg(IER, 0x00);
// special mode to set baud rate.
WriteReg(LCR, LCR_BAUD_LATCH);
// LSB for baud rate of 38.4K.
WriteReg(0, 0x03);
// MSB for baud rate of 38.4K.
WriteReg(1, 0x00);
// leave set-baud mode,
// and set word length to 8 bits, no parity.
WriteReg(LCR, LCR_EIGHT_BITS);
// reset and enable FIFOs.
WriteReg(FCR, FCR_FIFO_ENABLE | FCR_FIFO_CLEAR);
// enable transmit and receive interrupts.
WriteReg(IER, IER_TX_ENABLE | IER_RX_ENABLE);
initlock(&uart_tx_lock, "uart");
}
1.1 IER
中断使能寄存器(IER)用于管理接收器就绪、发送器空、线路状态和调制解调器状态寄存器到 INT 输出引脚的传入中断。
- 位 0:接收器就绪中断
- 位 1:发送器空中断
- 位 2:接收器线路状态中断。
- 位 3:调制解调器状态寄存器中断。
- 位 7-4:保留位,均为零。
1.2 LCR
线路控制寄存器用于指定异步数据通信的格式。可通过在该寄存器中写入适当的位来选择字长、停止位和奇偶校验。
-
位 1-0
这两位指定要传输或接收的字长。位1 位0 字长 0 0 5 0 1 6 1 0 7 1 1 8
-
位 7
是否切换到设置波特率模式,当被置为 1 时,允许用户通过寄存器设置波特率。
FCR
用于启用、清除、设置接收 FIFO 触发级别以及选择 DMA 信号类型。
-
位0:
启用或禁用FIFO
在设置 FIFO 触发级别之前应启用此位。
-
位1:
当设置为1时,清除FIFO发送管道中的内容,并将计数清除为0
清除完成后,本位将自动变为零。
-
位2:
当设置为1时,清除FIFO接收管道中的内容,并将计数清除为0
清除完成后,本位将自动变为零。
2. uartgetc
int uartgetc(void) {
if(ReadReg(LSR) & 0x01){
// input data is ready.
return ReadReg(RHR);
} else {
return -1;
}
}
LSR
LSR(线路状态寄存器)是 UART(通用异步收发传输器)中的一个寄存器,用于提供有关接收和发送操作的状态信息。LSR 包含一些位字段,这些字段提供了有关接收和发送数据的状态的信息。
- BIT-0: Data Ready (DR):此位指示接收数据寄存器中是否有可用的数据。当接收数据寄存器中有数据可读时,此位将置位。
- BIT-1: Overrun Error (OE):此位指示接收数据寄存器是否溢出。如果接收数据寄存器溢出,此位将被置位。
- BIT-2: Parity Error (PE):此位指示接收数据的奇偶校验是否错误。如果接收到的数据的奇偶校验与期望的奇偶校验不匹配,此位将被置位。
- BIT-3: Framing Error (FE):此位指示接收数据中的帧错误。如果接收到的数据中有帧错误,此位将被置位。
- BIT-4: Break Interrupt (BI):此位指示是否检测到了中断信号。如果接收到了中断信号(如通信线路上的中断信号),此位将被置位。
- BIT-5: Transmitter Holding Register Empty (THRE):此位指示发送保持寄存器是否为空。当发送保持寄存器为空且允许接受新的数据时,此位将被置位。
- BIT-6: Transmitter Empty (TEMT):此位指示发送寄存器和发送移位寄存器是否都为空。当发送寄存器和发送移位寄存器都为空时,此位将被置位。
- BIT-7: Reserved:此位保留,未使用。
RHR
RHR(接收保持寄存器)是 UART(通用异步收发传输器)中的一个寄存器,用于存储接收到的字符数据。当 UART 接收到一个字符时,它将被存储在 RHR 中,等待被处理或读取。通常,读取 RHR 寄存器的操作将导致将接收到的字符从 RHR 中取出并传递给处理器或应用程序。
简而言之,RHR 是 UART 中用于暂存接收到的字符的寄存器。