国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

嵌入式外設集 -- GPS定位模塊(ATGM336H)

這篇具有很好參考價值的文章主要介紹了嵌入式外設集 -- GPS定位模塊(ATGM336H)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

一、模塊介紹

關注微信公眾號--星之援工作室 發(fā)送關鍵字(GPS模塊)

?使用的注意事項

?二、如何移植

usart2.c

usart2.h

獲取以及解析經(jīng)緯度

顯示經(jīng)緯度

三、參考


一、模塊介紹

ATGM336H是一種高性能的GPS模塊,可以在較低功耗下提供高精度、高可靠性的位置信息服務。它采用了SiRFstarIII技術,并支持多種導航衛(wèi)星系統(tǒng),包括GPS、GLONASS、Galileo、QZSS和SBAS。ATGM336H可以快速獲取衛(wèi)星信號,提供高達10Hz的位置刷新速率,并能在較弱的GPS信號環(huán)境下保持高精度。 ATGM336H小巧輕便,易于安裝和集成,適用于各種應用場景,包括車輛定位、智能導航、無人機導航等。它還具有設備保護功能,如過載保護、ESD保護等,能夠保護設備免受電氣壓力和電磁干擾的影響。此外,ATGM336H還配備了一個非易失性存儲器,可記錄設備的操作歷史記錄和配置信息,方便用戶對設備進行管理和維護。 總之,ATGM336H是一款高性能、高精度的GPS模塊,具有卓越的性能和可靠性,并適用于各種導航應用場景。

單片機gps定位模塊,嵌入式外設集,單片機,嵌入式硬件,gps定位,c語言,嵌入式外設

歡迎關注微信公眾號星之援工作室,公眾號不定時開源設計項目

支持單片機,Android系統(tǒng)設計成品定制,項目代做

請聯(lián)系微信:13648103287

關注微信公眾號--星之援工作室 發(fā)送關鍵字(ATGM336H)

????????????????????

單片機gps定位模塊,嵌入式外設集,單片機,嵌入式硬件,gps定位,c語言,嵌入式外設

?使用的注意事項

1.GPS模塊首次上電的時候需要獲取衛(wèi)星的定位信息,需要在開闊地帶進行程中不難斷電,獲取成功后我們的GPS模塊上的LED會處于閃爍的狀態(tài)獲取,這個獲取定位信息的過程大概在1-2分鐘

2.GPS模塊的串口波特率為9600

3.GPS模塊需要穩(wěn)定的的5V電源,需要注意我們的供電部分是否達到要求。

單片機gps定位模塊,嵌入式外設集,單片機,嵌入式硬件,gps定位,c語言,嵌入式外設

單片機gps定位模塊,嵌入式外設集,單片機,嵌入式硬件,gps定位,c語言,嵌入式外設

?二、如何移植

1.首先GSP是使用的串口通信,我們第一步需要先配置我們單片機的串口,并將我們的串口波特率配置為9600,這里我自己使用的是串口2進行獲取的,代碼如下

usart2.c

#include "delay.h"
#include "usart2.h"
#include "stdarg.h"	 	 
#include "stdio.h"	 	 
#include "string.h"	 

char rxdatabufer;
u16 point1 = 0;

_SaveData Save_Data;

#if EN_USART2_RX   //如果使能了接收
//串口1中斷服務程序
//注意,讀取USARTx->SR能避免莫名其妙的錯誤   	
char USART_RX2_BUF[USART2_REC_LEN];     //接收緩沖,最大USART_REC_LEN個字節(jié).
//接收狀態(tài)
//bit15,	接收完成標志
//bit14,	接收到0x0d
//bit13~0,	接收到的有效字節(jié)數(shù)目
u16 USART2_RX_STA=0;       //接收狀態(tài)標記	  
  
