2599|2

7

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

GPS开发全纪录 [复制链接]

现在手上有一块Arduino平台的GPS模块,芯片是EB-365,为了减少开发难度,采用了CooCox官方推出的一套针对M3和M0的固件库,该固件库具有使用简单,顶层设计接口简单、一致,在M3和M0内核的芯片之间移植,只需要更改部分管脚编号和时钟频率大小,移植性非常好。详细可见CooCox官网的说明http://www.coocox.org/COX.html

此次主控板采用CooCox推出的Cookiehttp://www.coocox.org/Cookie.html,该主控板完全兼容arduino接口,同时还扩展和丰富了其功能。
GPS芯片是EB-365,该芯片完全兼容U-Blox
GGA:时间、位置、定位类型
GLLUTC时间、经度、纬度
GSAGPS接收机操作模式、定位使用的卫星、DOP
GSV:可见GPS卫星信息、仰角、方位角、信噪比(SNR
RMC:时间、日期、位置、速度
注意:输出的信息、频率与设置有关

同时注意北京时间比UTC时间快8小时,因此在处理时间时应特别注意时间变换和闰平年的问题。

先将UART这部分程序贴出来,剩下的还在开发。会陆续贴出来的。
串口1采用9600,8,1,0,中断接收,因为GPS每一帧数据最大只有60至70之间,故我们定义了一个全局数组rev_buf[80]用来接收GPS的信息,详细程序如下:
//*****************************************************************************
//
//! \brief UART1 Interrupt Receive Service.
//!
//! \param None.
//!
//! \return None.
//
//*****************************************************************************
unsigned char num = 0;
//
//! You need to define these variables in the main.c and initialize to 0.
//
extern char rev_buf[80];        //Receive Buffer
extern unsigned char rev_start, //Receiving start flag
                     rev_stop,  //Receiving end flag
                     gps_flag;  //GPS Processed flag
unsigned long
uart1CallbackFunc(void *pvCBData, unsigned long ulEvent,  
                   unsigned long ulMsgParam, void *pvMsgData)      
{
    unsigned char ch;  
    ch = UARTCharGet(sUART_BASE);
    if ((ch == '$') && (gps_flag == 0))
    {
        rev_start = 1;
        rev_stop  = 0;   
    }
    if (rev_start == 1)
    {
        rev_buf[num++] = ch;  
        if (ch == '\n')      
        {
            rev_buf[num] = '\0';
            rev_start = 0;
            rev_stop  = 1;   
            gps_flag = 1;
            num = 0;
        }
    }
    return 0;
}
//*****************************************************************************
//
//! \brief UART1 Initialize.
//!
//! \param ulBaudrate is the baud rate of UART1.
//!
//! \return None.
//
//*****************************************************************************
void
UART1_Init(unsigned long ulBaudrate) //9600
{
    xSysCtlPeripheralReset(xSYSCTL_PERIPH_UART1);
    xSysCtlPeripheralEnable(xSYSCTL_PERIPH_UART1);
    xSysCtlPeripheralClockSourceSet(xSYSCTL_UART0_MAIN, 1);
    xSysCtlPeripheralEnable(xGPIOSPinToPeripheralId(sD0));
    sPinTypeUART(sUART_BASE);

    xUARTConfigSet(sUART_BASE, ulBaudrate, (UART_CONFIG_WLEN_8   |
                                            UART_CONFIG_STOP_ONE |
                                            UART_CONFIG_PAR_NONE));
    xUARTIntEnable(sUART_BASE, xUART_INT_RX);
    UARTIntCallbackInit(sUART_BASE, uart1CallbackFunc);
    xUARTEnable(sUART_BASE, (UART_BLOCK_UART | UART_BLOCK_TX | UART_BLOCK_RX));
    xIntEnable(xINT_UART1);
}

//*****************************************************************************
//
//! \brief GPS Initialize.
//!
//! \param ulBaudrate is the baud rate of GPS.
//!
//! \return None.
//
//*****************************************************************************
void
GPS_Init(unsigned long ulBaudrate)
{
    UART1_Init(ulBaudrate);
}
此帖出自信息发布论坛

最新回复

  详情 回复 发表于 2013-7-5 10:22
点赞 关注(1)
 
 

回复
举报

7

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
下面是GPS相关数据格式的解析程序:
unsigned char
GPS_GPGGA(char *str, GPS_INFO *GPS)
{
    unsigned char ch, status;
    char *buf = str;
    ch = buf[4];
    status = buf[GetComma(2, buf)];
    if (ch == 'G')
    {
        if (status != ',')
        {
            GPS->height_sea = (float)Get_Double_Number(&buf[GetComma(9, buf)]);
            GPS->height_ground = (float)Get_Double_Number(&buf[GetComma(11, buf)]);
            return 1;
        }
    }
    return 0;   
}

unsigned char
GPS_GPRMC(char *str, GPS_INFO *GPS)
{
    unsigned char ch, status, ucTemp;
    char *buf = str;
    double LatitudeTemp, LongitudeTemp;
    ch = buf[5];
    status = buf[GetComma(2, buf)];
    if(ch == 'C')
    {
        if(status == 'A')
        {
            GPS -> NS = buf[GetComma(4, buf)];
            GPS -> EW = buf[GetComma(6, buf)];
            GPS->latitude   = Get_Double_Number(&buf[GetComma(3, buf)]);
            GPS->longitude  = Get_Double_Number(&buf[GetComma(5, buf)]);
            GPS->latitude_Degree  = (unsigned char)(GPS->latitude / 100);
            LatitudeTemp    = GPS->latitude - GPS->latitude_Degree * 100;
            GPS->latitude_Cent = (unsigned char)LatitudeTemp;
            GPS->latitude_Second  = (unsigned char)((LatitudeTemp - GPS->latitude_Cent) * 60);
            GPS->longitude_Degree  = (unsigned char)(GPS->longitude / 100);
            LongitudeTemp    = GPS->longitude - GPS->longitude_Degree * 100;
            GPS->longitude_Cent = (unsigned char)LongitudeTemp;
            GPS->longitude_Second  = (unsigned char)((LongitudeTemp - GPS->longitude_Cent) * 60);
            GPS->speed     = (float)Get_Double_Number(&buf[GetComma(7, buf)]) * 1.85;
            GPS->direction = (float)Get_Double_Number(&buf[GetComma(8, buf)]);
   
            ucTemp = GetComma(1, buf);
            GPS->D.hour    = (buf[ucTemp + 0] - '0') * 10 + (buf[ucTemp + 1] - '0');
            GPS->D.minute  = (buf[ucTemp + 2] - '0') * 10 + (buf[ucTemp + 3] - '0');
            GPS->D.second  = (buf[ucTemp + 4] - '0') * 10 + (buf[ucTemp + 5] - '0');
   
            ucTemp = GetComma(9, buf);
            GPS->D.day     = (buf[ucTemp + 0] - '0') * 10 + (buf[ucTemp + 1] - '0');
            GPS->D.month   = (buf[ucTemp + 2] - '0') * 10 + (buf[ucTemp + 3] - '0');
            GPS->D.year    = (buf[ucTemp + 4] - '0') * 10 + (buf[ucTemp + 5] - '0') + 2000;
            UTC2BTC(&GPS->D);
      
            return 1;
        }
    }
    return 0;
}
此帖出自信息发布论坛
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
此帖出自信息发布论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表