Raspberry Pi 项目:深入理解GPIO引脚配置与设备树设置

Raspberry Pi 项目:深入理解GPIO引脚配置与设备树设置

documentation The official documentation for Raspberry Pi computers and microcontrollers documentation 项目地址: https://gitcode.com/gh_mirrors/doc/documentation

引言

在嵌入式系统开发中,GPIO(通用输入输出)引脚的配置是基础而关键的一环。Raspberry Pi作为广受欢迎的单板计算机,其GPIO引脚配置机制尤为值得深入探讨。本文将全面解析Raspberry Pi的引脚配置过程,特别是通过设备树blob(dt-blob.bin)进行自定义配置的方法。

启动过程中的引脚状态变化

理解Raspberry Pi启动过程中GPIO引脚的状态变化对硬件设计至关重要。整个启动序列中,引脚状态会经历多个阶段的改变:

  1. 上电阶段:所有GPIO引脚默认为输入模式,并带有默认的上拉/下拉电阻配置(具体配置可参考BCM2835芯片手册)
  2. BootROM阶段:由芯片内置引导程序进行初步配置
  3. Bootcode.bin阶段:二级引导程序进行配置
  4. dt-blob.bin阶段:用户自定义配置生效
  5. config.txt阶段:通过GPIO指令进行进一步配置
  6. 固件特定功能配置:如UART等外设的专用配置
  7. 内核/设备树阶段:Linux内核最终接管配置

特别需要注意的是,在软复位(soft reset)时,除默认上拉/下拉电阻配置外,其他阶段都会重新执行。整个配置过程可能需要几秒钟时间,在此期间GPIO引脚可能不会立即达到预期状态。

应对启动时序问题的三种方案

针对外设可能遇到的启动时序问题,开发者可以采取以下三种策略之一:

  1. 选择默认状态匹配的GPIO引脚:不同引脚有不同默认上拉/下拉配置,选择与外围设备需求匹配的引脚
  2. 延迟外设启动:通过硬件或软件方式延迟外设初始化,等待GPIO配置完成
  3. 添加外部电阻:在电路设计阶段添加适当的上拉或下拉电阻

设备树blob的编译与使用

设备树blob(dt-blob.bin)是Raspberry Pi启动过程中VideoCore固件使用的配置文件,它独立于Linux内核使用的设备树。要创建自定义配置,需要:

  1. 安装设备树编译器:
sudo apt install device-tree-compiler
  1. 将.dts源文件编译为.dtb二进制文件:
sudo dtc -I dts -O dtb -o /boot/firmware/dt-blob.bin dt-blob.dts
  1. 逆向转换(用于查看现有配置):
dtc -I dtb -O dts -o dt-blob.dts /boot/firmware/dt-blob.bin

设备树blob结构详解

dt-blob.bin文件采用层次化结构组织配置信息:

核心结构

  1. videocore节:所有配置必须包含在此节内,作为根节点
  2. *pins_:针对不同Raspberry Pi型号的专用配置节

型号专用配置节

Raspberry Pi为各型号提供了专用配置节,包括但不限于:

  • 早期版本:pins_rev1, pins_rev2
  • B+系列:pins_bplus1, pins_bplus2
  • A+系列:pins_aplus
  • 二代/三代:pins_2b1, pins_2b2, pins_3b1, pins_3b2等
  • Zero系列:pins_pi0, pins_pi0w, pins_pi02w
  • 计算模块:pins_cm, pins_cm3, pins_cm4等

每个型号专用节可包含以下子节:

  1. pin_config:引脚级配置

    • pin@default:默认配置模板
    • pin@<编号>:特定GPIO引脚配置(如pin@32对应GPIO32)
  2. pin_defines:VideoCore功能引脚重映射

引脚配置参数

每个引脚配置节可包含以下参数:

  • 功能设置

    • 输入/输出模式
    • 特殊功能(I2C、SPI、PWM等)
  • 电气特性

    • 极性(active_high/active_low)
    • 上拉/下拉配置
    • 驱动电流(8mA或16mA,按bank设置)
  • 初始状态

    • 启动时激活/非激活

时钟系统配置

通过dt-blob.bin还可以配置复杂的时钟系统,但需要特别注意:

  1. 系统包含5个PLL(锁相环)
  2. 每个PLL有独立的VCO(压控振荡器)频率
  3. 每个VCO提供多个通道,可配置不同分频
  4. 时钟源到目标的映射有限制

示例配置:

clock_routing {
   vco@PLLA  { freq = <1966080000>; };  // 设置PLLA VCO频率
   chan@APER { div  = <4>; };           // 设置APER通道分频
   clock@GPCLK0 { pll = "PLLA"; chan = "APER"; }; // 路由配置
};

clock_setup {
   clock@PWM { freq = <2400000>; };     // 直接设置PWM时钟频率
};

最佳实践建议

  1. 谨慎修改时钟配置:除非必要,否则建议保持默认时钟设置
  2. 版本兼容性:确保使用正确的型号专用节
  3. 配置验证:修改前备份原配置,逐步测试变更
  4. 电气特性考量:注意驱动电流限制和上下拉配置
  5. 启动时序:为关键外设设计适当的启动延迟机制

通过深入理解Raspberry Pi的GPIO配置机制和设备树系统,开发者可以更灵活地定制硬件行为,满足各种嵌入式应用场景的需求。

documentation The official documentation for Raspberry Pi computers and microcontrollers documentation 项目地址: https://gitcode.com/gh_mirrors/doc/documentation

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

韦蓉瑛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值