/*************************** (C) COPYRIGHT 2017 CXHY ****************************
 * 文件名  ：usart.c
 * 描  述  ：串口1驱动程序    
 * 版  本  ：V1.0
 * 作  者  ：XuZhongPing
 * 日  期  ：2017/03/06 
*********************************************************************************/
#include "usart1.h"	  

uint8_t USART1_RX_BUF[USART1_RECV_LEN];     	//接收缓冲,最大USART_REC_LEN个字节.
uint16_t USART1_RX_STA = 0;       					//接收状态标记	

/*
***********************************************************************
*	函 数 名: USART1_Init
*	功能说明: 串口1初始化
*	形    参：无
*	返 回 值: 无
***********************************************************************
*/
void USART1_Init(uint32_t bound)
{
	//GPIO端口设置
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1，GPIOA时钟
 	USART_DeInit(USART1);  //复位串口1
	
	//USART1_TX   PA.9
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 				
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;			//复用推挽输出
	GPIO_Init(GPIOA, &GPIO_InitStructure); 							
   
	//USART1_RX	  PA.10
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;		//浮空输入
	GPIO_Init(GPIOA, &GPIO_InitStructure); 

  //USART 初始化设置
	USART_InitStructure.USART_BaudRate = bound;												//设置波特率
	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); 												//初始化串口

	//Usart1 NVIC 配置
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1 ;		//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;						//子优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);		
  
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);								//开启中断
	USART_Cmd(USART1, ENABLE);     
	USART1_RX_STA = 0;	
}

/*
***********************************************************************
*	函 数 名: USART1_IRQHandler
*	功能说明: 串口中断服务程序
*	形    参：无
*	返 回 值: 无
***********************************************************************
*/
void USART1_IRQHandler(void)
{
	uint8_t res = 0;
	
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  	//接收中断(接收到的数据必须是0x0d 0x0a结尾)
	{
		res = USART_ReceiveData(USART1);											//读取接收到的数据
		if(USART1_RX_STA < USART1_RECV_LEN)										//还可以接收数据
		{
			TIM_SetCounter(TIM5, 0);         										//计数器清空
			if(USART1_RX_STA == 0)
			{
				TIM_Cmd(TIM5, ENABLE);   													//使能定时器5的中断
			}							
			USART1_RX_BUF[USART1_RX_STA++] = res;									//记录接收到的值	 			
		}else{
			USART1_RX_STA |= 1<<15;															//强制标记接收完成
		}
	}	
} 

/*
***********************************************************************
*	函 数 名: USART1_SendByteData
*	功能说明: 发送一字节数据
*	形    参: 无
*	返 回 值: 无
***********************************************************************
*/
void USART1_SendByteData(uint8_t bData)
{ 
	USART_SendData(USART1, bData);
	while(USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);		//等待发送结束
}	

/*
***********************************************************************
*	函 数 名: USART1_SendFrameData
*	功能说明: 发送一帧数据
*	形    参: pData -> 数据的首地址；len -> 数据的长度
*	返 回 值: 无
***********************************************************************
*/
void USART1_SendFrameData(uint8_t pDataBuf[], uint16_t len)
{
	uint16_t i = 0;
	
	USART_ClearFlag(USART1, USART_FLAG_TC);
	for(i = 0; i < len; i++)
	{
		USART1_SendByteData(pDataBuf[i]);
	}
}

/******************** (C) COPYRIGHT 2017 ping *****END OF FILE*******************/
