139 lines
4.5 KiB
C
139 lines
4.5 KiB
C
/*
|
||
*********************************************************************************
|
||
头文件
|
||
*********************************************************************************
|
||
*/
|
||
#include "usart3.h"
|
||
|
||
/*
|
||
************************************************************************************
|
||
变量定义
|
||
************************************************************************************
|
||
*/
|
||
u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //接收缓冲,最大USART3_MAX_RECV_LEN个字节.
|
||
u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //发送缓冲,最大USART3_MAX_SEND_LEN字节
|
||
vu16 point1 = 0;
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: USART3_Configuration()
|
||
* 功能说明: 串口3配置
|
||
* 输 入 :波特率baund
|
||
* 输 出 :无
|
||
*********************************************************************************************************
|
||
*/
|
||
void USART3_Configuration(u32 baund)
|
||
{
|
||
USART_InitTypeDef USART_InitStructure;
|
||
GPIO_InitTypeDef GPIO_InitStructure;
|
||
NVIC_InitTypeDef NVIC_InitStructure;
|
||
|
||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //使能USART3
|
||
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //GPIOB时钟
|
||
|
||
//NVIC_Configuration();
|
||
|
||
USART_DeInit(USART3); //复位串口1
|
||
|
||
//USART3_TX PB.10 PB.11
|
||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
|
||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
|
||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
|
||
GPIO_Init(GPIOB, &GPIO_InitStructure);
|
||
|
||
|
||
GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3);
|
||
GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_USART3);
|
||
|
||
|
||
USART_InitStructure.USART_BaudRate = baund;
|
||
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
|
||
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);
|
||
|
||
USART_Cmd(USART3,ENABLE);
|
||
|
||
USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//开启USART3的接收中断
|
||
//Usart1 NVIC 配置
|
||
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;//串口3中断通道
|
||
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级3
|
||
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子优先级3
|
||
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
|
||
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、
|
||
|
||
USART_ClearFlag(USART3,USART_FLAG_TC); //清除发送完成标志位
|
||
|
||
}
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: USART3_IRQHandler()
|
||
* 功能说明: 串口3接收中断
|
||
* 输 入 :全局数组USART1_SDI_RX_BUF[]
|
||
* 输 出 :无
|
||
*********************************************************************************************************
|
||
*/
|
||
void USART3_IRQHandler(void)
|
||
{
|
||
u8 Res;
|
||
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
|
||
{
|
||
Res =USART_ReceiveData(USART3);//(USART1->DR); //读取接收到的数据
|
||
|
||
if(Res == 0x24)
|
||
{
|
||
point1 = 0;
|
||
}
|
||
|
||
|
||
USART3_RX_BUF[point1++] = Res;
|
||
|
||
if(USART3_RX_BUF[0] == '$' && USART3_RX_BUF[4] == 'M' && USART3_RX_BUF[5] == 'C') //确定是否收到"GPRMC/GNRMC"这一帧数据
|
||
{
|
||
if(Res == '\n')
|
||
{
|
||
memset(Save_Data.GPS_Buffer, 0, GPS_Buffer_Length); //清空
|
||
memcpy(Save_Data.GPS_Buffer, USART3_RX_BUF, point1); //保存数据
|
||
Save_Data.isGetData = true;
|
||
point1 = 0;
|
||
memset(USART3_RX_BUF, 0, USART3_MAX_RECV_LEN); //清空
|
||
}
|
||
|
||
}
|
||
if(point1 >= (USART3_MAX_RECV_LEN-1))
|
||
{
|
||
point1 = 0;
|
||
}
|
||
}
|
||
}
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: u3_printf()
|
||
* 功能说明: 串口3输出
|
||
* 输 入 :
|
||
* 输 出 :
|
||
*********************************************************************************************************
|
||
*/
|
||
void u3_printf(char* fmt,...)
|
||
{
|
||
u16 i,j;
|
||
va_list ap;
|
||
va_start(ap,fmt);
|
||
vsprintf((char*)USART3_TX_BUF,fmt,ap);
|
||
va_end(ap);
|
||
i=strlen((const char*)USART3_TX_BUF); //此次发送数据的长度
|
||
for(j=0;j<i;j++) //循环发送数据
|
||
{
|
||
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕
|
||
USART_SendData(USART3,USART3_TX_BUF[j]);
|
||
}
|
||
}
|
||
|
||
/***************************** END OF FILE *********************************/
|