概述
前言:
最近入手了个GPS模块,手上只有GD32的开发板。网上有很多使用STM32库函数的GPS驱动程序,但是基于GD32库函数读取GPS驱动的教程居然一篇都没有。所以为了学习GD32库的同学,还是写一篇博客记录一下。
资料下载:
1、教程所用到的GPS模块资料的百度云链接:
https://pan.baidu.com/s/1scQYIS97CqzUzH5XQ3CI6A?pwd=5u0w
2、完整代码下载链接:
https://download.csdn.net/download/YANGJIERUN/87381512
使用的开发板:
本教程使用的开发板为DRG GD-2 GD32F103C8T6最小系统板。使用的GPS集成中科微电子的模组,市面上买得到的GPS模块都可以用本程序读取定位数据。
GD32串口引脚定义如下:
一般USART0用于下载程序和作为Debug打印数据使用,市面上大多数的开发板的串口都是默认占用USART0。所以我使用USART1读取GPS数据。
一、串口的初始化
串口初始化网上也有很多教程,这里简单带过。USART0和USART1的初始化步骤一致,只是函数参数上USART0改为了USART1而已。这里直接放代码。
串口0初始化代码:
// 串口 0 初始化
void USART0_init(uint32_t bound)
{
/* enable USART clock */
rcu_periph_clock_enable(RCU_USART0);
/* enable GPIO clock */
rcu_periph_clock_enable(RCU_GPIOA);
/* connect port to USARTx_Tx */
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
/* connect port to USARTx_Rx */
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
/* USART configure */
usart_deinit(USART0);
usart_baudrate_set(USART0, bound);
usart_word_length_set(USART0, USART_WL_8BIT);
usart_stop_bit_set(USART0, USART_STB_1BIT);
usart_parity_config(USART0, USART_PM_NONE);
usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE);
usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE);
usart_receive_config(USART0, USART_RECEIVE_ENABLE);
usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
usart_enable(USART0);
}
串口1初始化代码:
// 串口 1 初始化
void USART1_init(uint32_t bound)
{
/* enable USART clock */
rcu_periph_clock_enable(RCU_USART1);
/* enable GPIO clock */
rcu_periph_clock_enable(RCU_GPIOA);
/* connect port to USARTx_Tx */
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
/* connect port to USARTx_Rx */
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_3);
/* USART configure */
usart_deinit(USART1);
usart_baudrate_set(USART1, bound);
usart_word_length_set(USART1, USART_WL_8BIT);
usart_stop_bit_set(USART1, USART_STB_1BIT);
usart_parity_config(USART1, USART_PM_NONE);
usart_hardware_flow_rts_config(USART1, USART_RTS_DISABLE);
usart_hardware_flow_cts_config(USART1, USART_CTS_DISABLE);
usart_receive_config(USART1, USART_RECEIVE_ENABLE);
usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);
usart_enable(USART1);
}
二、串口的输入
串口输入本教程使用最简单的轮询输入。网上有教程是通过重写scanf实现串口输入的,但是重写scanf的实际使用很不好。数据一多就出错,而且只能被一个串口使用,本人不推荐大家使用。个人觉得还是C语言库里面的getchar()用的舒服。
串口0的输入代码如下:
//串口0的专用 getchar 函数
char USART0_getchar(void)
{
/* 等待串口输入数据 */
while (usart_flag_get(USART0, USART_FLAG_RBNE) == RESET);
return (char)usart_data_receive(USART0);
}
串口1的输入代码如下:
//串口1的专用 getchar 函数
char USART1_getchar(void)
{
/* 等待串口输入数据 */
while (usart_flag_get(USART1, USART_FLAG_RBNE) == RESET);
return (char)usart_data_receive(USART1);
}
三、串口打印
串口0的串口打印输出代码如下:
//串口0的专用 putchar 函数
void USART0_putchar(char ch)
{
usart_data_transmit(USART0, (uint8_t)ch);
while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
}
//串口0的专用 puts 函数
void USART0_puts(char* fmt)
{
uint16_t i = 0;
while(fmt[i] != '