/*************************** (C) COPYRIGHT 2014 GLHF ****************************
 * 文件名  ：usart3.c
 * 描  述  ：串口3驱动代码(GPRS控制)    
 * 版  本  ：V1.0
 * 作  者  ：XuZhongPing
 * 日  期  ：2013/11/21 
*********************************************************************************/
#include "stm32f10x.h"
#include "delay.h"
#include "usart3.h"
#include "stdarg.h"	 	 
#include "stdio.h"	 	 
#include "string.h"		   
#include "gsm_uart.h"
#include "gsm_uart_conf.h"   

static void UART3_DMA_Config(void);

/*
***********************************************************************
*	函 数 名: USART3_Init
*	功能说明: 串口3初始化
*	形    参: 无
*	返 回 值: 无
***********************************************************************
*/
void USART3_Init(u32 bound)
{
	//GPIO端口设置
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	//开启所使用的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//使能GPIOB时钟
 	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);		//使能USART3时钟
	
	USART_DeInit(USART3);  																	//复位串口3
	
	//USART3_TX   PB.10
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 							
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;					//复用推挽输出
	GPIO_Init(GPIOB, &GPIO_InitStructure); 									//初始化PB10
   
	//USART3_RX	  PB.11
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;		//浮空输入
	GPIO_Init(GPIOB, &GPIO_InitStructure);  								//初始化PB11


	//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(USART3, &USART_InitStructure); 								//初始化串口
	
	UART3_DMA_Config();																				//DMA1通道2,外设为串口3,存储器为USART3_TX_BUF 

	//Usart3 NVIC 配置
	NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;	//抢占优先级0
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;				//子优先级1
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;						//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);														//根据指定的参数初始化VIC寄存器
   
	USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);						//开启中断

	USART_Cmd(USART3, ENABLE);                    						//使能串口 
	GPRS_RX_STA = 0;																					//接收状态清零
	TIM_Cmd(TIM4, DISABLE);  	 																//关闭TIMx
}

/*
***********************************************************************
*	函 数 名: USART3_IRQHandler
*	功能说明: 串口3中断（用于接收GSM_GPRS数据）
*						通过判断接收连续2个字符之间的时间差不大于10ms来决定是不是一次连续的数据.
*						如果2个字符接收间隔超过10ms,则认为不是1次连续数据.也就是超过10ms没有接收到
*						任何数据,则表示此次接收完毕.
*	形    参: 无
*	返 回 值: 影响全局变量GPRS_RX_STA，结果如下:
*						[15]:0,没有接收到数据;1,接收到了一批数据.
*						[14:0]:接收到的数据长度
***********************************************************************
*/
void USART3_IRQHandler(void)
{
	uint8_t res;	    
	if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)		//接收到数据
	{	 
		res = USART_ReceiveData(USART3);											//读取接收到的数据
		GSM_GPRS_ReceiveData(res);
	}  											 
} 
		 
///////////////////////////////////////USART3 DMA发送配置部分//////////////////////////////////	   		    
//DMA1的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_CHx:DMA通道CHx
//cpar:外设地址
//cmar:存储器地址   

/*
***********************************************************************
*	函 数 名: UART3_DMA_Config
*	功能说明: GSM串口输出命令
*	形    参: 无
*	返 回 值: 无
***********************************************************************
*/
static void UART3_DMA_Config(void)
{
 	DMA_InitTypeDef DMA_InitStructure;
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);	//使能DMA传输
	
	delay_us(5);
	DMA_DeInit(DMA1_Channel2);   //将DMA的通道2寄存器重设为缺省值
//	DMA1_MEM_LEN=cndtr;
	DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART3->DR;  				//DMA外设ADC基地址
	DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)GPRS_TX_BUF;  						//DMA内存基地址
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  											//数据传输方向，从内存读取发送到外设
//	DMA_InitStructure.DMA_BufferSize = cndtr;  															//DMA通道的DMA缓存的大小
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  				//外设地址寄存器不变
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  									//内存地址寄存器递增
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;		//数据宽度为8位
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; 					//数据宽度为8位
	DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  														//工作在正常缓存模式
	DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; 										//DMA通道 x拥有中优先级 
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  														//DMA通道x没有设置为内存到内存传输
	DMA_Init(DMA1_Channel2, &DMA_InitStructure);  														//根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器		  	

	USART_DMACmd(USART3, USART_DMAReq_Tx, ENABLE); 														//使能串口3的DMA发送
}    

/*
***********************************************************************
*	函 数 名: UART3_Send_One
*	功能说明: 通过DMA向串口3发送一次数据
*	形    参: 无
*	返 回 值: 无
***********************************************************************
*/
void UART3_Send_One(uint16_t len)
{ 
	DMA_Cmd(DMA1_Channel2, DISABLE);  						//关闭USART3 TX DMA1 所指示的通道      
 	DMA_SetCurrDataCounter(DMA1_Channel2, len);		//DMA通道的DMA缓存的大小
 	DMA_Cmd(DMA1_Channel2, ENABLE);  							//使能USART3 TX DMA1 所指示的通道 
}	

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