void Usart2_Init(u32 bound)
{
   
	NVIC_InitTypeDef NVIC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	// GPIOB時鐘
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //串口3時鐘使能

 	USART_DeInit(USART2);  //復位串口3
		 //USART3_TX   PB10
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PB10
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//復用推挽輸出
  GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PB10
   
    //USART3_RX	  PB11
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
  GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PB11
	
	USART_InitStructure.USART_BaudRate = bound;//波特率一般設置為9600;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數(shù)據(jù)格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數(shù)據(jù)流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收發(fā)模式
  
	USART_Init(USART2, &USART_InitStructure); //初始化串口	3
  

	USART_Cmd(USART2, ENABLE);                    //使能串口 
	
	//使能接收中斷
  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//開啟中斷   
	
	//設置中斷優(yōu)先級
	NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//搶占優(yōu)先級3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子優(yōu)先級3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根據(jù)指定的參數(shù)初始化VIC寄存器


	CLR_Buf();//清空緩存
}

void USART2_IRQHandler(void)                	//串口1中斷服務程序
{
	u8 Res;
#ifdef OS_TICKS_PER_SEC	 	//如果時鐘節(jié)拍數(shù)定義了,說明要使用ucosII了.
	OSIntEnter();    
#endif
	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) 
	{
		Res =USART_ReceiveData(USART2);//(USART1->DR);	//讀取接收到的數(shù)據(jù)
	
	if(Res == '$')
	{
		point1 = 0;	
	}
		

	  USART_RX2_BUF[point1++] = Res;

	if(USART_RX2_BUF[0] == '$' && USART_RX2_BUF[4] == 'M' && USART_RX2_BUF[5] == 'C')			//確定是否收到"GPRMC/GNRMC"這一幀數(shù)據(jù)
	{
		if(Res == '\n')									   
		{
			memset(Save_Data.GPS_Buffer, 0, GPS_Buffer_Length);      //清空
			memcpy(Save_Data.GPS_Buffer, USART_RX2_BUF, point1); 	//保存數(shù)據(jù)
			Save_Data.isGetData = true;
			point1 = 0;
			memset(USART_RX2_BUF, 0, USART2_REC_LEN);      //清空				
		}	
				
	}
	
	if(point1 >= USART2_REC_LEN)
	{
		point1 = USART2_REC_LEN;
	}	  		 
   } 
#ifdef OS_TICKS_PER_SEC	 	//如果時鐘節(jié)拍數(shù)定義了,說明要使用ucosII了.
	OSIntExit();  											 
#endif
}


u8 Hand(char *a)                   // 串口命令識別函數(shù)
{ 
    if(strstr(USART_RX2_BUF,a)!=NULL)
	    return 1;
	else
		return 0;
}

void CLR_Buf(void)                           // 串口緩存清理
{
	memset(USART_RX2_BUF, 0, USART2_REC_LEN);      //清空
  point1 = 0;                    
}

void clrStruct()
{
	Save_Data.isGetData = false;
	Save_Data.isParseData = false;
	Save_Data.isUsefull = false;
	memset(Save_Data.GPS_Buffer, 0, GPS_Buffer_Length);      //清空
	memset(Save_Data.UTCTime, 0, UTCTime_Length);
	memset(Save_Data.latitude, 0, latitude_Length);
	memset(Save_Data.N_S, 0, N_S_Length);
	memset(Save_Data.longitude, 0, longitude_Length);
	memset(Save_Data.E_W, 0, E_W_Length);
	
}

#endif	

 




usart2.h

#ifndef __USART2_H
#define __USART2_H
#include "stdio.h"	
#include "sys.h"
#include "string.h"


//V1.5修改說明
//1,增加了對UCOSII的支持
#define USART2_REC_LEN  			200  	//定義最大接收字節(jié)數(shù) 200
#define EN_USART2_RX 			1		//使能(1)/禁止(0)串口1接收
	  	
extern char  USART_RX2_BUF[USART2_REC_LEN]; //接收緩沖,最大USART_REC_LEN個字節(jié).末字節(jié)為換行符 
extern u16 USART2_RX_STA;         		//接收狀態(tài)標記	



