- #include "gps_config.h"
- #include "bsp_usart2.h"
- #include "nmea/nmea.h"
- /* DMA接收緩沖 */
- uint8_t gps_rbuff[GPS_RBUFF_SIZE];
- /* DMA傳輸結束標志 */
- __IO uint8_t GPS_TransferEnd = 0, GPS_HalfTransferEnd = 0;
- /**
- * @brief GPS_Interrupt_Config 配置GPS使用的DMA中斷
- * @param None.
- * @retval None.
- */
- static void GPS_Interrupt_Config(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
- // DMA2 Channel Interrupt ENABLE
- NVIC_InitStructure.NVIC_IRQChannel = GPS_DMA_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
- /**
- * @brief GPS_ProcessDMAIRQ GPS DMA中斷服務函數
- * @param None.
- * @retval None.
- */
- void GPS_ProcessDMAIRQ(void)
- {
-
- if(DMA_GetITStatus(GPS_DMA_IT_HT) ) /* DMA 半傳輸完成 */
- {
- GPS_HalfTransferEnd = 1; //設置半傳輸完成標志位
- DMA_ClearFlag(GPS_DMA_FLAG_HT);
- }
- else if(DMA_GetITStatus(GPS_DMA_IT_TC)) /* DMA 傳輸完成 */
- {
- GPS_TransferEnd = 1; //設置傳輸完成標志位
- DMA_ClearFlag(GPS_DMA_FLAG_TC);
- }
- }
- /**
- * @brief GPS_DMA_Config gps dma接收配置
- * @param 無
- * @retval 無
- */
- static void GPS_DMA_Config(void)
- {
- DMA_InitTypeDef DMA_InitStructure;
-
- /*開啟DMA時鐘*/
- RCC_AHBPeriphClockCmd(GPS_DMA_CLK, ENABLE);
- /*設置DMA源:串口數據寄存器地址*/
- DMA_InitStructure.DMA_PeripheralBaseAddr = GPS_DATA_ADDR;
- /*內存地址(要傳輸的變量的指針)*/
- DMA_InitStructure.DMA_MemoryBaseAddr = (u32)gps_rbuff;
- /*方向:從內存到外設*/
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
- /*傳輸大小DMA_BufferSize=SENDBUFF_SIZE*/
- DMA_InitStructure.DMA_BufferSize = GPS_RBUFF_SIZE;
- /*外設地址不增*/
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
- /*內存地址自增*/
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
- /*外設數據單位*/
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
- /*內存數據單位 8bit*/
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
- /*DMA模式:不斷循環*/
- DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
- /*優先級:中*/
- DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
- /*禁止內存到內存的傳輸 */
- DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
- /*配置DMA的通道*/
- DMA_Init(GPS_DMA_CHANNEL, &DMA_InitStructure);
-
- GPS_Interrupt_Config();
-
- DMA_ITConfig(GPS_DMA_CHANNEL,DMA_IT_HT|DMA_IT_TC,ENABLE); //配置DMA發送完成后產生中斷
- /*使能DMA*/
- DMA_Cmd (GPS_DMA_CHANNEL,ENABLE);
-
- /* 配置串口 向 DMA發出TX請求 */
- USART_DMACmd(GPS_USART, USART_DMAReq_Rx, ENABLE);
-
- }
- /**
- * @brief GPS_Config gps 初始化
- * @param 無
- * @retval 無
- */
- void GPS_Config(void)
- {
- GPS_USART_INIT();
- GPS_DMA_Config();
-
- }
-
- /**
- * @brief trace 在解碼時輸出捕獲的GPS語句
- * @param str: 要輸出的字符串,str_size:數據長度
- * @retval 無
- */
- void trace(const char *str, int str_size)
- {
- #ifdef __GPS_DEBUG //在gps_config.h文件配置這個宏,是否輸出調試信息
- uint16_t i;
- printf("\r\nTrace: ");
- for(i=0;i<str_size;i++)
- printf("%c",*(str+i));
-
- printf("\n");
- #endif
- }
- /**
- * @brief error 在解碼出錯時輸出提示消息
- * @param str: 要輸出的字符串,str_size:數據長度
- * @retval 無
- */
- void error(const char *str, int str_size)
- {
- #ifdef __GPS_DEBUG //在gps_config.h文件配置這個宏,是否輸出調試信息
- uint16_t i;
- printf("\r\nError: ");
- for(i=0;i<str_size;i++)
- printf("%c",*(str+i));
- printf("\n");
- #endif
- }
- /********************************************************************************************************
- ** 函數名稱: bit IsLeapYear(uint8_t iYear)
- ** 功能描述: 判斷閏年(僅針對于2000以后的年份)
- ** 入口參數: iYear 兩位年數
- ** 出口參數: uint8_t 1:為閏年 0:為平年
- ********************************************************************************************************/
- static uint8_t IsLeapYear(uint8_t iYear)
- {
- uint16_t Year;
- Year = 2000+iYear;
- if((Year&3)==0)
- {
- return ((Year%400==0) || (Year%100!=0));
- }
- return 0;
- }
- /********************************************************************************************************
- ** 函數名稱: void GMTconvert(uint8_t *DT,uint8_t GMT,uint8_t AREA)
- ** 功能描述: 格林尼治時間換算世界各時區時間
- ** 入口參數: *DT: 表示日期時間的數組 格式 YY,MM,DD,HH,MM,SS
- ** GMT: 時區數
- ** AREA: 1(+)東區 W0(-)西區
- ********************************************************************************************************/
- void GMTconvert(nmeaTIME *SourceTime, nmeaTIME *ConvertTime, uint8_t GMT,uint8_t AREA)
- {
- uint32_t YY,MM,DD,hh,mm,ss; //年月日時分秒暫存變量
-
- if(GMT==0) return; //如果處于0時區直接返回
- if(GMT>12) return; //時區最大為12 超過則返回
- YY = SourceTime->year; //獲取年
- MM = SourceTime->mon; //獲取月
- DD = SourceTime->day; //獲取日
- hh = SourceTime->hour; //獲取時
- mm = SourceTime->min; //獲取分
- ss = SourceTime->sec; //獲取秒
- if(AREA) //東(+)時區處理
- {
- if(hh+GMT<24) hh += GMT;//如果與格林尼治時間處于同一天則僅加小時即可
- else //如果已經晚于格林尼治時間1天則進行日期處理
- {
- hh = hh+GMT-24; //先得出時間
- if(MM==1 || MM==3 || MM==5 || MM==7 || MM==8 || MM==10) //大月份(12月單獨處理)
- {
- if(DD<31) DD++;
- else
- {
- DD = 1;
- MM ++;
- }
- }
- else if(MM==4 || MM==6 || MM==9 || MM==11) //小月份2月單獨處理)
- {
- if(DD<30) DD++;
- else
- {
- DD = 1;
- MM ++;
- }
- }
- else if(MM==2) //處理2月份
- {
- if((DD==29) || (DD==28 && IsLeapYear(YY)==0)) //本來是閏年且是2月29日 或者不是閏年且是2月28日
- {
- DD = 1;
- MM ++;
- }
- else DD++;
- }
- else if(MM==12) //處理12月份
- {
- if(DD<31) DD++;
- else //跨年最后一天
- {
- DD = 1;
- MM = 1;
- YY ++;
- }
- }
- }
- }
- else
- {
- if(hh>=GMT) hh -= GMT; //如果與格林尼治時間處于同一天則僅減小時即可
- else //如果已經早于格林尼治時間1天則進行日期處理
- {
- hh = hh+24-GMT; //先得出時間
- if(MM==2 || MM==4 || MM==6 || MM==8 || MM==9 || MM==11) //上月是大月份(1月單獨處理)
- {
- if(DD>1) DD--;
- else
- {
- DD = 31;
- MM --;
- }
- }
- else if(MM==5 || MM==7 || MM==10 || MM==12) //上月是小月份2月單獨處理)
- {
- if(DD>1) DD--;
- else
- {
- DD = 30;
- MM --;
- }
- }
- else if(MM==3) //處理上個月是2月份
- {
- if((DD==1) && IsLeapYear(YY)==0) //不是閏年
- {
- DD = 28;
- MM --;
- }
- else DD--;
- }
- else if(MM==1) //處理1月份
- {
- if(DD>1) DD--;
- else //新年第一天
- {
- DD = 31;
- MM = 12;
- YY --;
- }
- }
- }
- }
- ConvertTime->year = YY; //更新年
- ConvertTime->mon = MM; //更新月
- ConvertTime->day = DD; //更新日
- ConvertTime->hour = hh; //更新時
- ConvertTime->min = mm; //更新分
- ConvertTime->sec = ss; //更新秒
- }
復制代碼
GPS_Decode_USART.rar
(852.54 KB, 下載次數: 262)
2017-5-3 19:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|