//------------------------------------------------------- // GPS记录器第二版 // by wowbanui 2011/06 //------------------------------------------------------- #include "common.h" #include "stm32f10x.h" #include "S1D15E06.h" #include "GPS.h" #include "stm32f10x_it.h" #include "keyboard.h" #include
char USART_Buf[301]; u8 RxCounter=0; u8 UsartHaveData=0; u8 UsartHaveError=0; u32 UsartPackageError=0,UsartPackageTotal=0; u8 NeedUpdate=0; u8 Mode= MODE_SATINFO; #ifdef DEBUG char DebugStr[100]; #endif void DelayUS(u32 nus) //延时 单位 us { SysTick->LOAD=nus*9; //时间加载 SysTick->CTRL|=0x01; //开始倒数 while(!(SysTick->CTRL&(1<<16))); //等待时间到达 SysTick->CTRL=0X00000000; //关闭计数器 SysTick->VAL=0X00000000; //清空计数器 } void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus; //RCC system reset(for debug purpose) //复位所有的RCC外围设备寄存器, //不改变内部高速振荡器调整位(HSITRIM[4..0]) //以及备份域控制寄存器(RCC_BDCR), //控制状态寄存器RCC_CSR RCC_DeInit(); //Enable HSE //开启HSE振荡器 //三个参数 //RCC_HSE_ON 开启 //RCC_HSE_OFF 关闭 //RCC_HSE_BYPASS 使用外部时钟振荡器 RCC_HSEConfig(RCC_HSE_ON); //Wait till HSE is ready //HSEStartUpStatus为枚举类型变量,2种取值 //0为ERROR, 非0为SUCCESS //等待HSE准备好,若超时时间到则退出 HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { //Enable Prefetch Buffer FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Flash 2 wait state FLASH_SetLatency(FLASH_Latency_2); // HCLK = SYSCLK //配置AHB时钟,这个时钟从SYSCLK分频而来 //分频系数有1,2,4,8,16,64,128,256,512 RCC_HCLKConfig(RCC_SYSCLK_Div1); //PCLK2 = HCLK //设置低速APB2时钟,这个时钟从AHB时钟分频而来 //分频系数为1,2,4,8,16 RCC_PCLK2Config(RCC_HCLK_Div1); // PCLK1 = HCLK/2 //设置低速APB1时钟,这个时钟从AHB时钟分频而来 //分频系数为1,2,4,8,16 RCC_PCLK1Config(RCC_HCLK_Div2); //PLLCLK = 8MHz * 9 = 72 MHz //设置PLL的时钟源和乘法因子 //第一个入口参数为时钟源,共有3个 //RCC_PLLSource_HSI_Div2 //RCC_PLLSource_HSE_Div1 //RCC_PLLSource_HSE_Div2 //乘法因子 RCC_PLLMul_2~RCC_PLLMul_16,之间参数连续 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //Enable PLL RCC_PLLCmd(ENABLE); //Wait till PLL is ready while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {} //Select PLL as system clock source //选择系统时钟源,三个参数 //RCC_SYSCLKSource_HSI 内部高速振荡器 //RCC_SYSCLKSource_HSE 外部高速振荡器 //RCC_SYSCLKSource_PLLCLK PLL时钟 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Wait till PLL is used as system clock source //返回系统当前的时钟源 //返回值有3种 //0x00 HSI是当前时钟源 //0x04 HSE是当前时钟源 //0x08 PLL是当前时钟源 while(RCC_GetSYSCLKSource() != 0x08) {} // RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); // RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SDIO, ENABLE); // RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD| RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOG,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); } } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //LCD GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7| //PC.0-7(D0-D7) GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12; //PC.8(E),PC.9(RW),PC.10(A0),PC.12(RST#),PC.13(CS#) GPIO_Init(GPIOC, &GPIO_InitStructure); } void NVIC_Configuration(void) { #ifdef VECT_TAB_RAM NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); //Set the Vector Table base location at 0x20000000 #else //VECT_TAB_FLASH NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //Set the Vector Table base location at 0x08000000 #endif NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); } void TIM_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; //--------------------------------------------- //启动时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //--------------------------------------------- //中断配置 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // //中断间隔 100ms TIM_TimeBaseStructure.TIM_Period = 3600; TIM_TimeBaseStructure.TIM_Prescaler = (36000000/36000)-1; TIM_TimeBaseStructure.TIM_ClockDivision=0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); TIM_Cmd(TIM2, ENABLE); } void TIM2_IRQHandler(void) { //串口数据中断超时 if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); if ((UsartHaveData==0)&&(RxCounter>0)) //串口数据已经开始接收, 但是没有接收完毕, { RxCounter=0; //重置 UsartHaveError=1; UsartHaveData=1;//// UsartPackageError++; UsartPackageTotal++; } } } void USART_Configuration(void) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; //--------------------------------------------- //USART GPIO 配置 //USART2_Tx | USART1_Tx GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); //USART2_Rx | USART1_Rx GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); //--------------------------------------------- //启动时钟 *必须在USART 配置前调用 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //--------------------------------------------- //中断配置 //串口2接收中断打开 (GPS 接收) NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //串口1接收中断打开 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //-------------------------------------------- // USART 配置 USART_InitStructure.USART_BaudRate = 9600; //BaudRate = 9600 baud USART_InitStructure.USART_WordLength = USART_WordLength_8b; //Word Length = 8 Bits USART_InitStructure.USART_StopBits = USART_StopBits_1; //One Stop Bit USART_InitStructure.USART_Parity = USART_Parity_No; //No parity USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //Hardware flow control disabled (RTS and CTS signals) USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //Receive and transmit enabled //初始化串口2 (GPS) USART_Init(USART2, &USART_InitStructure); //------------------------------------------------------------------------- // void USART_ITConfig(USART_TypeDef* USARTx, u16 USART_IT, FunctionalState NewState) // // USART_IT 描述 // ----------------------------- // USART_IT_PE 奇偶错误中断 // USART_IT_TXE 发送中断 // USART_IT_TC 传输完成中断 // USART_IT_RXNE 接收中断 // USART_IT_IDLE 空闲总线中断 // USART_IT_LBD LIN中断检测中断 // USART_IT_CTS CTS中断 // USART_IT_ERR 错误中断 //------------------------------------------------------------------------- USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); USART_Cmd(USART2, ENABLE); //初始化串口 1 USART_Init(USART1, &USART_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // USART_ITConfig(USART1, USART_IT_TXE, ENABLE); USART_Cmd(USART1, ENABLE); } void USART2_IRQHandler(void) //串口2接收中断 (GPS) { if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) { //串口数据中断检测: //每次接收到串口数据就 清零中断寄存器值 //寄存器值600ms后触发 TIM_SetCounter(TIM2,0); USART_Buf[RxCounter] = USART_ReceiveData(USART2); //Read one byte from the receive data register GPS_Parser(USART_Buf[RxCounter]); //传输到GPS解析 RxCounter++; if(RxCounter > 299) { // USART_ITConfig(USART2, USART_IT_RXNE, DISABLE); // Disable the USART2 Receive interrupt UsartHaveData=1; RxCounter=299; } } } void USART1_IRQHandler(void) //串口1接收中断 调试用 { if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { USART_ReceiveData(USART1); } } #ifdef DEBUG void DebugOut(u8 *str) { while(*str) { USART_SendData(USART1, *str++); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } } #endif int main(void) { unsigned char strTemp[256]; u8 W25Q_uID[4]; u16 i,j=1,k; u32 l; u16 HZ1,HZ2,HZT; RCC_Configuration(); GPIO_Configuration(); NVIC_Configuration(); TIM_Configuration(); USART_Configuration(); LED_Y_OFF(); LED_G_OFF(); LCD_Init(); LCD_Clear(); W25Q_SPI_Init(); KBD_Init(); while(1) { switch(KBD_GetKey()) { case KEY_MENU: Menu(); break; case KEY_UP: Mode++; if (Mode>MODE_LOG) Mode=MODE_SATINFO; LCD_GPS_TAB(Mode-1,0); switch(Mode) { case MODE_SATINFO: GPS_View_SatInfo(); break; case MODE_SPEED: GPS_View_Speed(); break; case MODE_LOG: GPS_View_Log(); break; } break; case KEY_DOWN: break; } if (UsartHaveData) { UsartHaveData=0; GPS_View_Basic(); LCD_GPS_TAB(Mode-1,0); switch(Mode) { case MODE_SATINFO: GPS_View_SatInfo(); break; case MODE_SPEED: GPS_View_Speed(); break; case MODE_LOG: GPS_View_Log(); break; } GPS_DataInit(); i++; } } }