STM32 GPS模块输出控制实现

本文是对 ATGM336H-5N GNSS模块的发送功能实现,已经验证过功能,供大家参考
在这里插入图片描述
配置的目标:

  1. 只使用北斗定位;
  2. 只接收RMC类型的数据帧

说明:

  1. 使用芯片为 STMF103C8T6芯片
  2. 使用芯片为了 杭州中科微电子有限公司 的因此发送的属于私有协议内容,不能套用在其它公司的GNSS模块上。
  3. 原理是相同的;

文档说明

配置发送帧使用CAS03标识:
在这里插入图片描述
设置更新频率使用GAS02标识:
在这里插入图片描述
配置使用的定位系统使用CAS04标识:
在这里插入图片描述

代码实现

宏定义

#define USARTx								USART3
#define USARTx_CLK_ENABLE()              	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE)

#define USARTx_TX_GPIO_CLK_ENABLE()     	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE)
#define USARTx_TX_GPIO_PORT             	GPIOB
#define USARTx_TX_PIN                   	GPIO_Pin_10

#define USARTx_RX_GPIO_CLK_ENABLE()      	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE)
#define USARTx_RX_GPIO_PORT              	GPIOB
#define USARTx_RX_PIN                    	GPIO_Pin_11

#define USARTx_IRQn							USART3_IRQn
#define USARTx_IRQHanlder					USART3_IRQHandler

发送函数

void GPS_SendBuffer(char *str, uint8_t len)
{
	uint8_t i;
	for (i = 0; i < len; ++i)
	{
		while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
		USART_SendData(USARTx, str[i]);
	}
}

GPS配置

/*
 * 消息接收控制,0表示不接收,1~9表示每秒接收几次	
 */
#define nGGA	0
#define nGLL	0
#define nGSA	0
#define nGSV	0
#define nRMC	1
#define nVTG	0
#define nZDA	0
#define nANT	0
#define nDHV	0
#define nLPS	0
#define nUTC	0
#define nGST	0
#define nTIM	0

#define PCAS02	0
#define PCAS03	1
#define PCAS04	2
#define PCALEN  PCAS04 + 1

uint8_t CheckSum(uint8_t *data, uint8_t length);
void GPS_Config(void)
{
	static char *initStr[] = {
		"$PCAS02,1000*%X\r\n",		/* 设置发送频率为每秒一次 */
		"$PCAS03,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,,,%d,%d,,,,%d*%s\r\n",		/* 设置接收消息的类型 */
		"$PCAS04,2*%X\r\n",			/* 仅使用北斗定位 */
	};
	uint8_t i;
	uint8_t strLen = 0, checkSum = 0;
	char sendStr1[70] = {0};
	char sendStr2[70] = {0};

	for (i = 0; i < PCALEN; ++i)
	{
        
        switch (i)
        {
            case PCAS03:
                sprintf(sendStr1, initStr[i], nGGA, nGLL, nGSA, nGSV, nRMC, nVTG, nZDA, nANT, nDHV, nLPS, nUTC, nGST, nTIM, "%X");
                checkSum = CheckSum(sendStr1 + 1, strlen(sendStr1) - 6);
                sprintf(sendStr2, sendStr1, checkSum);
                break;
            default:
                checkSum = CheckSum(initStr[i] + 1, strlen(initStr[i]) - 6);
                sprintf(sendStr2, initStr[i], checkSum);
                break;
        }

		GPS_SendBuffer(sendStr2, strlen(sendStr2));
	}
}

uint8_t CheckSum(uint8_t *data, uint8_t length)
{
    uint8_t usBcc = 0;        // Initial value
	while(length--)
	{
		usBcc ^= *data++;
	}
    return usBcc;
}

其它省略实现省略。最后效果如下:
在这里插入图片描述

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值