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環境串列埠透傳
接下來實現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和樹莓派串列埠通訊。