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