1、串口介紹
1.1、 數據通信概念
在單片機中我們常用的通信方式有 USART、IIC、SPI、CAN、USB 等;
1、數據通信方式
根據數據通信方式可分為串行通信和并行通信兩種,如下圖:
串行通信基本特征是數據逐位順序依次傳輸,優點:傳輸線少成本低,抗干擾能力強可用于遠距離傳輸,缺點傳輸速率低
并行通信特征是數據各位可通過多條線同時傳輸,優點傳輸速率高,缺點是成本高,抗干擾能力差;
2、數據傳輸方向
按照數據傳輸方向可分為全雙工、半雙工和單工通信,如下圖所示:
3、數據同步方式
根據數據同步方式可分為同步通信和異步通信,如下圖所示:
同步通信要求通信雙方共用同一時鐘信號,在總線上保持統一的時序和周期完成信息傳輸。
異步通信不需要時鐘信號,而是在數據信號中加入開始位和停止位等一些同步信號,一般通信雙方還會約定傳輸速率。
4、通信速率
在數字通信系統中,通信速率(傳輸速率)指數據在信道中傳輸的速度,分為兩種:傳信率和傳碼率
傳信率:每秒鐘傳輸的信息量,即每秒鐘傳輸的二進制位數,單位為 bit/s(即比特每秒),因而又稱為比特率
傳碼率:每秒鐘傳輸的碼元個數,單位為 Baud(即波特每秒),因而又稱為波特率;
碼元是信號被調制后的概念,每個碼元可以表示一定 bit 的數據信息量。例如子啊 TTL 電平標準的通信中,0V 表示邏輯 0
5V 表示邏輯 1,這時碼元就只可以表示兩種狀態。若在其它通信標準電平中電平信號 0V、2V、4V 和 6V 分別表示二進制
00、01、10、11,這時候碼元就可以表示四種狀態。
比特率和波特率的關系可以用以下關系式表示:
比特率 = 波特率 * log2 M
M 表示碼元承載的信息量,可以理解 M 為碼元的進制數
1.2、串口通信協議簡介
串口按位(bit)發送和接收字節。串口通信協議是指規定了數據包的內容,內容包含了起始位、數據區、校驗位及停止位,
在串口通信中,常用的協議包括 RS-232、RS-422 和 RS-482 等;如下圖所示:
1、波特率
UART 是串口異步通信,不需要時鐘信號,只需約定好兩個設備之間的波特率,常見的波特率是 4800、9600、115200 等;
2、數據幀格式
串口通信的數據幀包括起始位、停止位、有效數據位以及校驗位;
起始位:一般由一個邏輯 0 的數據位表示
有效數據位:起始位之后就是數據位,有效數據位一般會被約定為 5、6、7 或者 8 個位長,一般是低位(LSB)在前高位(MSB) 在后
校驗位:一般用來判斷接受的數據有無錯誤,校驗方法有:奇校驗、偶校驗、0 校驗、1 校驗及無校驗;
奇校驗:指有效數據的和與校驗位中"1"的個數為奇數,如一個 8 位長有效數據為 11001100,共 4 個"1",為達到奇校驗效果
校驗位則為"1";
偶校驗:與上述奇校驗要求相反,要求幀數據與校驗位中"1"的個數為偶數;如數據幀為 11001100,則此時偶校驗位為"0"
0 校驗:指不管數據幀的內容,校驗位總為"0"
1 校驗:即校驗位總為"1"
無校驗:指數據幀中不包含校驗位,一般不使用
停止位:一般通信雙方需約定 0.5、1、1.5 或 2 個邏輯 1 的數據位表示;
1.3、STM32H5 串口外設介紹
STM32H562 的最多可提供 6 路串口(5 路普通串口和 1 路低功耗串口),支持 8/16 倍過采樣、支持自動波特率檢測、支持 Modbus
通信、支持同步單線通信和半雙工單線通訊、支持 LIN、支持調制解調操作、智能卡協議和 IrDA SIR ENDEC 規范、具有 DMA 功能;
USART 框圖如下所示:
1、時鐘與波特率
該部分主要功能是為 USART 提供時鐘以及配置波特率;
如上圖,我們可以看到兩個時鐘域,usart_pclk 時鐘域及 usart_ker_ck 內核時鐘域。
usart_pclk 是外設總線時鐘;
usart_ker_ck 是 USART 時鐘源,獨立于 usart_pclk,由 RCC 提供;
波特率,即每秒鐘傳輸的碼元個數,波特率計算公式分為 16 倍過采樣和 8 倍過采樣;
16 倍過采樣下,波特率計算公式如下:
baud = usart_ker_ckpres/USARTDIV
8 倍過采樣下,波特率計算公式如下:
baud = (2*usart_ker_ckpres)/USARTDIV
2、收發數據
USART 雙向通信有兩個引腳 TX/RX;
USART_TDR 是 USART 發送數據寄存器,USART_RDTR 是 USART 接收數據寄存器,這兩個寄存器都是低 9 位有效;
可通過 USART_CR1 寄存器的 M 位設置字長:
7 位字符長度:M[1:0] = “10”
8 位字符長度:M[1:0] = “00”
9 位字符長度:M[1:0] = “01”
基本都是使用 8 位數據字長;
3、控制寄存器
可以通過控制寄存器控制 USART 數據的發送、數據接收、各種通信模式的設置、中斷、DMA 模式及喚醒單元等;
4、DMA 和中斷功能
USART 支持 DMA 傳輸,可實現高速數據傳輸;
5、USART 信號引腳
在 RS232 硬件流控制模式下需要以下兩個引腳:
CTS(清除以發送):發送器在發送下一幀數據之前會檢測 CTS 引腳,若為低電平,表示可發送數據;若為高電平則在發送完當前數據之后停止發送
RTS(請求以發送):若為低電平,則該信號用于指示 USART 已準備好接收數據。
在 RS485 硬件控制模式下需要下面該引腳:
DE(驅動器使能):該信號用于激活外部收發器的發送模式。
在同步主/從模式和智能卡模式下需要以下引腳:
CK:該引腳在同步主模式和智能卡模式下用作時鐘輸出,在同步從模式下用作時鐘輸入。
NSS:該引腳在同步從模式下用作從器件選擇輸入。
2、代碼詳解
代碼如下:
UART_HandleTypeDef UART1_Handler;
DMA_HandleTypeDef UART1TxDMA_Handler;
DMA_HandleTypeDef UART1RxDMA_Handler;//發送接收緩沖區
uint8_t rx_buffer[512];
uint8_t tx_buffer[256];volatile uint8_t rxComplete = 0;
volatile uint16_t rxlen = 0;
volatile uint8_t dma_tx_busy = 0;void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{GPIO_InitTypeDef GPIO_Initure;if(huart->Instance == USART1){__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_Initure.Pin = GPIO_PIN_9 | GPIO_PIN_10;GPIO_Initure.Mode = GPIO_MODE_AF_PP;GPIO_Initure.Pull = GPIO_NOPULL;GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;GPIO_Initure.Alternate = GPIO_AF7_USART1;HAL_GPIO_Init(GPIOA,