usart1.c 3.6 KB
#include "usart1.h"
#include "dev.h"
#include "delay.h"
#include "string.h"
#include "timer3.h"

#define	USART1_RX_MAX		40
#define USART1_TX_MAX		40
uint8_t USART1_RX_BUF[USART1_RX_MAX] = {0};					//接收缓存区
uint8_t USART1_TX_BUF[USART1_TX_MAX] = {0};					//发送缓存区

Uart_Type u1;
void usart1_init(uint32_t bound)
{
	GPIO_InitTypeDef 	GPIO_InitStructure;
	USART_InitTypeDef 	USART_InitStructure;
	NVIC_InitTypeDef 	NVIC_InitStructure;

	memset(USART1_RX_BUF,0,USART1_RX_MAX);
	memset(USART1_TX_BUF,0,USART1_TX_MAX);

	u1.rx_buf=USART1_RX_BUF;
	u1.tx_buf=USART1_TX_BUF;
	u1.rx_len=0;
	u1.tx_len=0;
	u1.rx_status = RX_STA_RST;
	u1.rxtimer	=	&timer3;
	
	timer3_init(usart1_rx_finished);
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); 			//使能GPIOA时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);			//使能USART1时钟
 
	GPIO_PinAFConfig(DBG_RXD_Port,GPIO_PinSource9,GPIO_AF_USART1); 	//GPIOA9复用为USART1
	GPIO_PinAFConfig(DBG_TXD_Port,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1

	GPIO_InitStructure.GPIO_Pin 	= DBG_RXD_Pin | DBG_TXD_Pin; 	//GPIOA9与GPIOA10
	GPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_AF;					//复用功能
	GPIO_InitStructure.GPIO_Speed 	= GPIO_Speed_50MHz;				//速度50MHz
	GPIO_InitStructure.GPIO_OType 	= GPIO_OType_PP; 				//推挽复用输出
	GPIO_InitStructure.GPIO_PuPd 	= GPIO_PuPd_UP; 				//上拉
	GPIO_Init(DBG_RXD_Port,&GPIO_InitStructure); 					//初始化
	
	USART_InitStructure.USART_BaudRate 		= U1_BAUDRETE;				//波特率设置
	USART_InitStructure.USART_WordLength	= USART_WordLength_8b;	//字长为8位数据格式
	USART_InitStructure.USART_StopBits 		= USART_StopBits_1;		//一个停止位
	USART_InitStructure.USART_Parity 		= USART_Parity_No;		//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode 			= USART_Mode_Rx | USART_Mode_Tx;	//收发模式
	USART_Init(USART1, &USART_InitStructure); 						//初始化串口1
	
	USART_Cmd(USART1, ENABLE);  									//使能串口1 
	
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);					//开启相关中断

	NVIC_InitStructure.NVIC_IRQChannel 					= USART1_IRQn;	//串口1中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 3;		//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority 		= 0;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd 				= ENABLE;	//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);									//初始化VIC寄存器	
}

void usart1_send_byte(uint8_t one_byte)
{

	while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
	USART_SendData(USART1,one_byte);                      //向串口3发送数据

}
void usart1_send_bytes(uint8_t* buf,uint16_t length)
{
	for(uint16_t i=0;i<length;i++) 
	{
		usart1_send_byte(buf[i]);
	}
}
void usart1_rx_reset(void)
{
	u1.rx_len=0;
	memset(u1.rx_buf,0,USART1_RX_MAX);//接收缓存区清零
	u1.rx_status = RX_STA_RST;
}
void usart1_rx_receiving(void)
{
		u1.rxtimer->timeclear();
		u1.rxtimer->start();
		u1.rx_status = RX_RECEIVING;
}
void usart1_rx_finished(void)
{
	u1.rxtimer->stop();
	u1.rx_status=RX_FINISHED;
}
void USART1_IRQHandler(void)//串口2中断服务程序
{
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收中断
	{
		uint8_t res;
		res = USART_ReceiveData(USART1);//读取接收到的数据
		switch(u1.rx_status)
		{
			case RX_STA_RST:
			{
				u1.rx_len	=	0;
				u1.rx_buf[u1.rx_len++] = res;//记录接收到的值
				usart1_rx_receiving();
			} break;
			case RX_RECEIVING:
			{
				u1.rx_buf[u1.rx_len++] = res;//记录接收到的值
				if(u1.rx_len==USART1_RX_MAX)
				{
						usart1_rx_finished();		
				}
				else
				{
					usart1_rx_receiving();	
				}					
			} break;
			case RX_FINISHED:
			{		
			} break;
			default: break;
		}
	}
	else
	{

	}
}