generated from Template/H563ZI-HAL-CMake-Template
新加入gps数据解析,使用GDMA1---CHANNEL3
This commit is contained in:
@@ -1,5 +1,12 @@
|
||||
#include "HCBle.h"
|
||||
|
||||
/**
|
||||
<EFBFBD><EFBFBD>ʾ: <20><>Ȼ BLE <20>Լ<EFBFBD> GPS<50><53><EFBFBD><EFBFBD>DMA+ UART<52><54><EFBFBD>գ<EFBFBD><D5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ
|
||||
BLE --- DMA + IDLE <20>ж<EFBFBD> ѭ<><D1AD> DMA + <20><><EFBFBD><EFBFBD><EFBFBD>жϴ<D0B6><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UART IDLE
|
||||
GPS --- DMA +<2B>̶<EFBFBD><CCB6><EFBFBD><EFBFBD><EFBFBD> + TC<54>ж<EFBFBD> <20><><EFBFBD>ù̶<C3B9><CCB6><EFBFBD><EFBFBD><EFBFBD> DMA DMA<4D><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||
|
||||
**/
|
||||
|
||||
// <20>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
extern UART_HandleTypeDef huart1;
|
||||
extern DMA_HandleTypeDef handle_GPDMA1_Channel5;
|
||||
|
||||
193
fun/gps.c
Normal file
193
fun/gps.c
Normal file
@@ -0,0 +1,193 @@
|
||||
#include "gps.h"
|
||||
|
||||
/**
|
||||
<EFBFBD><EFBFBD>ʾ: <20><>Ȼ BLE <20>Լ<EFBFBD> GPS<50><53><EFBFBD><EFBFBD>DMA+ UART<52><54><EFBFBD>գ<EFBFBD><D5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ
|
||||
BLE --- DMA + IDLE <20>ж<EFBFBD> ѭ<><D1AD> DMA + <20><><EFBFBD><EFBFBD><EFBFBD>жϴ<D0B6><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UART IDLE
|
||||
GPS --- DMA +<2B>̶<EFBFBD><CCB6><EFBFBD><EFBFBD><EFBFBD> + TC<54>ж<EFBFBD> <20><><EFBFBD>ù̶<C3B9><CCB6><EFBFBD><EFBFBD><EFBFBD> DMA DMA<4D><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||
|
||||
**/
|
||||
|
||||
|
||||
//<2F>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD>
|
||||
extern UART_HandleTypeDef huart2;
|
||||
extern DMA_HandleTypeDef handle_GPDMA1_Channel3;
|
||||
|
||||
|
||||
//ȫ<><C8AB><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
uint8_t GPS_DMA_RX_BUF[GPS_DMA_RX_BUF_LEN]; //<2F><><EFBFBD><EFBFBD>DMA<4D><41><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
|
||||
_GPSData GPS;
|
||||
|
||||
// TEST <20>ǽ<EFBFBD><C7BD><EFBFBD><EFBFBD><EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ĵ<EFBFBD><C4B4>룬else֮<65><D6AE><EFBFBD><EFBFBD><EFBFBD>Ǽ<EFBFBD><C7BC>뵽Thread X<><58>ʵ<EFBFBD>ʿ<EFBFBD><CABF>ƴ<EFBFBD><C6B4><EFBFBD>
|
||||
#ifdef TEST
|
||||
|
||||
//void GPS_DMA_Start(void)
|
||||
//{
|
||||
// HAL_UART_Receive_DMA(&huart2,GPS_DMA_RX_BUF,GPS_DMA_RX_BUF_LEN);
|
||||
// __HAL_DMA_ENABLE_IT(huart2.hdmarx,DMA_IT_HT); //<2F>봫<EFBFBD><EBB4AB><EFBFBD>ж<EFBFBD>
|
||||
// __HAL_DMA_ENABLE_IT(huart2.hdmarx,DMA_IT_TC); //ȫ<><C8AB><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||
//}
|
||||
|
||||
void GPS_Init(void)
|
||||
{
|
||||
HAL_UARTEx_ReceiveToIdle_DMA(&huart2, GPS_DMA_RX_BUF, GPS_DMA_RX_BUF_LEN);
|
||||
__HAL_DMA_DISABLE_IT(&handle_GPDMA1_Channel3, DMA_IT_HT); // <20><><EFBFBD>ð봫<C3B0><EBB4AB>
|
||||
}
|
||||
|
||||
|
||||
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
|
||||
{
|
||||
if(huart->Instance == USART2)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> Size <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
memcpy(GPS.GPS_Buffer,GPS_DMA_RX_BUF,Size);
|
||||
GPS.GPS_Buffer[Size] = '\0';
|
||||
GPS.isGetData = 1; //<2F><><EFBFBD>ݽ<EFBFBD><DDBD>ձ<EFBFBD>־λ<D6BE><CEBB>Ϊ1
|
||||
|
||||
//<2F><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
HAL_UARTEx_ReceiveToIdle_DMA(&huart2,GPS_DMA_RX_BUF,GPS_DMA_RX_BUF_LEN);
|
||||
__HAL_DMA_DISABLE_IT(&handle_GPDMA1_Channel3,DMA_IT_HT);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void GPS_Data_CLR(void)
|
||||
{
|
||||
memset(GPS_DMA_RX_BUF,0,GPS_DMA_RX_BUF_LEN);
|
||||
|
||||
}
|
||||
|
||||
|
||||
#ifdef parse
|
||||
// GPS<50><53><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>
|
||||
void parseGpsBuffer()
|
||||
{
|
||||
char *subString;
|
||||
char *subStringNext;
|
||||
char i = 0;
|
||||
|
||||
if(GPS.isGetData)
|
||||
{
|
||||
GPS.isGetData = 0; // <20>ѱ<EFBFBD>־λ<D6BE><CEBB>Ϊ1
|
||||
|
||||
char usefullBuffer[2] = {0};
|
||||
for(i = 0; i <= 6; i++)
|
||||
{
|
||||
if(i == 0)
|
||||
{
|
||||
|
||||
subString = strstr(GPS.GPS_Buffer,",");
|
||||
if(!subString)return;
|
||||
}
|
||||
else
|
||||
{
|
||||
subString++;
|
||||
subStringNext = strstr(subString,",");
|
||||
if(!subStringNext)return;
|
||||
|
||||
switch(i)
|
||||
{
|
||||
case 1:
|
||||
memcpy(GPS.UTCTime,subString,subStringNext - subString);
|
||||
break;
|
||||
case 2:
|
||||
memcpy(usefullBuffer,subString,subStringNext - subString);
|
||||
break;
|
||||
case 3:
|
||||
memcpy(GPS.latitude,subString,subStringNext - subString);
|
||||
break;
|
||||
case 4:
|
||||
memcpy(GPS.N_S,subString,subStringNext - subString);
|
||||
break;
|
||||
case 5:
|
||||
memcpy(GPS.longitude,subString,subStringNext - subString);
|
||||
break;
|
||||
case 6:
|
||||
memcpy(GPS.E_W,subString,subStringNext - subString);
|
||||
break;
|
||||
default:break;
|
||||
}
|
||||
|
||||
subString = subStringNext;
|
||||
}
|
||||
|
||||
}
|
||||
GPS.isParseData = 1;
|
||||
GPS.isUsefull = (usefullBuffer[0] == 'A') ? 1 : 0;
|
||||
}
|
||||
|
||||
}
|
||||
#else // <20><><EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6>ڸĽ<DAB8><C4BD><EFBFBD><EFBFBD><EFBFBD>parse <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>в<EFBFBD><D0B2><EFBFBD>
|
||||
void parseGpsBuffer()
|
||||
{
|
||||
char *fields[7];
|
||||
char *token;
|
||||
int fieldIndex = 0;
|
||||
|
||||
if (GPS.isGetData)
|
||||
{
|
||||
GPS.isGetData = 0; // <20>ѱ<EFBFBD>־λ<D6BE><CEBB>Ϊ0
|
||||
|
||||
token = strtok(GPS.GPS_Buffer, ",");
|
||||
while (token != NULL && fieldIndex < 7)
|
||||
{
|
||||
fields[fieldIndex++] = token;
|
||||
token = strtok(NULL, ",");
|
||||
}
|
||||
|
||||
if (fieldIndex == 7)
|
||||
{
|
||||
memcpy(GPS.UTCTime, fields[1], sizeof(GPS.UTCTime) - 1);
|
||||
GPS.UTCTime[sizeof(GPS.UTCTime) - 1] = '\0';
|
||||
|
||||
memcpy(GPS.latitude, fields[3], sizeof(GPS.latitude) - 1);
|
||||
GPS.latitude[sizeof(GPS.latitude) - 1] = '\0';
|
||||
|
||||
memcpy(GPS.N_S, fields[4], sizeof(GPS.N_S) - 1);
|
||||
GPS.N_S[sizeof(GPS.N_S) - 1] = '\0';
|
||||
|
||||
memcpy(GPS.longitude, fields[5], sizeof(GPS.longitude) - 1);
|
||||
GPS.longitude[sizeof(GPS.longitude) - 1] = '\0';
|
||||
|
||||
memcpy(GPS.E_W, fields[6], sizeof(GPS.E_W) - 1);
|
||||
GPS.E_W[sizeof(GPS.E_W) - 1] = '\0';
|
||||
|
||||
GPS.isParseData = 1;
|
||||
GPS.isUsefull = (fields[2][0] == 'A') ? 1 : 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
<EFBFBD>Ľ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܽ<EFBFBD>
|
||||
ʹ<EFBFBD><EFBFBD> strtok <20><><EFBFBD>зָ<D0B7><D6B8><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>طָ<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>洢<EFBFBD>ֶΣ<EFBFBD>
|
||||
ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>洢ÿ<EFBFBD><EFBFBD><EFBFBD>ֶε<EFBFBD>ָ<EFBFBD>룬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>롣
|
||||
<EFBFBD>߽<EFBFBD><EFBFBD><EFBFBD><EFBFBD>飺
|
||||
ȷ<EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㹻<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD>硣
|
||||
<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ضϣ<EFBFBD>
|
||||
ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> null <20><>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DZ<EFBFBD>ڵ<EFBFBD><DAB5>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⡣
|
||||
*/
|
||||
#endif
|
||||
|
||||
|
||||
// ת<><D7AA><EFBFBD>Ƕ<EFBFBD>
|
||||
double Convert_to_degrees(char *data)
|
||||
{
|
||||
double temp = atof(data);
|
||||
int deg = (int)(temp / 100);
|
||||
double min = temp - deg * 100;
|
||||
return deg + (min / 60.0);
|
||||
}
|
||||
#else // <20>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Thread X
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
38
fun/gps.h
Normal file
38
fun/gps.h
Normal file
@@ -0,0 +1,38 @@
|
||||
#ifndef __GPS_H
|
||||
#define __GPS_H
|
||||
|
||||
#include "headfile.h"
|
||||
|
||||
#define USART_REC_LEN 200
|
||||
#define EN_USART2_RX 1 //ʹ<>ܽ<EFBFBD><DCBD><EFBFBD> --- 1 <20><>֮ 0
|
||||
|
||||
#define GPS_DMA_RX_BUF_LEN 200 //<2F>ɸ<EFBFBD><C9B8><EFBFBD>NMEA<45><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
#define TEST 1 //<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>,ȥ<><C8A5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ԽӴ<D4BD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>
|
||||
#define parse 1 // <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>gps<70>ṹ<EFBFBD><E1B9B9>
|
||||
#define GPS_Buffer_Length 80
|
||||
#define UTCTime_Length 11
|
||||
#define latitude_Length 11
|
||||
#define N_S_Length 2
|
||||
#define longitude_Length 12
|
||||
#define E_W_Length 2
|
||||
|
||||
typedef struct GPSData
|
||||
{
|
||||
char GPS_Buffer[GPS_Buffer_Length];
|
||||
char isGetData; //<2F>Ƿ<EFBFBD><C7B7><EFBFBD>ȡ<EFBFBD><C8A1>GPS<50><53><EFBFBD><EFBFBD>
|
||||
char isParseData; //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
char UTCTime[UTCTime_Length]; //UTCʱ<43><CAB1>
|
||||
char latitude[latitude_Length]; //γ<><CEB3>
|
||||
char N_S[N_S_Length]; //N/S
|
||||
char longitude[longitude_Length]; //<2F><><EFBFBD><EFBFBD>
|
||||
char E_W[E_W_Length]; //E/W
|
||||
char isUsefull; //<2F><>λ<EFBFBD><CEBB>Ϣ<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
|
||||
} _GPSData;
|
||||
|
||||
extern _GPSData GPS;
|
||||
extern uint8_t GPS_DMA_RX_BUF[GPS_DMA_RX_BUF_LEN];
|
||||
|
||||
#endif
|
||||
@@ -13,5 +13,6 @@
|
||||
#include "string.h"
|
||||
|
||||
#include "HCBle.h"
|
||||
#include "gps.h"
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user