1. 程式人生 > >物聯網之STM32開發三(USART串列埠)

物聯網之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;
}