关于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;

猜你喜欢

转载自blog.csdn.net/u012166958/article/details/80195329