树莓派4裸机操作系统开发指南:Mini UART通信详解

树莓派4裸机操作系统开发指南:Mini UART通信详解

rpi4-osdev Tutorial: Writing a "bare metal" operating system for Raspberry Pi 4 rpi4-osdev 项目地址: https://gitcode.com/gh_mirrors/rp/rpi4-osdev

内存映射I/O(MMIO)基础

在树莓派4裸机开发中,与硬件通信的核心机制是内存映射I/O(MMIO)。这种技术允许我们通过读写特定内存地址来直接控制硬件设备,而无需复杂的驱动程序。

树莓派4默认启动在低外设模式(Low Peripheral Mode),将外设映射到RAM的最后64MB空间。因此,所有外设的基础地址是0xFE000000(代码中的PERIPHERAL_BASE)。这与BCM2711文档中描述的不同,是因为这种特殊的地址映射方式。

GPIO引脚配置详解

通用输入输出(GPIO)引脚是树莓派与外部世界交互的桥梁。在我们的项目中,USB转串口TTL电缆就是连接到这些引脚上的。

关键GPIO寄存器

在io.c文件中,我们定义了几个重要的GPIO寄存器:

  • GPFSEL0:功能选择寄存器,用于设置引脚功能
  • GPSET0:置位寄存器,用于将引脚设为高电平
  • GPCLR0:清除寄存器,用于将引脚设为低电平
  • GPPUPPDN0:上拉/下拉控制寄存器

这些寄存器都位于PERIPHERAL_BASE的特定偏移地址处,通过mmio_read和mmio_write函数进行读写。

GPIO引脚状态控制

GPIO引脚有三种基本操作:

  1. 设置高电平(gpio_set):给引脚施加电压(逻辑1)
  2. 清除低电平(gpio_clear):移除引脚电压(逻辑0)
  3. 上拉/下拉设置(gpio_pull)
    • 上拉(Pull Up):默认高电平
    • 下拉(Pull Down):默认低电平
    • 无上拉下拉(Pull None):浮空状态

对于UART通信,我们需要将引脚设置为浮空状态(Pull None)。

引脚功能复用

树莓派的GPIO引脚具有功能复用特性,这意味着每个引脚可以配置为多种不同的功能。在我们的案例中:

  • GPIO 14配置为TXD1(发送)
  • GPIO 15配置为RXD1(接收)
  • 使用ALT5(替代功能5)启用UART功能

这种配置通过gpio_function函数实现,将迷你UART(UART1)映射到我们连接电缆的物理引脚上。

迷你UART配置与通信

UART寄存器配置

与GPIO类似,UART也通过MMIO进行控制。io.c文件中定义了以下关键UART寄存器:

  • AUX_ENABLES:启用辅助外设
  • AUX_MU_IO_REG:数据输入/输出
  • AUX_MU_IER_REG:中断启用
  • AUX_MU_IIR_REG:中断标识
  • AUX_MU_LCR_REG:线路控制
  • AUX_MU_MCR_REG:调制解调器控制
  • AUX_MU_LSR_REG:线路状态
  • AUX_MU_MSR_REG:调制解调器状态
  • AUX_MU_SCRATCH:暂存寄存器
  • AUX_MU_CNTL_REG:控制寄存器
  • AUX_MU_STAT_REG:状态寄存器
  • AUX_MU_BAUD_REG:波特率设置

波特率与时钟配置

UART通信的核心是精确的时序控制。在config.txt中设置的core_freq_min=500与代码中的AUX_UART_CLOCK=500000000(500MHz)直接相关,这确保了通信时序的准确性。

初始化函数uart_init()完成了以下关键配置:

  • 设置波特率为115200
  • 数据位为8位
  • 启用UART发送和接收功能

UART通信函数

我们实现了几个关键通信函数:

  1. uart_isWriteByteReady:检查UART是否准备好发送数据
  2. uart_writeByteBlockingActual:阻塞式发送单个字节
  3. uart_writeText:发送完整字符串
  4. uart_readByteBlocking:阻塞式读取单个字节
  5. uart_isReadByteReady:检查是否有数据可读

这些函数构成了基本的UART通信能力,使得"Hello world"示例成为可能。

高级功能:FIFO缓冲区

为了提高UART通信的可靠性,我们实现了一个软件FIFO(先进先出)缓冲区。这个设计解决了几个关键问题:

  1. 硬件缓冲区有限,容易溢出
  2. 提供数据缓冲,减轻实时处理压力
  3. 为未来更复杂的数据处理奠定基础

FIFO缓冲区通过以下函数管理:

  • uart_loadRecvFifo:加载接收到的数据到缓冲区
  • uart_readByteAsap:从缓冲区快速读取字节

实践应用:双向通信演示

在当前的实现中,树莓派4不仅能够输出"Hello world!"信息,还能实现回显功能(Echo)。当你在终端输入字符时,树莓派会立即将相同的字符发送回来,这验证了双向通信的成功实现。

这个简单的回显功能展示了裸机系统与外部世界交互的基本模式,为后续更复杂的输入输出处理奠定了基础。

开发建议

  1. 始终参考BCM2711 ARM外设文档,但要注意文档可能存在错误
  2. 在修改GPIO或UART配置时,确保理解每个位的含义
  3. 考虑添加错误处理机制,特别是对于UART通信
  4. 可以扩展FIFO缓冲区功能,增加溢出保护等机制

通过本部分的开发,我们已经建立了一个可靠的底层通信框架,为后续的图形显示、设备驱动等更复杂功能打下了坚实基础。

rpi4-osdev Tutorial: Writing a "bare metal" operating system for Raspberry Pi 4 rpi4-osdev 项目地址: https://gitcode.com/gh_mirrors/rp/rpi4-osdev

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岑魁融Justine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值