树莓派串口问题与解决方案

树莓派3B和4代由于加入了蓝牙功能, 导致串口使用过程中出现了一系列问题, 我将我使用树莓派(3B+ & 4B)遇到的串口问题进行汇总和解答, 以作备忘, 同时能帮到大家的话就更好了

  • 树莓派3B+/4B的默认方案

    当使用官方树莓派系统镜像烧录系统后, 在树莓派终端执行ls /dev -al就可以观察到有这部分打印

    serial0 -> ttyS1

    serial1 -> ttyAMA0

    首先树莓派的GPIO中串口即指serial0(不知道串口在哪个位置在终端执行gpio readall), 而serial1指蓝牙.

    ttyS1表示mini-uart串口控制器, ttyAMA0表示PL011串口控制器

    也就是说, mini-uart接到了树莓派对外的串口排针上, 而PL001接到了蓝牙模块上(蓝牙模块和树莓派SOC通过串口进行通信)

    连接的方案是可以通过配置/boot/config.txt中的字段做配置的, 在后面会给出配置教程.

  • 存在问题:

    mini-uart容易受到soc中时钟的影响, 在树莓派切换core频率的时候, 容易受到干扰, 数据传输会出错.

吐槽: 官方将蓝牙接到PL001上避免蓝牙通信出问题无可厚非, 不过在我们去使用串口的时候, 由于它是连到mini-uart上的, 就会遇到各种各样奇怪的问题, 这就非常不能忍了(我认为与其让吧UART口接到mini-uart让它勉强工作, 还不如一开始就不接, 玩家想用串口自会去搜索教程, 了解这些个问题后然后自己做出权衡去修改配置, 不然很容易误导软件开发者, 轻则头发掉光, 重则直接躺平. )

  • 如何让串口正常使用

    首先在/boot/config.txt中添加enable_uart=1打开串口功能

    • 串口切换保证串口通信正常

      在/boot/config.txt中添加dtoverlay=disable-bt, 可以禁用蓝牙, 并且ttyAMA0会接到serial0上

      在/boot/config.txt中添加dtoverlay=miniuart-bt, 会吧蓝牙接到miniuart, ttyAMA0会接到serial0, 适用于想要保留蓝牙功能的情况

    • 固定core频率保证串口通信正常

      这种适用于想要在官方配置下, 尽量利用miniuart进行串口通信, 由于miniuart容易受到core频率变动的影响, 则在/boot/config.txt中添加core_freq=250 (数字可自己设置, 我设置的比较随便)固定它的频率, 也是一种解决方案

  • 树莓派的串口使用(未完待续..2022.4.10)

    • 通过串口通信控制树莓派
    • 树莓派通过串口与其他设备通信
      • 树莓派上安装minicom使用技巧
      • 树莓派上安装putty使用技巧
  • 题外话

    • 树莓派启动顺序(/boot/指SD卡的第一分区, 方便理解)

      • stage1: 它会先启动GPU上固化的固件, 固件寻找SD卡的/boot/bootcode.bin引导程序(4B将它固化到了SPI Boot EEPROM中, 所以更新它需要rpi-eeprom命令)加载到内存并运行(看来这一阶段已经初始化好内存了)

      • stage2: bootcode.bin寻找SD卡中的/boot/start.elf并启动, 此文件为GPU的固件(4B叫start4.elf)

        在/boot/config.txt中添加uart_2ndstage=1可以在串口看到这一阶段的串口打印

      • GPU去读取config.txt的设置, 然后读取内核镜像和启动参数, 加载到内存然后启动CPU, CPU结束复位状态开始运行Linux内核(也可以配置成启动UEFI, 用于引导Win, 后续会出一个编译树莓派UEFI的教程, 敬请期待吧)

原创文章, 请尊重作者劳动成果, 转载需注明原帖,

你可能感兴趣的:(树莓派串口问题与解决方案)