【嵌入式09】STM32串口通信,发送Hello Windows示例
本文主要描述串口協議和RS-232標準,RS232電平與TTL電平的區別,以及"USB/TTL轉232"模塊(以CH340芯片模塊為例)的工作原理。
- 一、串口協議
- 1、設備之間的通信方式
- 2、STM32串口通信基礎
- UART引腳連接方法
- 3、RS-232通信協議
- RS-232串口簡介
- 4、USB轉串口CH340接線
- 二、STM32的USART串口通信(查詢方式)
- 1、題目要求
- 2、準備
- 3、USB轉TTL與C8T6相連
- 4、CH340驅動安裝
- 5、代碼撰寫
- 6、串口助手觀察輸出
- 三、STM32的USART串口通信(HAL庫方式)
- 1、工程文件設置
- 四、keil觀察串口輸出波形
- 五、總結
一、串口協議
根據百度百科的定義:
串口通信指串口按位(bit)發送和接收字節。盡管比特字節(byte)的串行通信慢,但是串口可以在使用一根線發送數據的同時用另一根線接收數據。串口通信協議是指規定了數據包的內容,內容包含了起始位、主體數據、校驗位及停止位,雙方需要約定一致的數據包格式才能正常收發數據的有關規范。在串口通信中,常用的協議包括RS-232、RS-422和RS-485。
1、設備之間的通信方式
一般情況下,設備之間的通信方式分為串行通信和并行通信。
| 傳輸原理 | 數據各個位同時傳輸 | 數據按位順序傳輸 |
| 優點 | 速度快 | 占用引腳資源少 |
| 缺點 | 占用引腳資源多 | 速度相對較慢 |
按照數據的傳輸方向,串口通信分為:
- 單工:數據傳輸只支持數據在一個方向上傳輸;
- 半雙工:允許數據在兩個方向上傳輸。但是,在某一時刻,只允許數據在一個方向上傳輸,它實際上是一種切換方向的單工通信;它不需要獨立的接收端和發送端,兩者可以合并一起使用一個端口;
- 全雙工:允許數據同時在兩個方向上傳輸。因此,全雙工通信是兩個單工通信方式的結合,需要獨立的接收端和發送端。
按照通信方式,分為
- 同步通信:帶時鐘同步信號傳輸。比如:SPI,IIC通信接口。
- 異步通信:不帶時鐘同步信號。比如:UART(通用異步收發器),單總線。
在同步通信中,收發設備上方會使用一根信號線傳輸信號,在時鐘信號的驅動下雙方進行協調,同步數據。例如,通信中通常雙方會統一規定在時鐘信號的上升沿或者下降沿對數據線進行采樣。
在異步通信中不使用時鐘信號進行數據同步,它們直接在數據信號中穿插一些用于同步的信號位,或者將主題數據進行打包,以數據幀的格式傳輸數據。通信中還需要雙方規約好數據的傳輸速率(也就是波特率)等,以便更好地同步。常用的波特率有4800bps、9600bps、115200bps等。
在同步通信中,數據信號所傳輸的內容絕大部分是有效數據,而異步通信中會則會包含數據幀的各種標識符,所以同步通訊效率高,但是同步通訊雙方的時鐘允許誤差小,稍稍時鐘出錯就可能導致數據錯亂,異步通訊雙方的時鐘允許誤差較大。
常見串口通信的接口
| UART 通用異步收發器 | TXD:發送端 RXD:接收端 GND:共地 | 異步通信 | 全雙工 |
| 1-wire 單總線 | DQ:發送/接收端 | 異步通信 | 半雙工 |
| SPI | SCK:同步時鐘 MISO:主機輸入,從機輸出 MOSI:主機輸出,從機輸入 | 同步通信 | 全雙工 |
| I2C | SCK:同步時鐘 SDA:數據輸入/輸出端 | 同步通信 | 半雙工 |
2、STM32串口通信基礎
STM32的串口通信接口有兩種,分別是:UART(通用異步收發器)、USART(通用同步異步收發器)。
對于大容量STM32F10x系列芯片,分別有3個USART和2個UART。
UART引腳連接方法
RXD:數據輸入引腳,數據接受;
TXD:數據發送引腳,數據發送。
對于兩個芯片之間的連接,兩個芯片GND共地,同時TXD和RXD交叉連接。這里的交叉連接的意思就是,芯片1的RxD連接芯片2的TXD,芯片2的RXD連接芯片1的TXD。這樣,兩個芯片之間就可以進行TTL電平通信了。
3、RS-232通信協議
若是芯片與PC機(或上位機)相連,除了共地之外,就不能這樣直接交叉連接了。
盡管PC機和芯片都有TXD和RXD引腳,但是通常PC機(或上位機)通常使用的都是RS232接口(通常為DB9封裝),因此不能直接交叉連接。
RS232接口是9針(或引腳),通常是TxD和RxD經過電平轉換得到的。因此,要想使得芯片與PC機的RS232接口直接通信,需要也將芯片的輸入輸出端口也電平轉換成rs232類型,再交叉連接。
經過電平轉換后,芯片串口和rs232的電平標準是不一樣的:
- 單片機的電平標準(TTL電平):+5V表示1,0V表示0;
- Rs232的電平標準:+15/+13 V表示0,-15/-13表示1。
RS-232通訊協議標準串口的設備間通訊結構圖如下:
因此,單片機串口與PC串口通信遵循下面的連接方式:
在單片機串口與上位機給出的rs232口之間,通過電平轉換電路,實現TTL電平與RS232電平之間的轉換。
RS-232串口簡介
臺式機電腦后面的9針接口就是com口(串口) 在工業控制、數據采集上應用廣泛。
RS232接口(封裝D89)
通信過程中只有兩個腳參與通信,電路連接時,連接三個腳即可。
- 2腳:電腦的輸入RXD
- 3腳:電腦的輸出TXD 通過2 ,3 腳就可以實現全雙工(可同時收發)的串行異步通信
- 5腳:接地
PC串口與單片機串口連接方式:
其中,DB91是在電腦上的 DB92是在單片機實驗板上焊接著的
如果電腦沒有rs232口,只有USB口,可以用串口轉接線轉出串口,在電腦上位機上需要安裝驅動程序。
用串口通信比USB簡單,因為串口通信沒有協議,使用方便簡單。
4、USB轉串口CH340接線
USB轉串口模塊可以使用5V、3V3電壓供電,需要將跳線帽進行安裝。
可以對USB轉串口模塊進行測試,將USB的電壓引腳用跳帽接上,然后將RXD和TXD兩個引腳用跳帽或者杜邦線接上。
然后打開串口終端,點擊“手動發送”或者“自動發送”,如果在接收區可以接收到數據,說明USB轉串口模塊工作正常,否則需要檢查接線是否正確、電路板元器件是否損壞。
下圖是USB轉串口模塊的一些功能模塊的標示,USB轉串口電路板背后還預留了一些全信號輸出的接口,可以將電線直接焊接在這些引腳上來使用預留的功能。
即便管腳沒有這么多,但功能都是差不多的。
USB轉串口電路板與單片機的接線圖,VCC接線是為了單片機供電,USB轉串口的RXD引腳與單片機的TXD引腳相連,USB轉串口的TXD引腳與單片機的RXD引腳相連,兩者的GND引腳直接相連。
二、STM32的USART串口通信(查詢方式)
1、題目要求
完成一個STM32的USART串口通訊程序(查詢方式即可,暫不要求采用中斷方式),要求:
1)設置波特率為115200,1位停止位,無校驗位;
2)STM32系統給上位機(win10)連續發送“hello windows!”。win10采用“串口助手”工具接收。
3)在沒有示波器條件下,可以使用Keil的軟件仿真邏輯分析儀功能觀察管腳的時序波形,更方便動態跟蹤調試和定位代碼故障點。 請用此功能觀察串口輸出波形,并分析其波形反映的時序狀態正確與否,高低電平轉換周期(LED閃爍周期)實際為多少。
2、準備
STM32F103C8T6最小核心板
USB轉TTL
CH340驅動(USB串口驅動)_XP_WIN7共用
串口調試助手XCOM V2.3
相關資料(CH340驅動、XCOM)會放置在文末最后的網盤鏈接中
3、USB轉TTL與C8T6相連
具體原理請往上翻
| GND | G |
| 3V3 | 3V3 |
| RXD | PA9 |
| TXD | PA10 |
實際連接如下,注意boot0接跳線帽到1
4、CH340驅動安裝
在電腦設備管理器處查看有無com端口出現,有即可證明成功。
5、代碼撰寫
這里可以利用CubeMX來做,也可以直接編寫代碼,這里我采取后者形式。
建立工程可以參考之前的博客【嵌入式08】
我將工程模板放到文章最后的網盤鏈接中。
只需要修改下usart.c和test.c文件即可。
在SYSTEM組下雙擊usart.c,其中的uart_init函數,代碼如下
void uart_init(u32 pclk2,u32 bound) { float temp;u16 mantissa;u16 fraction; temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIVmantissa=temp; //得到整數部分fraction=(temp-mantissa)*16; //得到小數部分 mantissa<<=4;mantissa+=fraction; RCC->APB2ENR|=1<<2; //使能PORTA口時鐘 RCC->APB2ENR|=1<<14; //使能串口時鐘 GPIOA->CRH&=0XFFFFF00F;//IO狀態設置GPIOA->CRH|=0X000008B0;//IO狀態設置 RCC->APB2RSTR|=1<<14; //復位串口1RCC->APB2RSTR&=~(1<<14);//停止復位 //波特率設置USART1->BRR=mantissa; // 波特率設置 USART1->CR1|=0X200C; //1位停止,無校驗位. #if EN_USART1_RX //如果使能了接收//使能接收中斷 USART1->CR1|=1<<5; //接收緩沖區非空中斷使能 MY_NVIC_Init(3,3,USART1_IRQn,2);//組2,最低優先級 #endif }從該代碼可以看出,其初始化串口的過程,和我們前面介紹的一致。先計算得到USART1->BRR 的內容。然后開始初始化串口引腳,然之后設置波特率和奇偶校驗等。
這里需要注意一點,因為我們使用到了串口的中斷接收,必須在 usart.h 里面設置EN_USART1_RX 為 1(默認設置就是 1 的)。該函數才會配置中斷使能,以及開啟串口 1 的 NVIC中斷。這里我們把串口 1 中斷放在組 2,優先級設置為組 2 里面的最低。
在test.c中編寫如下代碼:
#include "sys.h" #include "usart.h" #include "delay.h" int main(void) { u16 t; u16 len; u16 times=0;Stm32_Clock_Init(9); //系統時鐘設置delay_init(72); //延時初始化uart_init(72,115200); //串口初始化為115200while(1){if(USART_RX_STA&0x8000){ len=USART_RX_STA&0x3FFF;//得到此次接收到的數據長度printf("\r\n Hello Windows! \r\n\r\n");for(t=0;t<len;t++){USART1->DR=USART_RX_BUF[t];while((USART1->SR&0X40)==0);//等待發送結束}printf("\r\n\r\n");//插入換行USART_RX_STA=0;}else{times++;if(times%200==0)printf("Hello Windows!\r\n"); delay_ms(10); }} }重點看下以下兩句:
USART1->DR=USART_RX_BUF[t];
while((USART1->SR&0X40)==0);//等待發送結束
第一句,其實就是發送一個字節到串口,通過直接操作寄存器來實現的。
第二句呢,就是我們在寫了一個字節在 USART1->DR 之后,要檢測這個數據是否已經被發送完成了,通過檢測USART1->SR 的第 6 位,是否為 1 來決定是否可以開始第二個字節的發送。
編譯成功后燒錄
6、串口助手觀察輸出
打開XCOM串口助手,彈出界面點擊打開串口,即可以接收到C8T6發送的數據Hello Windows!
成功!
三、STM32的USART串口通信(HAL庫方式)
1、工程文件設置
新建步驟不再贅述,采用的C8T6核心板,直接來到外設設置端
這里,我選用PB5連接LED作為電平顯示
設置USART2
時鐘設置
之后導出Keil文件即可
在main.c文件的主函數while循環中添加以下代碼:
之后編譯燒錄即可
四、keil觀察串口輸出波形
邏輯仿真分析儀使用可參考下一篇博客【嵌入式10】
仿真設置
在沒有示波器條件下,可以使用Keil的軟件仿真邏輯分析儀功能觀察管腳的時序波形,更方便動態跟蹤調試和定位代碼故障點。 用此功能觀察串口輸出波形,并分析其波形反映的時序狀態正確與否,高低電平轉換周期(LED閃爍周期)實際為多少。
但是通過實驗發現,觀察PA9、PA10波形一直是平的,沒有變化,后來發現是沒有用LED高低電平來顯示,因此這里我用PB5進行觀察
根據其周期間隔可以發現HAL庫導出工程時間十分精確。
五、總結
本文學習了描述串口協議和RS-232標準,RS232電平與TTL電平的區別,以及"USB/TTL轉232"模塊(以CH340芯片模塊為例)的工作原理,并實際操作串口通信hello windows,受益匪淺。
XCOM、CH340、新建工程模板網盤連接
鏈接:https://pan.baidu.com/s/1td7Y95lZehL9IYTZluCzhg
提取碼:u7iw
參考
[1] https://blog.csdn.net/qq_38410730/article/details/79887200
[2] https://blog.csdn.net/wangjiaweiwei/article/details/49612207
總結
以上是生活随笔為你收集整理的【嵌入式09】STM32串口通信,发送Hello Windows示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ArcGIS中去除Z或M值的方法
- 下一篇: pytorch使用DCN