软件主要是初始化串口,和驱动OLED.
#include "gps.h"
#include "usart.h"
#include <string.h>
u16 USART3_RX_STA=0; //接收状态标记
u8 USART3_RX_BUF[USART3_REC_LEN]; //接收缓冲,最大200个字节.
SaveData GPS_Frame;
u8 GPS_Data_len;
// 私有函数声明
static void GPIO_Configuration(void);
static void USART3_Configuration(void);
void GPS_Init(void)
{
GPIO_Configuration();
USART3_Configuration();
}
//**************************************************************************
// 初始化串口3的引脚 TX:PB10 RX:PB11
static void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
// 配置USART3引脚: PB10(TX), PB11(RX)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//**************************************************************************
// 初始化串口3
static void USART3_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// 使能USART3时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
// USART3配置
USART_InitStructure.USART_BaudRate = 9600;
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(GPS_USART, &USART_InitStructure);
// 使能USART3接收中断
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); // 新增:使能接收中断
USART_Cmd(GPS_USART, ENABLE);
// 配置USART3中断
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//**************************************************************************
//串口3接收中断函数
void USART3_IRQHandler(void) //串口3中断服务程序
{
u8 Res;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收中断标志(接收到的数据必须是0x0d 0x0a结尾)
{
Res = USART_ReceiveData(USART3); //读取接收到的数据
if(Res == '$') // 判断是否GPS数据的标志字符
{
GPS_Data_len = 0;
}
USART3_RX_BUF[GPS_Data_len++] = Res;
// 判断这条GPS数据是否自己需要的$GPRMC(最小定位信息)数据类型
if(USART3_RX_BUF[0]=='$' && USART3_RX_BUF[4]=='M' && USART3_RX_BUF[5]=='C' )
{
if(Res == '\n')
{
memset(GPS_Frame.GPS_Buffer, 0, GPS_Buffer_Length); // 清空GPS_Frame.GPS_Buffer
memcpy(GPS_Frame.GPS_Buffer, USART3_RX_BUF, GPS_Data_len); // 复制数据到GPS_Frame.GPS_Buffer
GPS_Frame.isGetData = 1; // 是否获取到GPS数据
GPS_Data_len = 0; // 长度清零准备下次接收数据
memset(USART3_RX_BUF, 0, USART3_REC_LEN); // USART3_RX_BUF清空准备下次接收数据
USART3_RX_STA=1; // 接收到有效数据标志,再主循环中调用
}
}
if(GPS_Data_len >= USART3_REC_LEN) //防止接收数据越界
GPS_Data_len = USART3_REC_LEN;
}
}
//**************************************************************************
// 解析GPS数据
void parseGpsData(void)
{
char *subString;
char *subStringNext;
char i, j;
if(GPS_Frame.isGetData)
{
for(i=0; i<6; i++)
{
if(i==0)
{
subString = strstr(GPS_Frame.GPS_Buffer, ",");
}
else
{
subString++;
subStringNext = strstr(subString, ",");
j = subStringNext - subString;
switch (i)
{
case 1: // 获取UTC时间
memcpy(GPS_Frame.UTCTime, subString, j);
// GPS_Frame.isUsefull[j] = '\0';
break;
case 2: // 定位信息是否有效
memcpy(GPS_Frame.isUsefull, subString, j);
GPS_Frame.isUsefull[j] = '\0';
break;
case 3: // 纬度
memcpy(GPS_Frame.latitude, subString, j);
GPS_Frame.latitude[j] = '\0';
break;
case 4: // 纬度半球
memcpy(GPS_Frame.N_S, subString, j);
GPS_Frame.N_S[j] = '\0';
break;
case 5: // 经度
memcpy(GPS_Frame.longitude, subString, j);
GPS_Frame.longitude[j] = '\0';
break;
case 6: // 经度半球
memcpy(GPS_Frame.E_W, subString, j);
GPS_Frame.E_W[j] = '\0';
break;
default:
printf("解析出错!");
break;
}
}
}
GPS_Frame.isGetData = 0;
}
}
#include "sys.h"
#include "oled.h"
#include "delay.h"
#include "usart.h"
#include "gps.h"
extern u16 USART3_RX_STA; //接收状态标记
extern char USART3_RX_BUF[USART3_REC_LEN]; //接收缓冲,最大200个字节.
int main(void)
{
u8 len, str[20] = "Hello";
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断分组
uart_init(9600); // 初始化串口1,波特率115200
delay_init(); // 延时函数初始化
OLED_Init(); // OLED 初始化
OLED_clear(); // 清屏
DS3231_Init(); // 时钟模块初始化
GPS_Init(); // GPS 初始化
str_8x16(32, 0, "GPS Info");
while (1)
{
parseGpsData();
if(USART3_RX_STA)
{
str[0] = GPS_Frame.UTCTime[0];
str[1] = GPS_Frame.UTCTime[1];
str[2] = ':';
str[3] = GPS_Frame.UTCTime[2];
str[4] = GPS_Frame.UTCTime[3];
str[5] = ':';
str[6] = GPS_Frame.UTCTime[4];
str[7] = GPS_Frame.UTCTime[5];
str[8] = '\0';
str_8x16(0, 2, "TIME: ");
str_8x16(48, 2, str);
str_8x16(0, 4, "Wdu: ");
str_8x16(48, 4, GPS_Frame.latitude);
str_8x16(0, 6, "Gdu: ");
str_8x16(48, 6, GPS_Frame.longitude);
USART3_RX_STA = 0;
}
}
}