STM32F051——USART
????????我在大二學(xué)32的時(shí)候曾經(jīng)寫過一篇博客,現(xiàn)在看了一個(gè)韓老師的專題課后再來完善一下32串口方面的知識(shí)。所有的知識(shí)都可在官方手冊中找到,目前我認(rèn)為學(xué)習(xí)一個(gè)新的芯片,最全最細(xì)的就是官方手冊了,英文看不懂可以看中文的,不過最好是英文的,翻譯有的地方有偏差。
---------------------------------------------------------------------------------------------------------------------------------
目錄
1 協(xié)議基礎(chǔ)知識(shí)介紹
1.1 同步通信和異步通信
同步通信:
異步通信:
1.2 串行通信和并行通信的區(qū)別
串行通信:
并行通信:
串行傳輸:
并行傳輸:
1.3 單工、半雙工、全雙工
1.4 常見通信總結(jié)
1.5 USART基本概念
1.6 串口電路連接
1.7 STM32f051串口?
1.8 串口通信協(xié)議介紹
1.9 波特率
2. USART寄存器介紹
2.1 控制寄存器 USART_CR
USART_CR1
USART_CR2
2.2 波特率寄存器 USART_BRR
2.3 中斷和狀態(tài)寄存器 USART_ISR
2.4 數(shù)據(jù)發(fā)送寄存器 USART_TDR
2.5 數(shù)據(jù)接收寄存器 USART_RDR?
3 USART開發(fā)傳輸控制流程
3.1 USART硬件原理圖分析
4 實(shí)踐:USART控制——字符傳輸讀 寫
4.1 CubeMX中配置管腳?
?4.2 串口數(shù)據(jù)的發(fā)送和接收
4.3?串口傳輸函數(shù)——讀取寄存器方式
?4.4 實(shí)踐:USART控制——字符傳輸利用庫
(1) 串口的發(fā)送函數(shù)
(2) 串口的接收函數(shù)
4.5 實(shí)踐6:USART控制——實(shí)現(xiàn)printf()串 口重定向輸出
1 協(xié)議基礎(chǔ)知識(shí)介紹
1.1 同步通信和異步通信
通信,最少要有兩個(gè)對象,一個(gè)收,一個(gè)發(fā)
同步通信:
????????一般情況下同步通信指的是通信雙方根據(jù)同 步信號(hào)進(jìn)行通信的方式。比如通信雙方有一個(gè)共同的時(shí) 鐘信號(hào),大家根據(jù)時(shí)鐘信號(hào)的變化進(jìn)行通信。
?
異步通信:
????????是指數(shù)據(jù)傳輸速度匹配依賴于通信雙方有自 己獨(dú)立的系統(tǒng)時(shí)鐘,大家約定好通信的速度。異步通信 不需要同步信號(hào),但是并不是說通信的過程不同步。數(shù) 據(jù)量大會(huì)有誤差。(兩邊都有自己獨(dú)立的時(shí)鐘信號(hào))
注意:同步通信有時(shí)鐘線,異步通信沒有時(shí)鐘線。
1.2 串行通信和并行通信的區(qū)別
串行通信:
指的是同一時(shí)刻只能收或發(fā)一個(gè)bit位信息。 因此只用1根信號(hào)線即可。
并行通信:
指的是同一時(shí)刻可以收或發(fā)多個(gè)bit位的信 息,因此需要多根信號(hào)線才行。
串行傳輸:
數(shù)據(jù)按位順序傳輸。
-優(yōu)點(diǎn):占用引腳資源少
-缺點(diǎn):速度相對較慢
例如:UART 串口
?
并行傳輸:
數(shù)據(jù)各個(gè)位同時(shí)傳輸。
-優(yōu)點(diǎn):速度快
-缺點(diǎn):占用引腳資源多 IO口資源有限和使用緊張;
1.3 單工、半雙工、全雙工
單工:要么收,要么發(fā),只能做接收設(shè)備或者發(fā)送設(shè) 備。比如收音機(jī)
半雙工:可以收,可以發(fā),但是不能同時(shí)收發(fā), 比如對 講機(jī)
全雙工:可以在同一時(shí)刻既接收,又發(fā)送。 比如手機(jī)
?
1.4 常見通信總結(jié)
1.5 USART基本概念
????????通用同步異步收發(fā)器(USART)靈活地與外部設(shè)備進(jìn)行 全雙工數(shù)據(jù)通信,滿足外部設(shè)備對工業(yè)標(biāo)準(zhǔn)NRZ異步串 行數(shù)據(jù)格式的要求。USART通過小數(shù)波特率發(fā)生器提供 了多種波特率。它支持同步單向通信和半雙工單線通 信;還支持LIN(局域互聯(lián)網(wǎng)絡(luò)),智能卡協(xié)議與IrDA (紅外數(shù)據(jù)協(xié)會(huì))SIR ENDEC規(guī)范,以及調(diào)制解調(diào)操作 (CTS/RTS)。而且,它還支持多處理器通信。
???????? USART**支持同步模式,因此USART 需要同步始終信 號(hào)USART_CK(如STM32 單片機(jī)),通常情況同步信號(hào) 很少使用,因此USART和一般單片機(jī)UART使用方式是 一樣的,都使用異步模式。**
1.6 串口電路連接
接口與外部設(shè)備通過三個(gè)引腳相連, RX,TX,GND
任何 USART 雙向通訊要求最少有兩個(gè)引腳: 接收數(shù)據(jù) 輸入(RX)和發(fā)送數(shù)據(jù)輸出(TX)
RX: 接收數(shù)據(jù)輸入是串行數(shù)據(jù)的輸入口。 使用過采樣技 術(shù)來完成數(shù)據(jù)恢復(fù),以區(qū)別輸入數(shù)據(jù)和噪聲。
TX: 數(shù)據(jù)發(fā)送輸出。 當(dāng)發(fā)送器被禁止,輸出腳回到其 I/O 口配置狀態(tài)。 當(dāng)發(fā)送器被使能,但不發(fā)送數(shù)據(jù)時(shí),TX 腳 為高電平輸出。 在單線和智能卡模式中,這個(gè)口線既用 于發(fā)送數(shù)據(jù)也 用于接收數(shù)據(jù)。
注意:
(1)電腦用的TTL電平和EIA電平不能直接連;
(2)TTL電平, 0V表示0 ,大于3.3或者5伏就表示為1了;
????????DB9插槽已經(jīng)很少了,或者迷你USB口插槽,因此有的 是USB線,這時(shí)需要當(dāng)做串口用的話需要用驅(qū)動(dòng)轉(zhuǎn)換, CH340。
1.7 STM32f051串口?
?
STM32F051內(nèi)置多達(dá)兩個(gè)通用同步 / 異步收發(fā)器( USART1 和 USART2 ),通信速度可達(dá) 6 Mbit / s
如果使用 USART1進(jìn)行串口傳輸通訊。 查找原理圖和手冊,對應(yīng)寄存器是PA9,PA10。
1.8 串口通信協(xié)議介紹
協(xié)議很重要!!!?
?從左到右,看圖上發(fā)生的事件,實(shí)際發(fā)送從起始位開 始,停止位結(jié)束。
1. 約定數(shù)據(jù)什么時(shí)候發(fā)送,不傳輸數(shù)據(jù)的時(shí)候默認(rèn)都是高 電平;
2. 起始位:開始發(fā)送的時(shí)候,發(fā)送一個(gè)低電平,作為起始 位;
3. 數(shù)據(jù)位:約定數(shù)據(jù)位8~9位(正常的通訊協(xié)議是5~8位, 但是STM32F0要求是8~9);數(shù)據(jù)的低位先發(fā)送;
4. 校驗(yàn)位:數(shù)據(jù)發(fā)送完成,發(fā)送一個(gè)可選的校驗(yàn)位,檢驗(yàn) 數(shù)據(jù)的正確性; (奇校驗(yàn),奇校驗(yàn)位設(shè)置1bit值為1,發(fā)送的數(shù)據(jù)里為1的 bit位的個(gè)數(shù)加上奇校驗(yàn)位的發(fā)送的奇校驗(yàn)標(biāo)志1,一共是奇 數(shù)個(gè)1,就是正確發(fā)送。偶校驗(yàn)同理),一般傳輸量不大, 不會(huì)產(chǎn)生誤差,所以一般不校驗(yàn);
5. 停止位:1到2個(gè)bit數(shù)據(jù),一般是設(shè)置為0;
6. 約定數(shù)據(jù)傳輸?shù)乃俾?#xff0c;一般是用到是9600,115200(不 是純數(shù)據(jù)位,包含了起始位等);
例如: 0 1 0 1 0 0 0 0 0 0 **TXD 串口輸出0x05波形圖、 注意是低位先發(fā)送**
1.9 波特率
????????在串行通信中,用“波特率”來描述數(shù)據(jù)的傳輸速率。所謂 波特率,既每秒傳送的二進(jìn)制位數(shù),其單位為bps(bits per second)。它是衡量串行數(shù)據(jù)速度快慢的重要指 標(biāo)。
????????國際上規(guī)定一個(gè)標(biāo)準(zhǔn)的波特率系列: 110、300、600、 1200、1800、2400、4800、9600、115200、 14.4Kbps、19.2Kbps、……
例如:115200bps、指每秒傳送115200位。通信雙方必 須設(shè)置同樣的同學(xué)速率才能正常通信
注意:實(shí)際的數(shù)據(jù)沒這么多,還包括起始位,結(jié)束位, 校驗(yàn)位
2. USART寄存器介紹
2.1 控制寄存器 USART_CR
USART_CR1
?32位,其中[31:26]無效,
????????以上描述,表明控制寄存器可以配置中斷使能、通訊協(xié) 議控制位,我們的開發(fā)只需要其中的一部分,也夠用 了,其他具體的配置需求可以參看手冊的24章。
注意:串口通訊協(xié)議的 配置,通常是8N1 配置:
8個(gè)通訊數(shù)據(jù)位, N沒有奇偶校驗(yàn),1個(gè)停止位;
USART_CR2配置停止位。
USART_CR2
?
?串口通訊協(xié)議的 8N1 配置 8個(gè)通訊數(shù)據(jù)位, N沒有奇偶校驗(yàn),1個(gè)停止位;
2.2 波特率寄存器 USART_BRR
????????記錄了 USART 的波特率。手動(dòng)配置需要有公式去賦值, STM32CubeMX生成的工程會(huì)自動(dòng)幫助配置,具體實(shí)現(xiàn) 代碼可以用來了解。?
2.3 中斷和狀態(tài)寄存器 USART_ISR
?????????用于判斷輸入、釋放數(shù)據(jù)的狀態(tài): 控制寄存器中數(shù)據(jù)發(fā)送位(TXE)為1,表示TDR已經(jīng)有數(shù) 據(jù)放到移位寄存器TX Shift Reg,等待移位寄存器輸出 (寫外設(shè))完畢;(發(fā)送寄存器(TXE)為空時(shí),注意 USART_TDR 寄存器此時(shí)是空的,即可以往 USART_TDR 寫入數(shù)據(jù)。此時(shí)寫入 USART_TDR 寄存器不會(huì)覆蓋先前 在 USART_TDR 中的數(shù)據(jù),已經(jīng)到移位寄存器啦。) 控制寄存器中數(shù)據(jù)接收位(RXNE)為1,表示RDR已經(jīng)有 數(shù)據(jù)從移位寄存器RX Shift Reg中一位一位移動(dòng)過來, 等待被輸入(芯片讀)完畢;所以置位ISR的數(shù)據(jù)接收位 (RXNE),就會(huì)設(shè)置將 RX Shift Reg 接收的數(shù)據(jù)移動(dòng)到 USART_RDR 寄存器里,傳輸出錯(cuò),ORE被設(shè)置,具體 可以參考手冊了解。
2.4 數(shù)據(jù)發(fā)送寄存器 USART_TDR
?
2.5 數(shù)據(jù)接收寄存器 USART_RDR?
只讀,不可寫,保證讀到的是接收到的。
串口的發(fā)送和接收過程舉例:
上、中、下三部分:下是接收數(shù)據(jù)過程、中串口速度控 制(波特率)、上發(fā)送數(shù)據(jù)過程?
?
peripheral BUS:外設(shè)總線
Transmitter: 發(fā)送器
Receiver:? 接收器
Buffer:緩沖
Register:寄存器
FIFO:先入先出??一段空間大小的字符串傳輸,不是一個(gè)字節(jié);
什么是FIFO?_大fu啊的博客-CSDN博客_fifo
Clock Source:時(shí)鐘源
shifter:位移寄存器
Holding Register:存儲(chǔ)寄存器
Control Unit:控制器
Non-FIFO 一個(gè)字節(jié)一個(gè)字節(jié)傳輸模式
Control unit 控制單元(檢查是否有數(shù)據(jù)、控制移位寄 存器)
TDR 發(fā)送數(shù)據(jù)寄存器:存儲(chǔ)數(shù)據(jù),控制單元檢測有數(shù)據(jù) 要傳輸,放到傳輸控制寄存器,發(fā)送移位會(huì)一位一位的 發(fā)送出去。
RDR 接收數(shù)據(jù)寄存器:接收數(shù)據(jù),控制單元檢測有數(shù)據(jù) 要讀取,接收位移會(huì)一位一位的讀取,放到接收控制寄 存器。
Buad-rate generator 波特率產(chǎn)生器(控制接收和發(fā)送 的速度)
ISR 狀態(tài)寄存器(發(fā)送數(shù)據(jù)狀態(tài)TEX,第7位;接收數(shù)據(jù)狀 態(tài)RXNE,第5位)
TDR 數(shù)據(jù)發(fā)送寄存器(發(fā)送的數(shù)據(jù))
RDR 數(shù)據(jù)接收寄存器(讀到的數(shù)據(jù))
3 USART開發(fā)傳輸控制流程
3.1 USART硬件原理圖分析
注意:如果無法識(shí)別串口,安裝好ch340串口驅(qū)動(dòng)。我分享了一個(gè)鏈接
鏈接:https://pan.baidu.com/s/1os__C48tMrrgEjYI-e7fUw?pwd=82gt?
提取碼:82gt?
4 實(shí)踐:USART控制——字符傳輸讀 寫
4.1 CubeMX中配置管腳?
設(shè)置PA10和PA9分別收發(fā)管腳使用** ,且需要注意咱們 是用USART(同步異步串行接口)的異步功能,那么這里 要明確去設(shè)置為異步通訊!*
之后要注意配置通訊協(xié)議,默認(rèn)是115200,8N1。
?
?4.2 串口數(shù)據(jù)的發(fā)送和接收
4.3?串口傳輸函數(shù)——讀取寄存器方式
在usart.c中編寫一下代碼?
(1) **串口發(fā)送一個(gè)字符:** void Uart_Putchar(uint8_t ch) { //等待TDR為空,表示可寫,ISR這時(shí)TXE是1 while(!(USART1->ISR &(1<<7))); USART1->TDR = ch;//發(fā)送字符 } (2) **串口接收一個(gè)字符:** uint8_t Uart_Getchar(void) { //等待RDR不為空,表示收到數(shù)據(jù),ISR這時(shí)RXNE是1 while(!(USART1->ISR & (1<<5))); return USART1->RDR;//返回收到的字符 }在usart.h中聲明函數(shù)?
/* USER CODE BEGIN Includes */ void Uart_Putchar(uint8_t ch); uint8_t Uart_Getchar(void); /* USER CODE END Includes */?
Main.c中編寫測試代碼 char ch = 0; while (1) { ch = Uart_Getchar(); Uart_Putchar(ch); }?
編譯后再下載到板子上。 板子接上串口線,和電腦連接,設(shè)備識(shí)別為如下端口:
?
如果你的串口線接線到電腦正確,但是沒有識(shí)別到端 口,可以嘗試安裝CH340驅(qū)動(dòng)。?
識(shí)別成功后,打開串口助手,配置如下:
配置好后,點(diǎn)擊“打開”,在輸入框里輸入要發(fā)送的字符 串,點(diǎn)擊“發(fā)送”,可以看到接收框內(nèi)收到對應(yīng)得字符串。
?
拓展:實(shí)現(xiàn)字符串輸出函數(shù) void Uart_Putstring(uint8_t *str) {while(*str != '\0'){Uart_Putchar(*str);str++;} }?4.4 實(shí)踐:USART控制——字符傳輸利用庫
函數(shù) HAL庫中串口的收發(fā)函數(shù) 在工程stm32f0xx_hal_uart.c文件中,定義了串口傳輸 庫函數(shù)。
(1) 串口的發(fā)送函數(shù)
HAL_UART_Transmit(UART_HandleTypeDef *huart,
uint8_t *pData, uint16_t Size, uint32_t Timeout);
?
(2) 串口的接收函數(shù)
HAL_UART_Receive(UART_HandleTypeDef *huart,
uint8_t *pData, uint16_t Size, uint32_t Timeout);
打印一行測試:
?
4.5 實(shí)踐6:USART控制——實(shí)現(xiàn)printf()串 口重定向輸出
????????printf函數(shù)的使用一般是在有屏幕的界面上實(shí)現(xiàn)代碼的輸 出調(diào)試功能,而我們的開發(fā)環(huán)境中一般是沒有屏幕的, 此時(shí)我們可以將輸出轉(zhuǎn)移到其他設(shè)備上。在串口開發(fā) 中,就經(jīng)常利用此調(diào)試方法。需要注意的是printf函數(shù)的 傳輸調(diào)用的是c庫中的fputc函數(shù)。因此我們?nèi)绻匦聦?了fputc函數(shù),就可以改變printf函數(shù)的功能,可以向串 口打印輸出。?
int fputc(int ch,FILE *f) {while((USART1->ISR&(1<<7)) == 0);USART1->TDR=(uint8_t)ch;return ch; }這里我之前專門寫過一篇介紹輸入輸出重定向的博文:
STM32——我對輸入輸出重定向的理解_宇努力學(xué)習(xí)的博客-CSDN博客_清除txe
總結(jié)
以上是生活随笔為你收集整理的STM32F051——USART的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AV1学习笔记一
- 下一篇: dat解密成php,dat文件分析解密工