1. 程式人生 > >關於STM32的USART整理的全域性函式 HAL_USART.h介紹 (1)

關於STM32的USART整理的全域性函式 HAL_USART.h介紹 (1)

串列埠的簡單介紹

(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幀 所需要的時間
T = 1s * 10bit / bps = 1000 * 10 /9600 (ms) = 1.0417 ms

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;