学习目标

  • 实现 UART 驱动
  • 掌握寄存器操作
  • 学习轮询方式通信

7.1 驱动接口

void uart_init(void);
void uart_putc(char c);
char uart_getc(void);

7.2 寄存器定义

#define UART_BASE 0x10000000

#define UART_RHR (*(volatile uint8_t*)(UART_BASE + 0))
#define UART_THR (*(volatile uint8_t*)(UART_BASE + 0))
#define UART_LSR (*(volatile uint8_t*)(UART_BASE + 5))

#define LSR_DR   (1 << 0)  // 数据就绪
#define LSR_THRE (1 << 5)  // 发送保持寄存器空

7.3 完整实现

void uart_init(void) {
    // QEMU virt 的 UART 已初始化
}

void uart_putc(char c) {
    // 等待发送缓冲区空
    while ((UART_LSR & LSR_THRE) == 0);
    UART_THR = c;
}

char uart_getc(void) {
    // 等待数据就绪
    while ((UART_LSR & LSR_DR) == 0);
    return UART_RHR;
}

下一步

BSP 板级支持包

更新时间: