目錄
樹莓派環境序列槽透傳
STM32環境序列槽透傳
最近做一個項目需要STM32和樹莓派進行序列槽通信,實作原理如下:
第一步:使用USB轉TTL分别調試STM32和樹莓派的序列槽透傳,確定可以通信;
第二步:確定第一步成功後,将樹莓派和STM32連接配接,進行序列槽透傳。
下面進行具體實驗吧~
在開始前說明以下幾點:
1、樹莓派UART端口的位置:TXD位于HEAD-8;RXD位于HEAD-10;GND位于HEAD-6(可選其他GND)。
2、樹莓派的TXD應接USB轉序列槽裝置的RXD,當然如果測試失敗請交換RXD和TXD的順序。
樹莓派序列槽通信需要配置環境,主要修改兩處,具體如下:
第一處:進入 /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功能暫時
未知。
效果如下:
注意:
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和樹莓派序列槽通信。