天天看點

STM32和樹莓派序列槽透傳

目錄

樹莓派環境序列槽透傳

STM32環境序列槽透傳

最近做一個項目需要STM32和樹莓派進行序列槽通信,實作原理如下:

第一步:使用USB轉TTL分别調試STM32和樹莓派的序列槽透傳,確定可以通信;

第二步:確定第一步成功後,将樹莓派和STM32連接配接,進行序列槽透傳。

下面進行具體實驗吧~

在開始前說明以下幾點:

1、樹莓派UART端口的位置:TXD位于HEAD-8;RXD位于HEAD-10;GND位于HEAD-6(可選其他GND)。

2、樹莓派的TXD應接USB轉序列槽裝置的RXD,當然如果測試失敗請交換RXD和TXD的順序。

STM32和樹莓派序列槽透傳

樹莓派序列槽通信需要配置環境,主要修改兩處,具體如下:

第一處:進入  /boot/cmdline.txt 檔案

輸入以下指令:

sudo nano /boot/cmdline.txt      

删除以下部分:

console=ttyAMA0,115200 kgdboc=ttyAMA0,115200      

最終變為:

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait      

第二步:進入  /etc/inittab  檔案

sudo nano /etc/inittab      

注釋最後一行内容:

#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100      

配置完之後便可測試一下樹莓派的UART是否正常工作,而minicom便是一個簡單好用的工具。minicom是linux/樹莓派平台序列槽調試工具,相當于windows上的序列槽調試助手。此時需要先安裝minicom:

sudo apt-get install minicom      

接下來啟動minicom工具:

minicom -b 9600 -o -D /dev/ttyAMA0
#-b代表波特率,-D代表端口,/dev/ttyAMA0 類似于windows中的COM1,-o功能暫時      

未知。

效果如下:

STM32和樹莓派序列槽透傳

注意:

1、minicom發送内容直接在控制台中輸入内容即可,如果minicom打開了回顯可在控制台中觀察到輸出内容,如果回顯關閉則控制台中沒人任何反應,千萬不要以為minicom沒有正常工作。

2、minicom回顯控制,先Ctrl+A,再E。可翻轉回顯狀态(原來回顯打開則此事回顯關閉)

3、minicom回顯關閉,先Ctrl+A,再Q。

minicom僅滿足調試用途,如果需要程式設計解決問題那麼python的serial擴充庫——pyserial則是一個不錯的選擇。

收下需要安裝pyserial擴充庫,可使用pip或者easy_install安裝,也可以直接選擇apt-get工具安裝。

若使用apt-get工具安裝,可輸入以下指令:

sudo apt-get install python-serial      

當以上步驟成功後,就可以使用Python編寫樹莓派序列槽透傳程式,具體Demo如下:

# -*- coding: utf-8 -*
import serial
import time
# 打開序列槽
ser = serial.Serial("/dev/ttyAMA0", 9600)
def main():
    while True:
        # 獲得接收緩沖區字元
        count = ser.inWaiting()
        if count != 0:
            # 讀取内容并回顯
            recv = ser.read(count)
            ser.write(recv)
        # 清空接收緩沖區
        ser.flushInput()
        # 必要的軟體延時
        time.sleep(0.1)
   
if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        if ser != None:
            ser.close()      

此時實作了樹莓派的序列槽通信功能。

接下來實作STM32序列槽透傳,這裡我使用的MCU是STM32F103C8T6,配置UART1,STM32不需要配置環境直接在Demo中配置GPIO即可,将USB轉TTL的TX連接配接STM32的RX(PA10),USB轉TTL的RX連接配接STM32的TX(PA9),核心Demo如下:

#include "usart1.h"
#include <stdarg.h>
void USART1_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); 
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);    
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
  GPIO_Init(GPIOA, &GPIO_InitStructure);   
 
    USART_InitStructure.USART_BaudRate = 115200;    
    USART_InitStructure.USART_WordLength = USART_WordLength_8b; 
    USART_InitStructure.USART_StopBits = USART_StopBits_1;  
    USART_InitStructure.USART_Parity = USART_Parity_No ;  
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART1, &USART_InitStructure);  
    USART_Cmd(USART1, ENABLE);
}
 void UART1SendByte(unsigned char SendData)
{    
        USART_SendData(USART1,SendData);
        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);     
}  
unsigned char UART1GetByte(unsigned char* GetData)
{       
        if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
        {  return 0;
  }
        *GetData = USART_ReceiveData(USART1); 
        return 1;
}
void UART1Test(void)
{
       unsigned char i = 0;
       while(1)
       {    
   while(UART1GetByte(&i))
        {
         USART_SendData(USART1,i);
        }      
       }     
}      

若有疑問可下載下傳具體工程Demo:

https://download.csdn.net/download/m0_38106923/10799470

當STM32測試成功後,恭喜各位,将樹莓派的TX和STM32的RX(PA10)連接配接,樹莓派的RX和STM32的TX連接配接(PA9),注意一定要将STM32的GND和樹莓派的GND連接配接,即可實作STM32和樹莓派序列槽通信。