树莓派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的教程, 敬请期待吧)
-
-
原创文章, 请尊重作者劳动成果, 转载需注明原帖,
网友评论