嵌入式單片機之stm32串口你懂了多少!!
- 2020 年 3 月 2 日
- 筆記
stm32作為現在嵌入式物聯網單片機行業中經常要用多的技術,相信大家都有所接觸,今天這篇就給大家詳細的分析下有關於stm32的出口,還不是很清楚的朋友要注意看看了哦,在最後還會為大家分享有些關於stm32的影片資料便於學習參考。
什麼是串口
UART : Universal Asynchronous Receiver/Transmitter 通用非同步收發器
USART : Universal Synchronous Asynchronous Receiver/Transmitter
通用同步/非同步收發器
一種是常用也是最簡單的串列數據傳輸協議。數據線只需要兩根就可以實現全雙工。
Tx: 發送數據線
Rx: 接收數據線
A B
TX ———–> Rx
Rx <————Tx
全雙工: 兩個設備可以同時發送和接收
串列數據: 發送只一根線,一次只能發送一bit. 一bit接著一bit發送和接收。
模組通訊: 上位機 下位機
通訊一般需要兩個設備,我們把這兩個設備,人為叫做上位機, 下位機。
上位機: 把處理性能強的機子,上位機。數據大部分處理都在上位機完成。
下位機: 把數據採集的終端,處理性能單一的機子,下位機。
串口只有一根發送數據線,假如 A要發送一個字元數據 10101010 給B
A ——– ———
——– ——- …
高電平周期是多長?即使是不發送數據Tx線上也有一個電平狀態,接收方
它怎麼知道你是在發送呢?….
UART數據如何傳輸?
UART protocol 串口協議。
串口發送和接收數據是以幀為單位. Frame
1幀(Frame)= 1 start bit(起始位) + 5-9bits數據位 + 0/1bit 校驗位 + stop bits(0.5,
1,1,5,2)
起始位: 一個周期的低電平
數據位: 5-9bits數據位,具體是多少bits,需要雙方協商。並且傳送是先傳送LSB(最低位) … MSB
校驗位:
0 bit :沒有校驗位
1 bit :校驗位. 「賴子」 X
D0 D1 D2 … Dn X
奇校驗:要保證傳輸的1為奇數
D0 D1 D2 … Dn X 要保證這一串數據中1的個數為奇數
1 0 1 0 1 0 1 0 X(1)
1 0 1 0 1 0 1 1 X(0)
偶校驗:要保存傳輸的1為偶數
停止位: 高電平
0.5 個停止位。 半個周期的高電平
1 個停止位
1.5 個停止位
2 個停止位
Baudrate(波特率): 傳輸速率。
決定 時間周期。
115200 bps: bits per second
物理層標準 the physical layer standards
TTL level UART : TTL電平串口
RS-232:
RS-422:
RS-485:
TTL level UART:
邏輯低電平(0) 0V
邏輯高電平(1) 5V/3.3V
RS-232: 適合較長距離傳輸
邏輯低電平(0) +3v~+15V
邏輯高電平(1) -3v~-15v
TTL UART RS-232 RS-422 RS-485
電平 1 3.3V/5V 1 -5V ~ -15V +/- 2v +/- 1.5v
0 0V 0 5V ~ +15V
訊號 單端訊號 單端訊號 差分訊號 差分訊號
傳輸長度 < 2m <15m <1200m <1200m
不同標準的串口,引腳也不一樣。TX/Rx是一定存在的。
TTL
RX
TX
GND
VCC
STM32F4xx 串口控制器
TX
RX
硬體流控:
RTS: Request To Send 請求發送訊號
終端告訴對方可以向我傳輸數據啦。
CTS: Clear To Send 清除發送訊號
對方告知終端,我要向你發送數據啦
RTS ——-> CTS(對方)
CTS <——- RTS(對方)
標誌位:
TXE: Transmit data Register Empty
發送數據暫存器為空。
不代表上一次數據已經發送完成啦,因為數據有可能還在 shifter裡面
但是此時您可以向TDR寫數據啦。
TC : Transmit Complete
發送完成。
發送移位暫存器中的數據已經發送到Tx引腳上面去了。
RXNE: Read Data register Not Empty
接收數據暫存器不為空。意思是你可以讀數據啦。
STM32F4xx串口程式碼流程
(1) GPIO口配置
串口的TX/RX 引腳是由GPIO口來複用的。
a. 使能GPIO分組的時鐘
RCC_AHB1PeriphClockCmd
b. 配置GPIO口的功能 GPIO_Init
c. 選擇具體的復用功能
GPIO_PinAFConfig
(2) usart配置
a. 使能usart時鐘
b. USART_Init
USART_Init(USART_TypeDef * USARTx, USART_InitTypeDef *
USART_InitStruct);
typedef struct
{
uint32_t USART_BaudRate; // 波特率
uint16_t USART_WordLength; //傳輸字長 ,如下兩個任選其一:
USART_WordLength_8b
USART_WordLength_9b
在STM32中:傳輸字長=數據位數+檢驗位數
uint16_t USART_StopBits; //停止位數,如下 :
USART_StopBits_1 1bit停止位
USART_StopBits_1_5 1.5bit停止位
USART_StopBits_2 2 bits停止位
USART_StopBits_0_5 0.5bit停止位
uint16_t USART_Parity; //校驗方式,如下:
USART_Parity_No 無校驗
USART_Parity_Odd 奇校驗
USART_Parity_Even 偶校驗
uint16_t USART_Mode; //串口模式, 如下:可以組合
USART_Mode_Tx 發送模式
USART_Mode_Rx 接收模式
USART_Mode_Tx | USART_Mode_Rx 發送和接收模式
uint16_t USART_HardwareFlowControl; //硬體流控
USART_HardwareFlowControl_None 無硬體流控
USART_HardwareFlowControl_RTS RTS 請求發送。你可以接收對方的數據。
USART_HardwareFlowControl_CTS CTS 清除發送,你可以發數據給對方。
USART_HardwareFlowControl_RTS_CTS RTS_CTS 發送和接收都用流控
} USART_InitTypeDef;
(3) 中斷的配置
USART_ITConfig <- 配置串品的中斷
在STM32中一個USART只對應一個中斷通道,但是引起串口中斷的
事件有很多,比如:
TXE -> 發送暫存器為空,可以引起串口中斷
TC -> 發送完成,可以引起串口中斷
RXNE -> 接收暫存器不為空,可以引起串口中斷
……
只不過,這些事件需要"中斷控制位使能"
USART_ITConfig(USART1, USART_IT_RXNE,ENABLE);
USART_ITConfig就是用來把一個串口的XX事件,配置成是否引起串口中斷的
在串口中斷函數裡面,就需要判斷是哪個串口事件,引起了中斷!!!
NVIC_Init()
(4) 使能串口
USART_Cmd
接收(中斷函數)
USART1_IRQHanlder()
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
//有數據可讀啦
data = USART_ReceiveData(USART1); //讀取接收到的數據
}
//清除USART1的中斷標誌
USART_GetITStatus
}
USART_GetITStatus用來獲取串口的xx事件標誌位
發送數據
USART_SendData(USART1, 0x55);
while (USART_GetFlagStatus(USRAT1, USART_FLAG_TXE) == RESET); //等待發送結束