#define false 0
#define true 1

//定義數(shù)組長度
#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 SaveData 
{
	char GPS_Buffer[GPS_Buffer_Length];
	char isGetData;		//是否獲取到GPS數(shù)據(jù)
	char isParseData;	//是否解析完成
	char UTCTime[UTCTime_Length];		//UTC時間
	char latitude[latitude_Length];		//緯度
	char N_S[N_S_Length];		//N/S
	char longitude[longitude_Length];		//經(jīng)度
	char E_W[E_W_Length];		//E/W
	char isUsefull;		//定位信息是否有效
} _SaveData;




void Usart2_Init(u32 bound);
extern char rxdatabufer;
extern u16 point1;
extern _SaveData Save_Data;

void CLR_Buf(void);
u8 Hand(char *a);
void clrStruct(void);
#endif



2.移植程序中的主要代碼,我直接將我移植好的代碼展示在這里,可以直接放到我們的點c文件里面進行獲取顯示即可

獲取以及解析經(jīng)緯度

void errorLog(U8 num)
{
	while (1)
	{
		printf("ERROR%d\r\n", num);
	}
}
// 獲取GPS定位信息
void parseGpsBuffer()
{
	char *subString;
	char *subStringNext;
	char i = 0;
	char usefullBuffer[2];
	if (Save_Data.isGetData)
	{
		Save_Data.isGetData = false;
		for (i = 0; i <= 6; i++)
		{
			if (i == 0)
			{
				if ((subString = strstr(Save_Data.GPS_Buffer, ",")) == NULL)
					errorLog(1); // 解析錯誤
			}
			else
			{
				subString++;
				if ((subStringNext = strstr(subString, ",")) != NULL)
				{
					switch (i)
					{
					case 1:
						memcpy(Save_Data.UTCTime, subString, subStringNext - subString);
						break; // 獲取UTC時間
					case 2:
						memcpy(usefullBuffer, subString, subStringNext - subString);
						break; // 獲取UTC時間
					case 3:
						memcpy(Save_Data.latitude, subString, subStringNext - subString);
						break; // 獲取緯度信息
					case 4:
						memcpy(Save_Data.N_S, subString, subStringNext - subString);
						break; // 獲取N/S
					case 5:
						memcpy(Save_Data.longitude, subString, subStringNext - subString);
						break; // 獲取經(jīng)度信息
					case 6:
						memcpy(Save_Data.E_W, subString, subStringNext - subString);
						break; // 獲取E/W

					default:
						break;
					}

					subString = subStringNext;
					Save_Data.isParseData = true;
					if (usefullBuffer[0] == 'A')
						Save_Data.isUsefull = true;
					else if (usefullBuffer[0] == 'V')
						Save_Data.isUsefull = false;
				}
				else
				{
					errorLog(2); // 解析錯誤
				}
			}
		}
	}
}
F32 longitude_sum, latitude_sum;
U8 longitude_int, latitude_int;
void printGpsBuffer()
{
	// 轉化為數(shù)字
	longitude_sum = atof(Save_Data.longitude);
	latitude_sum = atof(Save_Data.latitude);
	// printf("維度 = %.5f %.5f\r\n",longitude_sum,latitude_sum);
	// 整數(shù)
	longitude_int = longitude_sum / 100;
	latitude_int = latitude_sum / 100;

	// 轉化為經(jīng)緯度
	longitude_sum = longitude_int + ((longitude_sum / 100 - longitude_int) * 100) / 60;
	latitude_sum = latitude_int + ((latitude_sum / 100 - latitude_int) * 100) / 60;

	if (Save_Data.isParseData)
	{
		Save_Data.isParseData = false;

		// printf("Save_Data.UTCTime = %s\r\n", Save_Data.UTCTime);
		if (Save_Data.isUsefull)
		{
			Save_Data.isUsefull = false;

			// printf("經(jīng)度 = %s\r\n",Save_Data.longitude);
			// printf("經(jīng)度 = %.5f\r\n", longitude_sum);
			// printf("維度 = %s\r\n",Save_Data.latitude);
			// printf("緯度 = %.5f\r\n", latitude_sum);
		}
		else
		{
			// printf("GPS DATA is not usefull!\r\n");
		}
	}
}
// 獲取數(shù)據(jù)參數(shù)
void Read_Data()
{
	// 經(jīng)緯度獲取
	parseGpsBuffer();
	// 解析經(jīng)緯度
	printGpsBuffer();

}

