物聯網之STM32開發三(USART串列埠)
STM32-USART串列埠的應用
內容概要:
序列通訊的基本概念
串列埠暫存器介紹
STM32實現串列埠資料的收發
HAL串列埠庫函式的使用及printf的實現
序列通訊的基本概念:
內容概要:
通訊的基本概念
USART介紹
串列埠的電路連線
串列埠的通訊協議
同步通訊和非同步通訊:
通訊,最少要有兩個物件,一個收,一個發。
同步通訊:一般情況下同步通訊指的是通訊雙方根據同步訊號進行通訊的方式。比如通訊雙方有一個共同的時鐘訊號,大家根據時鐘訊號的變化進行通訊。
非同步通訊:是指資料傳輸速度匹配依賴於通訊雙方有自己獨立的系統時鐘,大家約定好通訊的速度。非同步通訊不需要同步訊號,但是並不是說通訊的過程不同布。
序列通訊和並行通訊的區別:
序列通訊:指的是同一時刻只能收或發一個bit位資訊。因此只用1根訊號線即可。
並行通訊:指的是同一時刻可以收或發多個bit位的資訊,因此需要多根訊號線才行。
-序列傳輸:資料按位順序傳輸。 -並行傳輸:資料各個位同時傳輸。
-優點:佔用引腳資源少 -優點:速度快
-缺點:速度相對較慢 -缺點:佔用引腳資源多
單工、半雙工、全雙工:
單工:要麼收,要麼發,只能做接收裝置或者傳送裝置。比如收音機
半雙工:可以收,可以發,但是不能同時收發, 比如對講機
全雙工:可以在同一時刻既接收,又傳送。 手機
常見通訊總結:
USART基本概念:
通用同步非同步收發器(USART)靈活地與外部裝置進行全雙工資料通訊,滿足外部裝置對工業標準NRZ非同步序列資料格式的要求。USART通過小數波特率發生器提供了多種波特率。它支援同步單向通訊和半雙工單線通訊;還支援LIN(局域網際網路絡),智慧卡協議與IrDA(紅外資料協會)SIR ENDEC規範,以及調製解調操作(CTS/RTS)。而且,它還支援多處理器通訊。
USART支援同步模式,因此USART 需要同步始終訊號USART_CK(如STM32 微控制器),通常情況同步訊號很少使用,因此USART和一般微控制器UART使用方式是一樣的,都使用非同步模式。
串列埠電路連線:
STM32f051串列埠:STM32F051內建多達兩個通用同步 / 非同步收發器( USART1 和 USART2 ),通訊速度可達 6 Mbit / s
串列埠通訊協議介紹:
波特率:
在序列通訊中,用“波特率”來描述資料的傳輸速率。所謂波特率,既每秒傳送的二進位制位數,其單位為bps(bits per second)。它是衡量序列資料速度快慢的重要指標。
國際上規定一個標準的波特率系列: 110、300、600、1200、1800、2400、4800、9600、115200、14.4Kbps、19.2Kbps、……
例如:115200bps、指每秒傳送115200位。通訊雙方必須設定同樣的同學速率才能正常通訊
注意:實際的資料沒這麼多,還包括起始位,結束位,校驗位
STM32 USART暫存器介紹
內容概要:
控制暫存器——USART_CR
狀態暫存器——USART_SR
資料暫存器——USART_DR
波特率暫存器——USART_BRR
串列埠暫存器-USART_CR1:
串列埠暫存器-USART_CR2:
串列埠暫存器-USART_BRR:
串列埠暫存器-USART_ISR:
串列埠資料的傳送和接收:
串列埠暫存器-USART_TDR:
串列埠暫存器-USART_RDR:
STM32實現串列埠資料的收發
內容概要:
串列埠硬體原理圖
CubeMX中串列埠的配置
串列埠傳送一個字元
串列埠接收一個字元
串列埠硬體原理圖:
注意:如果無法識別串列埠,清裝好ch340串列埠驅動
CubeMX中串列埠的配置:
串列埠資料的傳送和接收:
串列埠傳送一個字元:
void Uart_Putchar(uint8_t ch)
{
while(!(USART1->ISR &(1<<7))); //等待發送暫存器空
USART1->TDR = ch; //傳送字元
}
void Uart_Putstring(uint8_t *str)
{
while(*str != '\0')
{
Uart_Putchar(*str);
str++;
}
}
串列埠接收一個字元:
uint8_t Uart_Getchar(void)
{
while(!(USART1->ISR & (1<<5))); //等待收到一個字元的資料
return USART1->RDR; //返回收到的字元
}
HAL串列埠庫函式的使用及printf的實現
HAL庫中串列埠的收發函式:
Stm32f0xx_hal_uart.c 檔案中
串列埠的傳送函式
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
串列埠的接收函式
HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
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;
}