各位,我把GPS模块例程的端口PA2,PA3改成PB10,PB11,然后在gps.config.h里改了相应的配置,但为什么就是读不出数据呢?程序是执行到数据接收半完成标志位处就不行了,不知道是哪里有问题难道还有对应没改的地方吗?使用的是官方GPS_LCD例程,DMA产生中断,调试通过USART1输出数据,USART2对应原GPS数据接收.
求教求教!!
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
gps_config.h
/* GPS接口配置 使用不同的串口时,要修改对应的接口 */
#define GPS_DR_Base (USART3_BASE+0x04) // 串口的数据寄存器地址.原为USART2
#define GPS_DATA_ADDR GPS_DR_Base //GPS使用的串口的数据寄存器地址
#define GPS_RBUFF_SIZE 512 //串口接收缓冲区大小
#define HALF_GPS_RBUFF_SIZE (GPS_RBUFF_SIZE/2) //串口接收缓冲区一半
/* 外设 */
/*******************************************************/
//GPS串口波特率
#define GPS_USART_BAUDRATE 9600
#define GPS_USART USART3 //原为USART2
#define GPS_USART_CLK RCC_APB1Periph_USART3
#define GPS_RCC_PeriphClockCmd_Fun RCC_APB1PeriphClockCmd//原为1
#define GPS_USART_RX_GPIO_PORT GPIOB //原为GPIOA
#define GPS_USART_RX_GPIO_CLK RCC_APB2Periph_GPIOB //原为RCC_APB2Periph_GPIOA
#define GPS_USART_RX_PIN GPIO_Pin_11 //原为A3
#define GPS_USART_TX_GPIO_PORT GPIOB //原为GPIOA
#define GPS_USART_TX_GPIO_CLK RCC_APB2Periph_GPIOB //原为RCC_APB2Periph_GPIOA
#define GPS_USART_TX_PIN GPIO_Pin_10 //原为A2
/************************************************************/
#define GPS_DMA DMA1
#define GPS_DMA_CLK RCC_AHBPeriph_DMA1
#define GPS_DMA_CHANNEL DMA1_Channel6
#define GPS_DMA_IRQn DMA1_Channel6_IRQn //GPS中断源
//USART1_IRQn
/* 外设标志 */
#define GPS_DMA_FLAG_TC DMA1_FLAG_TC6
#define GPS_DMA_FLAG_TE DMA1_FLAG_TE6
#define GPS_DMA_FLAG_HT DMA1_FLAG_HT6
#define GPS_DMA_FLAG_GL DMA1_FLAG_GL6
#define GPS_DMA_IT_HT DMA1_IT_HT6
#define GPS_DMA_IT_TC DMA1_IT_TC6
/* 中断函数 */
#define GPS_DMA_IRQHANDLER DMA1_Channel6_IRQHandler //GPS使用的DMA中断服务函数
extern uint8_t gps_rbuff[GPS_RBUFF_SIZE];
extern __IO uint8_t GPS_TransferEnd ;
extern __IO uint8_t GPS_HalfTransferEnd;
void GPS_ProcessDMAIRQ(void);
void GPS_Config(void);
void trace(const char *str, int str_size);
void error(const char *str, int str_size);
void gps_info(const char *str, int str_size);
void GMTconvert(nmeaTIME *SourceTime, nmeaTIME *ConvertTime, uint8_t GMT,uint8_t AREA) ;
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
bsp_usart.h
/**
* 串口宏定义,不同的串口挂载的总线和IO不一样,移植时需要修改这几个宏
* 1-修改总线时钟的宏,uart1挂载到apb2总线,其他uart挂载到apb1总线
* 2-修改GPIO的宏
*/
// 串口1-USART1
#define DEBUG_USARTx USART1
#define DEBUG_USART_CLK RCC_APB2Periph_USART1
#define DEBUG_USART_APBxClkCmd RCC_APB2PeriphClockCmd
#define DEBUG_USART_BAUDRATE 115200
// USART GPIO 引脚宏定义
#define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOA)
#define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd
#define DEBUG_USART_TX_GPIO_PORT GPIOA
#define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_9
#define DEBUG_USART_RX_GPIO_PORT GPIOA
#define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_10
#define DEBUG_USART_IRQ USART1_IRQn
#define DEBUG_USART_IRQHandler USART1_IRQHandler
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
测试程序
/* 初始化GPS数据结构 */
nmea_zero_INFO(&info);
nmea_parser_init(&parser);
while(1)
{
if(GPS_HalfTransferEnd) /* 接收到GPS_RBUFF_SIZE一半的数据 */ //没有接收到数据!!!!!!!GPS_HalfTransferEnd未置1
{
/* 进行nmea格式解码 */
nmea_parse(&parser, (const char*)&gps_rbuff[0], HALF_GPS_RBUFF_SIZE, &info);
GPS_HalfTransferEnd = 0; //清空标志位
new_parse = 1;
//设置解码消息标志
}
else if(GPS_TransferEnd) /* 接收到另一半数据 */
{
nmea_parse(&parser, (const char*)&gps_rbuff[HALF_GPS_RBUFF_SIZE], HALF_GPS_RBUFF_SIZE, &info);
GPS_TransferEnd = 0;
new_parse =1;
}
if( new_parse ) //有新的解码消息
// if(1 )
{ ILI9341_DispStringLine_EN(LINE(4)," hereeeeeeeeeeeeeeeeeeee");
/* 对解码后的时间进行转换,转换成北京时间 */
GMTconvert(&info.utc,&beiJingTime,8,1);
/* 输出解码得到的信息 */
printf("\r\n时间%d-%02d-%02d,%d:%d:%d\r\n", beiJingTime.year+1900, beiJingTime.mon,beiJingTime.day,beiJingTime.hour,beiJingTime.min,beiJingTime.sec);
//info.lat lon中的格式为[degree][min].[sec/60],使用以下函数转换成[degree].[degree]格式
deg_lat = nmea_ndeg2degree(info.lat);
deg_lon = nmea_ndeg2degree(info.lon);
double R_Lat, R_Lon, DD_deg_lat, DD_deg_lon;
R_Lat=31.844859; R_Lon=117.295568; //基站准确经纬度,待获取 |