3.前兩步做完之后就可以使用我們的顯示屏或者使用串口進行打印出來了,這樣就可以獲取我們所在區(qū)域的大概經(jīng)緯度,最后可以再通過平臺進行經(jīng)緯度定位就行啦

顯示經(jīng)緯度

單片機gps定位模塊,嵌入式外設集,單片機,嵌入式硬件,gps定位,c語言,嵌入式外設

三、參考

STM32——定位模塊ATGM336H,數(shù)據(jù)解析,提取經(jīng)緯度https://blog.csdn.net/qq_51963665/article/details/125892763?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170202503816800186588658%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=170202503816800186588658&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-125892763-null-null.nonecase&utm_term=ATGM336H&spm=1018.2226.3001.4450

????END????文章來源地址http://www.zghlxwxcb.cn/news/detail-713904.html

到了這里,關于嵌入式外設集 -- GPS定位模塊(ATGM336H)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 嵌入式開發(fā)——DMA外設到內(nèi)存

    嵌入式開發(fā)——DMA外設到內(nèi)存

    加強理解DMA數(shù)據(jù)傳輸過程 加強掌握DMA的初始化流程 掌握DMA數(shù)據(jù)表查詢 理解源和目標的配置 理解數(shù)據(jù)傳輸特點 能夠動態(tài)配置源數(shù)據(jù) 需求 實現(xiàn)串口的數(shù)據(jù)接收,要求采用dma的方式。 數(shù)據(jù)交互流程 CPU配置好DMA 外部數(shù)據(jù)發(fā)送給串口外設 串口外設觸發(fā)中斷 CPU處理中斷邏輯,通知

    2024年02月03日
    瀏覽(19)
  • STM32聲源定位:實現(xiàn)聲源定位的嵌入式解決方案

    聲源定位是一項重要的技術,可以幫助我們確定聲音的來源位置。在嵌入式系統(tǒng)中,使用STM32微控制器可以實現(xiàn)精確的聲源定位。本文將介紹如何使用STM32實現(xiàn)聲源定位,并提供相關的源代碼。 聲源定位的基本原理是通過多個麥克風陣列接收到的聲音信號來計算聲源的位置。

    2024年04月16日
    瀏覽(22)
  • 嵌入式學習筆記(17)代碼重定位實戰(zhàn) 上篇

    嵌入式學習筆記(17)代碼重定位實戰(zhàn) 上篇

    3.5.1任務:在iSRAM中將代碼從0xd0020010重定位到0xd0024000 注解:本練習對代碼本身運行無實際意義,我們做這個重定位純粹是為了練習重定位技能。但是某些情況重定位就是必須的,譬如在uboot中。 3.5.2思路 (1)通過鏈接腳本將代碼鏈接到0xd0024000(鏈接地址) (2)使用dnw下載時將

    2024年02月09日
    瀏覽(23)
  • 架構-嵌入式模塊

    架構-嵌入式模塊

    約三分,主要為選擇題 馮諾依曼體系結構 程序和數(shù)據(jù)共用一個存儲空間 ,程序指令和數(shù)據(jù)存放在同一存儲器的不同地址上。 單一的地址及數(shù)據(jù)總線 ,程序指令和數(shù)據(jù)的總線寬度相同。 串行執(zhí)行,在傳輸上會出現(xiàn)瓶頸 。 哈弗體系結構 程序和數(shù)據(jù)采用不同的存儲空間 ,程序

    2024年02月10日
    瀏覽(22)
  • 【嵌入式模塊】MPU6050

    【嵌入式模塊】MPU6050

    ??作為慣性傳感器中入門級別的器件,MPU6050憑借它出色的性價比成為一款非常常用的角度姿態(tài)傳感器,在很多科創(chuàng)項目中被使用。我之前也接觸過很多次這個器件,也收集了不少資料,趁此機會總結一下學習筆記。 ??MPU6050包含3軸陀螺儀和3軸加速度計,其中陀螺儀的主

    2024年01月25日
    瀏覽(20)
  • 【嵌入式 – GD32開發(fā)實戰(zhàn)指南(ARM版本)】第2部分 外設篇 - 第3章 溫度傳感器DS18B20

    【嵌入式 – GD32開發(fā)實戰(zhàn)指南(ARM版本)】第2部分 外設篇 - 第3章 溫度傳感器DS18B20

    DS18B20 是 DALLAS 最新單線數(shù)字溫度傳感器,新的\\\"一線器件\\\"體積更小、適用電壓更寬、更經(jīng)濟。Dallas 半導體公司的數(shù)字化溫度傳感器 DS1820 是世界上第一片支持 \\\"一線總線\\\"接口的溫度傳感器。 DS18B20采用的單總線協(xié)議,也就是只需占用主機一個I/O口,無需其他外圍電路,直接將

    2024年02月21日
    瀏覽(20)
  • FANUC機器人動作指令的定位類型FINE和CNT詳解 嵌入式

    FANUC機器人動作指令的定位類型FINE和CNT詳解 嵌入式 FANUC機器人是一種廣泛應用于工業(yè)領域的機器人系統(tǒng),它具有高效、精確的動作控制能力。在FANUC機器人的編程中,有兩種常用的定位類型,即FINE和CNT。本文將詳細解釋這兩種定位類型的含義和使用方法,并提供相應的源代碼

    2024年01月22日
    瀏覽(19)
  • 上位機圖像處理和嵌入式模塊部署(開篇)

    上位機圖像處理和嵌入式模塊部署(開篇)

    【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯(lián)系信箱:feixiaoxing @163.com】 ? ? ? ? 圖像處理是現(xiàn)實生活當中很實用的一門技術。工業(yè)上一般采用的是機器視覺,以傳統(tǒng)算法和光源控制為主,部分采用了深度學習技術。而生活當中,則主要以二維碼識別、人臉識別、

    2024年01月22日
    瀏覽(33)
  • 【藍橋杯嵌入式】資源拓展板模塊詳解——數(shù)碼管

    【藍橋杯嵌入式】資源拓展板模塊詳解——數(shù)碼管

    目錄 一、原理 1.1數(shù)碼管 1.2?74HC595 二、編碼說明 2.1 數(shù)碼管字模 2.2十六進制數(shù)字模編碼參考 三、程序設計 3.1 原理圖 3.2 邏輯分析 3.3 配置方法和參考代碼 3.4 參考例程 ? 1.1數(shù)碼管 ? 擴展板使用3位5161AS數(shù)碼管。 5161AS數(shù)碼管引腳圖: ? ? 5161AS數(shù)碼管原理圖: ? ? 從上圖可知,

    2024年02月04日
    瀏覽(47)
  • 【嵌入式Linux內(nèi)核驅動】內(nèi)核模塊三要素與驗證測試

    內(nèi)核模塊 Linux內(nèi)核模塊是一種可以動態(tài)加載和卸載的軟件組件,用于擴展Linux操作系統(tǒng)的功能。Linux內(nèi)核本身只包含了必要的核心功能,而內(nèi)核模塊則允許開發(fā)者在運行時向內(nèi)核添加新的功能、驅動程序或文件系統(tǒng)支持,而無需重新編譯整個內(nèi)核或重新啟動系統(tǒng)。 內(nèi)核模塊是

    2024年02月06日
    瀏覽(134)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包