關於STM32的USART整理的全域性函式 HAL_USART.h介紹 (1)
阿新 • • 發佈:2018-12-07
串列埠的簡單介紹
(1)、物理上的連線至少3根,分別是Tx資料傳送線,Rx資料接收線,GND共用地線。
(2)、0與1的約定。RS232電平,約定﹣5V至﹣25V之間的電壓訊號為1,﹢5V至﹢25V之間的電壓訊號為0 。TTL電平,約定5V的電壓訊號為1,0V電壓訊號為0 。CMOS電平,約定3.3V的電壓訊號為1,0V電壓訊號為0 。其中,CMOS電平一般用於ARM晶片中。(3)、傳送秩序。低位先發。
(4)、波特率。收發雙方共同約定的一個數據位(0或1)在資料傳輸線上維持的時間。也可理解為每秒可以傳輸的位數。常用的波特率有300bit/s, 600bit/s, 2400bit/s, 4800bit/s, 9600bit/s。
(5)、通訊的起始訊號。傳送方在沒有傳送資料時,應該將Tx置1 。 當需傳送時,先將Tx置0,並且保持1位的時間。接受方不斷地偵測Rx,如果發現Rx常時間變高後,突然被拉低(置為0),則視為傳送方將要傳送資料,迅速啟動自己的定時器,從而保證了收發雙方定時器同步定時。
(6)、停止訊號。傳送方傳送完最後一個有效位時,必須再將Tx保持1位的時間,即為停止位。
以 9600bps/8/N/1 為例 1位 為10位元組 1停止位+8資料位+1校驗位
1幀 所需要的時間
1、新建兩個檔案 hal_usart.h 和 hal_usart.c
定義一個結構體變數:
typedef struct { u32 Baud; //波特率 u16 DataBit;//資料位 u16 Parity;//奇偶校驗位 u16 StopBit;//停止位 }USART_ParamType; typedef struct USART_Type { uint8_t recvbuff[256]; //接收快取區 uint8_t sendbuff[256]; //傳送快取區 uint16_t sendHead; //傳送頭長度 uint16_t sendTail; //傳送尾長度 uint16_t ByteTmp; //傳送資料長度標誌 uint16_t recv_size; //接收資料長度 資料處理 uint16_t send_size; //傳送資料長度 資料處理 uint16_t recv_ctr; //寫功能碼指令 記錄長度 uint16_t USART_Timer; uint16_t recv_len; //陣列長度 uint16_t send_len; //陣列長度 uint16_t recvDMALen; //DMA 接收長度 uint16_t sendDMALen; //DMA 傳送長度 uint8_t recv_state; //接收狀態機狀態 uint8_t DMA_IRQ_Flag; //DMA_Rx = 0x01 /DMA_Tx =0x02/IRQ_Rx =0x04/ IRQ_Tx =0x08 bool Rcv_Cmpl; //接收資料完成標記 USART_ParamType ParamInit; void (*Send_485)(void); void (*Receive_485)(void); void(*Protocol_Receive)(USART_TypeDef *USARTx,struct USART_Type*,u8); void(*Protocol_Send)(USART_TypeDef * ,struct USART_Type*); void(*Data_Processing)(USART_TypeDef *,struct USART_Type*); }USARTx_BufferType;