void main(void) { ENTR_CRT_SECTION(); /* Setup STM32 system (clock, PLL and Flash configuration) */ SystemInit(); /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); // I2C1 init I2C1_Init(); EXT_CRT_SECTION(); // GLCD init GLCD_PowerUpInit(0x0); //( GLCD_Backlight(BACKLIGHT_ON); GLCD_SetFont(&Terminal_9_12_6,0x000F00,0x00FF0); GLCD_SetWindow(10,10,131,131); // Init Accl sensor if(FALSE == Accl_Init()) { // Initialization fault GLCD_TextSetPos(0,0); GLCD_print("\fLIS3LV020 Init.\r\nfault\r\n"); while(1); } //Init CarControl and Delay Car_Init(); DWT_Init(); HCSR04_Init(); // SysTick end of count event each 0.5s with input clock equal to 9MHz (HCLK/8, default) SysTick_Config(150000); SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); DWT_Delayms(1000); while(1) { //while(1){GLCD_print("Current state: %d \r",GPIO_ReadInputDataBit(JS_LEFT_PORT, JS_LEFT_MASK));} //car_feedback=accl_feedback(); /* A = accX[1]; B = velX[1]; C = posX[1]; */ if(SysTickF1) { SysTickF1 = FALSE; //GLCD_TextSetPos(0,0); GLCD_print("%d, %d \r", get_Xvel(), accl_feedback()); DWT_Delayms(500); } if(NewInstr) // { DWT_Delayms(1000); NewInstr = FALSE; //GoCar(Test, TestTurn); // 1. Give command (desired state) //desiredState; // 2. Run machine learning to test action action = goToState(car_instr); GoCars(action); // testExp(); int runTime = 0; while (runTime < 1){ DWT_Delayms(700); runTime++; } GLCD_TextSetPos(0,0); GLCD_print("\f%d,%d;%d,%d\r\n", get_X_accFeedback(0), get_Y_accFeedback(0), get_X_vel(0), get_Y_vel(0)); GLCD_print("%d,%d;%d,%d\r\n", get_X_accFeedback(1), get_Y_accFeedback(1), get_X_vel(1), get_Y_vel(1)); GLCD_print("%d,%d;%d,%d\r\n", get_X_accFeedback(2), get_Y_accFeedback(2), get_X_vel(2), get_Y_vel(2)); GLCD_print("%d,%d;%d,%d\r\n", get_X_accFeedback(3), get_Y_accFeedback(3), get_X_vel(3), get_Y_vel(3)); GLCD_print("%d,%d;%d,%d\r\n", get_X_accFeedback(4), get_Y_accFeedback(4), get_X_vel(4), get_Y_vel(4)); GLCD_print("%d,%d;%d,%d\r\n", get_X_accFeedback(5), get_Y_accFeedback(5), get_X_vel(5), get_Y_vel(5)); GLCD_print("%d,%d;%d,%d\r\n", get_X_accFeedback(6), get_Y_accFeedback(6), get_X_vel(6), get_Y_vel(6)); // GLCD_print("%d,%d;%d,%d\r\n", get_X_accFeedback(7), get_Y_accFeedback(7), get_X_vel(7), get_Y_vel(7)); car_instr=car_stop; GoCars(car_instr); DWT_Delayms(2000); } //GoCars(3); //Stopping the car // 3. Wait x ms //Wait in ML-method testAllActions // 4. Return value from accelerometer //Return value from accelerometer in ML-method testAllActions // 5. Evaluate action compared to state //Already implemented in ML-file. No need to alter (probably) // 6. Repeat 3-5 until all actions has been tested //Already implemented in ML-file. No need to alter (probably) // 7. Choose the correct state //Already implemented in ML-file. No need to alter (probably) } }
int main(void) { u8 len=0; u8 temp[100]; u8 t=0; u8 flag=0; char mode='O'; long value=0; u8 counter=0; //char val2str[]="50"; char SelfCheck='O'; int D_val=0; u8 SelfCheckCounter=0; /////////////////////以上变量定义/////////////////////////// delay_init(72); USART1_Init(19200);//与地面站传递命令 USART2_Init(115200);//与X86板子传递命令 USART3_Init(115200);//调试用 HCSR04_Init(); ResetOLED(); OLED_Init(); Key_Init(); ///////////////以上初始化/////////////////////// OLED_ShowString(35,20,"READY",24); OLED_Refresh_Gram(); delay_ms(1000); OLED_Clear(); /////////////////////////////欢迎界面,提示准备工作///////////////////////////////// while(KEY==1) { OLED_ShowString(0,0,"Self checking now...",12); OLED_Refresh_Gram(); if(USART_RX2_STA&0x8000) { len=USART_RX2_STA&0x3fff;//得到此次接收到的数据长度 for(t=0;t<len;t++) { temp[t]=Rx2Buf[t]; while((USART2->SR&0X40)==0);//等待发送结束 } flag=1; USART_RX2_STA=0; }//接受来自X86的命令,用于自检。 if(flag==1) { SelfCheck=TempOrPressure(temp); { if(SelfCheck=='C') { value=ValueOfMea(temp); if(value==1) { OLED_ShowString(0,15,"Environment ok",12); SelfCheckCounter++; } if(value==2) { OLED_ShowString(0,30,"The data chain ok",12); } if(value==0) { OLED_ShowString(0,42,"Checking fail...",12); } } } memset(temp,0,sizeof(u8)*100); flag=0; }//先对开发环境进行自检,在VS下下发ok标志即可。 OLED_Refresh_Gram(); if(SelfCheckCounter==1)//如果已经通过了开发环境自检 { while(KEY==1)//不按强制退出就一直自检,直到成功 { if(DataChain_SelfTest()==1)//数据链自检完成 break; else continue; } SelfCheckCounter=0; break;//在不按按键强制退出的情况下,只有自检成功了才能退出。 } } OLED_Clear(); /////////////////////////以上对上位机的自检,按键强制结束////////////////// OLED_ShowString(0,0,"Parameters",16); OLED_ShowString(0,16,"X=",12); OLED_ShowString(0,28,"Y=",12); OLED_ShowString(0,40,"S=",12); OLED_ShowString(0,52,"D=",12); OLED_Refresh_Gram(); flag=0;//复位flag ///////////显示参数//////////////////////////////// //AutoLaunch(); ////////////////////////以上开始起飞///////////////////////////////// while(1) { if(USART_RX2_STA&0x8000) { len=USART_RX2_STA&0x3fff;//得到此次接收到的数据长度 for(t=0;t<len;t++) { temp[t]=Rx2Buf[t]; while((USART2->SR&0X40)==0);//等待发送结束 } flag=1; USART_RX2_STA=0; //printf3("%s\r\n",temp); }//接受来自X86的命令 if(flag==1) { mode=TempOrPressure(temp); if(mode=='S') { value=ValueOfMea(temp); { #ifdef __TRANSPARENT_MODE printf1("\"S\":\"%ld\"\r\n",value); #endif #ifdef __COMMAND_MODE E17_SendMsg(CMD_S_PARAM,value); #endif } OLED_ShowNum(20,40,value,6,12); // counter++; } if(mode=='X') { value=ValueOfMea(temp); { #ifdef __TRANSPARENT_MODE printf1("\"X\":\"%ld\"\r\n",value); #endif #ifdef __COMMAND_MODE E17_SendMsg(CMD_X_PARAM,value); #endif } OLED_ShowNum(20,16,value,6,12); // counter++; } else if(mode=='Y') { value=ValueOfMea(temp); { #ifdef __TRANSPARENT_MODE printf1("\"Y\":\"%ld\"\r\n",value); #endif #ifdef __COMMAND_MODE E17_SendMsg(CMD_Y_PARAM,value); #endif } OLED_ShowNum(20,28,value,6,12); // counter++; } { delay_ms(10);//太小在透传情况下可能出问题? { D_val=HCSR04_GetDistance_Filter(); #ifdef __TRANSPARENT_MODE printf1("\"D\":\"%ld\"\r\n",D_val); #endif #ifdef __COMMAND_MODE E17_SendMsg(CMD_D_PARAM,value); #endif } OLED_ShowNum(20,52,D_val,6,12); // counter=0; }//去掉了判断,每个周期都要做判断,同时进行距离的pid调控。 OLED_Refresh_Gram(); memset(temp,0,sizeof(u8)*100); flag=0; } } }