天天看點

樹莓派4B新手入門4-UART通信以及debug

作者:菜卓001

UART是一種串行、異步、全雙工的通信協定,在嵌入式領域應用的非常廣泛。開發者可以使用序列槽來調試,如擷取開機階段較早的日志。android可以通過adb,不過adb程序啟動較晚,并且擷取不到bootloader階段的資訊。通過序列槽可以強制進入fastboot,也可以擷取上電後的bootloader資訊。在調試階段是最基本的手段,後面再debug kernel會經常用到,這裡記錄下配置的過程。

UART 類型

Raspberry Pi有2種類型的序列槽可供使用:PL011和mini UART。

  • PL011 UART為硬體序列槽,是由ARM設計或授權的,具有獨立的時鐘源,可靠性和性能好吞吐量高,通常是建議使用該序列槽通信;
  • mini UART和VPU(Video Processing Unit,視訊處理單元)核心頻率有關,當VPU核心頻率變化,UART的波特率也會變化,不是特别穩定。

注:Raspberry Pi 所有序列槽采用的電壓為3.3V,如果用5V可能會損壞。

不同型号Raspberry Pi對應的UART類型有差異:

  • Raspberry Pi Zero, 1, 2 and 3
Name Type
UART0 PL011
UART1 mini UART
  • Raspberry Pi 4 and 400
Name Type
UART0 PL011
UART1 mini UART
UART2 PL011
UART3 PL011
UART4 PL011
UART5 PL011

注:The Raspberry Pi 4B和400有額外新增4個PL011序列槽,預設是關閉的

Primary UART和Secondary UART

Primary UART:為Pi的主序列槽,連接配接到硬體引腳上:GPIO14->TXD0; GPIO15->RXD0。

Secondary UART:為Pi的輔助序列槽,不存在于GPIO連接配接器上,通常被藍牙控制器使用。

注;GPIO引腳上使用的一定是主序列槽,主序列槽和UART類型對應關系和Pi的型号有關系。

不同型号的Pi的對應關系:

Model first PL011 mini UART
Raspberry Pi Zero primary secondary
Raspberry Pi Zero W / Raspberry Pi Zero 2 W secondary (Bluetooth) primary
Raspberry Pi 1 primary secondary
Raspberry Pi 2 primary secondary
Raspberry Pi 3 secondary (Bluetooth) primary
Compute Module 3 & 3+ primary secondary
Raspberry Pi 4 secondary (Bluetooth) primary

上表可以看出Raspberry Pi 4上primary為mini UART(預設關閉),而secondary為PL011,被藍牙使用。如果想要使用GPIO接序列槽闆(USB轉TTL)進行通信或調試,必須打開primary。可以檢視/dev/裝置确認:ls -l /dev/

樹莓派4B新手入門4-UART通信以及debug

UART初始化狀态

打開primary序列槽步驟:

  1. sudo raspi-config
  2. 選擇:3 - Interface Options.
  3. 選擇:P6 - Serial Port.
  4. At the prompt Would you like a login shell to be accessible over serial? 選擇: 'No'
  5. At the prompt Would you like the serial port hardware to be enabled? 選擇: 'Yes'
樹莓派4B新手入門4-UART通信以及debug

硬序列槽serial0

樹莓派4B新手入門4-UART通信以及debug

/dev/下2個序列槽裝置

mini UART由于時鐘源采用的是VPU的(依據2023-02-04官方文檔解釋),是以并不是固定的,這樣會導緻UART波特率也會變化。修改參數做如下解釋:

  • 如果primary UART對應的是mini UART,打開後即配置了參數enable_uart=1,那VPU的時鐘預設就固定為了250MHZ,不需要特殊設定其他參數。
  • 如果secondary UART對應的是mini UART,需要在/boot/config.txt設定core_freq=250來固定時鐘頻率。

UART接線

如果想要PC和Raspberry Pi進行序列槽通信或者debug,需要借助USB轉TTL小闆,這裡采用的CH340G子產品,接線如下,CH340小闆輸入(rx)接Pi的輸出(tx),CH340小闆輸出(tx)接Pi的輸入(rx),CH340小闆地線tx接Pi的地線。供電可以不用接,USB可以供電。

樹莓派4B新手入門4-UART通信以及debug

CH340接線

PC端安裝序列槽助手,我這裡使用的是友善序列槽調試助手,

Raspberry Pi端可以通過minicom工具和PC端進行通信,安裝指令:

sudo apt-get install minicom           

運作指令,啟動minincom,115200為波特率,ttyS0為對應GPIO pin腳的序列槽裝置,

sudo minicom -D /dev/ttyS0 -b115200           
樹莓派4B新手入門4-UART通信以及debug

序列槽助手

UART擷取開機日志

linux雖然在啟動階段比較早的啟動了UART,還是需要經過一定的時間,有些kernel啟動異常無法診斷,可以通過以下2步擷取更多的log資訊,如start.elf debug資訊:

1、在/boot/cmdline.txt設定earlycon參數來擷取更早階段的資訊,添加以下資訊,針對不同的PI型号設定:

注:如果型号和參數不對應,可能會導緻Raspberry Pi起不來

  • Raspberry Pi 4, 400:
earlycon=uart8250,mmio32,0xfe215040
earlycon=pl011,mmio32,0xfe201000           
  • Raspberry Pi 2, Pi 3:
earlycon=uart8250,mmio32,0x3f215040
earlycon=pl011,mmio32,0x3f201000           
  • Raspberry Pi 1, Pi Zero:
earlycon=uart8250,mmio32,0x20215040
earlycon=pl011,mmio32,0x20201000           
樹莓派4B新手入門4-UART通信以及debug

cmdline.txt

2、在/boot/config.txt中添加uart_2ndstage=1,如下:

樹莓派4B新手入門4-UART通信以及debug

config.txt

3、重新開機檢視序列槽助手資訊:

樹莓派4B新手入門4-UART通信以及debug

kernel log

primary采用PL011

預設serial0為primary,serial1為secondary。而如果對序列槽通信性能有要求,需要更穩定,可以把serial0設定為PL011。Raspberry Pi 4B的PL011預設是被藍牙使用,需要關閉,通過修改/boot/config.txt,,添加:dtoverlay=disable-bt或者dtoverlay=miniuart-bt。

注:上面的方式是官網給出的,文檔有時效性(2023-02-04)。另外網上很多使用的是dtoverlay=pi3-miniuart-bt,嘗試了下也是可以的,可能依據的是老文檔。

樹莓派4B新手入門4-UART通信以及debug

關閉藍牙

樹莓派4B新手入門4-UART通信以及debug

serial0修改後

打開UART2/3/4/5

The Raspberry Pi 4B預設有6個序列槽,其中沒有打開,新手也可以直接通過打開其他的序列槽使用,就不用以上操作那麼麻煩了。檢視序列槽資訊:dtoverlay -a|grep uart

樹莓派4B新手入門4-UART通信以及debug

uart資訊

檢視uart的GPIO資訊,如檢視uart3:dtoverlay -h uart3

樹莓派4B新手入門4-UART通信以及debug

uart3

在/boot/config.txt中打開uart2/3/4/5:

dtoverlay=uart2
dtoverlay=uart3
dtoverlay=uart4
dtoverlay=uart5           

對應關系如下,用minicom測試時注意修改dev

UART DEV TX RX
UART2 ttyAMA1 GPIO0 GPIO1
UART3 ttyAMA2 GPIO4 GPIO5
UART4 ttyAMA3 GPIO8 GPIO9
UART5 ttyAMA4 GPIO12 GPIO13

繼續閱讀