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