int main(void) { Stm32_Clock_Init(9); // u16 temp; NVIC_Configuration(); UART1_init(72,115200); delay_init(); //初始化串口1; pid_Init(); LED_Init(); EXTIX_Init(); Adc_Init(); Motor_Init(999,0); HC05_Init(); while(mpu_dmp_init()); // TIM5_Init(999,72); TIM2_Int_Init(999,72);//定时器3配置,1ms中断一次 while(1) { // CtrlAttiAng(); // PWM_test(); // COMMPC_TEST(); // Get_angle(); // u2_printf("hell"); test_SendPC();//测试向PC发送协议数据,用于调控 } }
int main(void) { u16 adcx; float temp; delay_init(); //延时函数初始化 uart_init(9600); //串口初始化为9600 LED_Init(); //初始化与LED连接的硬件接口 LCD_Init(); Adc_Init(); //ADC初始化 POINT_COLOR=RED;//设置字体为红色 LCD_ShowString(60,50,200,16,16,"Mini STM32"); LCD_ShowString(60,70,200,16,16,"ADC TEST"); LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(60,110,200,16,16,"2014/3/9"); //显示提示信息 POINT_COLOR=BLUE;//设置字体为蓝色 LCD_ShowString(60,130,200,16,16,"ADC_CH1_VAL:"); LCD_ShowString(60,150,200,16,16,"ADC_CH1_VOL:0.000V"); while(1) { adcx=Get_Adc_Average(ADC_Channel_1,10); LCD_ShowxNum(156,130,adcx,4,16,0);//显示ADC的值 temp=(float)adcx*(3.3/4096); adcx=temp; LCD_ShowxNum(156,150,adcx,1,16,0);//显示电压值 temp-=adcx; temp*=1000; LCD_ShowxNum(172,150,temp,3,16,0X80); LED0=!LED0; delay_ms(250); } }
void main(void) { _U08 u8Adc = 0; _U08 u8Val; _U16 u16Volts; ANCON0 = 0xff; ANCON1 = 0xff; Adc_Init(ADC_8BITS); Timers_Init(); /*inicializamos el driver para genere una interrupcion cada 5ms*/ _7segments_Init(); /*configuramos los pines como salidas*/ __ENABLE_INTERRUPTS(); /*se habilitan las interrupciones globales con prioridad*/ while (1) { if(Timers_u16GetTime(0) == 0)/*preguntamos si la interrupcion decrmento hasta llegar a 0 el canal 0*/ { Timers_SetTime(0, 5/timers_ms);/*se cumplen los 5ms asi que volvemos a recargar el mismo canal */ _7segments_Task(); /*actualiza el valor en el display y multiplexa al siguiente display*/ } if(Timers_u16GetTime(1) == 0)/*preguntamos si la interrupcion decrmento hasta llegar a 0 el canal 1*/ { Timers_SetTime(1, 100/timers_ms); /*se cumplen los 200ms asi que volvemos a recargar el mismo canal */ u8Adc = Adc_u16Read( 3 ); /*se lee el canal del adc*/ u16Volts = (_U16)u8Adc * (_U16)13; /*se trasnforma la lectura en milivolts*/ _7segments_SetNumber(u16Volts/10); /*actualizamos el display con el valor en volts*/ u8Val = _7segments_u8GetDisplay(2); /*se lee el tercer display*/ _7segments_SetDisplay(2, u8Val|0x80); /*se agrega el punto decimal*/ } } }
//fungsi utama int main (void) { //inisialisasi HAL (Hardware Abstraction Layer) halInit(); //inisialisasi kernel chSysInit(); Adc_Init(); process_running(); //inisialisasi CAN CAN_Config(); // serial sdStart(&SD2,NULL); palSetPadMode(GPIOB,3, PAL_MODE_ALTERNATE(7)); //TX palSetPadMode(GPIOB,4, PAL_MODE_ALTERNATE(7)); //RX sdStart(&SD1,NULL); palSetPadMode(GPIOA,9, PAL_MODE_ALTERNATE(7)); //TX palSetPadMode(GPIOA,10, PAL_MODE_ALTERNATE(7)); //RX sdStart(&SD3,NULL); palSetPadMode(GPIOB,10, PAL_MODE_ALTERNATE(7)); //TX palSetPadMode(GPIOE,15, PAL_MODE_ALTERNATE(7)); //RX //inisialisasi USB sduObjectInit(&SDU1); sduStart(&SDU1, &serusbcfg); //aktifasi USB usbDisconnectBus(serusbcfg.usbp); chThdSleepMilliseconds(200); usbStart(serusbcfg.usbp, &usbcfg); usbConnectBus(serusbcfg.usbp); //thread 1 chThdCreateStatic(waBacavolt, sizeof(waBacavolt), NORMALPRIO, Bacavolt, NULL); chThdCreateStatic(waBacacurrent, sizeof(waBacacurrent), NORMALPRIO, Bacacurrent, NULL); chThdCreateStatic(waThreadBMS, sizeof(waThreadBMS), NORMALPRIO, ThreadBMS, NULL); //chThdCreateStatic(waThreadkirimjoule, sizeof(waThreadkirimjoule), NORMALPRIO, Threadkirimjoule, NULL); //chThdCreateStatic(waThreadkirimjoule2, sizeof(waThreadkirimjoule2), NORMALPRIO, Threadkirimjoule2, NULL); while(TRUE) { kirim_data_usart1(); chprintf((BaseSequentialStream *)&SD1,"%d,%f,%d,%d,%f,%f,%d,%d,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%d,%d,%d,%d \n",avgtemp,packsoc,packDCL,packCCL,lowvoltcell,highvoltcell,hightemp,lowtemp,packcurrent,packvolt,amphours,supply12v, deltacellvolt,avgcellvolt,mppt1_v,mppt2_v,mppt3_v,mppt4_v,mppt5_v,mppt6_v,mppt7_v,mppt8_v,mppt9_v,mppt10_v,mppt11_v,mppt12_v,mppt13_v,mppt15_v,mppt16_v, mppt1_i, mppt2_i, mppt3_i, mppt4_i, mppt5_i, mppt6_i, mppt7_i,mppt8_i, mppt9_i, mppt10_i, mppt11_i, mppt12_i, mppt13_i, mppt14_i, mppt15_i,current1,current2,current3,voltage1,voltage2,voltage3,milidetik,detik,menit,jam); //chprintf((BaseSequentialStream *)&SDU1,"%d,%f,%d,%d,%f,%f,%d,%d,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f \n",avgtemp,packsoc,packDCL,packCCL,lowvoltcell,highvoltcell,hightemp,lowtemp,packcurrent,packvolt,amphours,supply12v, deltacellvolt,avgcellvolt,mppt1_v,mppt2_v,mppt3_v,mppt4_v,mppt5_v,mppt6_v,mppt7_v,mppt8_v,mppt9_v,mppt10_v,mppt11_v,mppt12_v,mppt13_v,mppt15_v,mppt16_v, mppt1_i, mppt2_i, mppt3_i, mppt4_i, mppt5_i, mppt6_i, mppt7_i,mppt8_i, mppt9_i, mppt10_i, mppt11_i, mppt12_i, mppt13_i, mppt14_i, mppt15_i); //chprintf((BaseSequentialStream *)&SDU1,"%x %x %x %x %x %x %x %x \n",RxMessage33.StdId, RxMessage44.StdId, RxMessage55.StdId, RxMessage66.StdId, RxMessage77.StdId, RxMessage88.StdId, RxMessage99.StdId, RxMessage11.StdId); //chprintf((BaseSequentialStream *)&SD1,"tes \n"); chThdSleepMilliseconds(500); } return 0 ; }
/***************************************************************************** 函 数 名: AirCondition_Init 功能说明: 空调外部条件初始化 参 数: 无 返 回 值: 无 *****************************************************************************/ void AirCondition_Init(void) { Adc_Init(); GPIOx_Cfg(GPIO_A, pin_0, IN_); //配置PA0管脚模拟输入 GetRT_Tab(); //add zyh 2015.04.27 gAirCondition.timer = 0; //空调定时默认关 Thread_Login(FOREVER, 0, 50, AirCondition_Temp); //后台实时更新当前环境温度 }
int main(void) { SystemClock_HSI(9); //系统时钟设置,9倍频,36M LedInit(); //LED 初始化 Adc_Init(); //摇杆AD初始化 NRF24L01_Init(); //无线模块初始化 TX_Mode(); //发送模式 TIM4_Init(); //定时器初始化,定时周期为1ms,1ms发送一次摇杆AD值 KeyInit(); //按键初始化 TxBuf[30]=0xA5; //对应遥控器,该位写0xA5,保证飞机能在开机的时候能收到一个完整的32字节的数据包 GetAD(R_Mode); /*******************************************************/ //以下为遥控解锁段 /*******************************************************/ while((Throttle>5)||(Roll>5))//解锁条件:油门拉到最低,方向打到最左解锁 { GetAD(R_Mode);//得到各路AD值并显示 } TxBuf[28]=0; //对应遥控器,该字节写0,使飞机跳过写参数那一步 TxBuf[27]=0xA5;//解锁飞机 TxBuf[31]=0xA5;//解锁成功,使能飞控 /*******************************************************/ //解锁完成 /*******************************************************/ Led1=1; Led2=1; Led3=1; Led4=1; Led5=0; while(1) { GetAD(R_Mode); //得到各路AD值并显示 if(Key1==0){TxBuf[10]=0xA5;Led1=1; }//按键子程序,用于设置一键操作,如一键翻滚,一键返航等 else {TxBuf[10]=0;Led1=0;} } }
void EcuM_Callout_DriverInitListOne(void) { Det_Init(); Dem_PreInit(); Mcu_Init(&McuModuleConfiguration_0); Mcu_AdditionalInit(); Mcl_Init(NULL_PTR); Port_Init(NULL_PTR); Adc_Init(NULL_PTR); Dio_Init(NULL_PTR); Gpt_Init(NULL_PTR); Pwm_Init(NULL_PTR); Icu_Init(NULL_PTR); Spi_Init(NULL_PTR); SpiCtrl_Init(); SwGpt_Init(); pIcomInstBle = ICOM_Create(); ICOMChannelStatus_Init(pIcomInstBle); ICOMChannelDiag_Init(pIcomInstBle); ExtFlashSpiCtrlInit(SpiConf_SpiChannel_Spi_NVM_Command,\ SpiConf_SpiSequence_Spi_Seq_NVM,\ SpiConf_SpiJob_Spi_Job_NVM); CC254xCDD_Init(pIcomInstBle, DioConf_DioChannel_B6_SPI_SRDY_CU_LPCPU,\ SpiConf_SpiChannel_Spi_TICC2540_Command_8,\ SpiConf_SpiSequence_Spi_Seq_Ble_Exchange); /* ******************************************************************* * Wdg must be the latest in the initialization sequence * otherwise the function call Spi_SetAsyncMode(SPI_INTERRUPT_MODE) * returns a negative response when initializing the CC254xCDD_Init *********************************************************************/ Wdg_Init(NULL_PTR); WdgM_Init(NULL_PTR); WdgM_SetMode(1U,0U); }
int main(void) { u16 adcx; float temp; SystemInit(); delay_init(72); //延时初始化 NVIC_Configuration(); uart_init(9600); LED_Init(); KEY_Init(); LCD_Init(); Adc_Init(); POINT_COLOR=RED;//设置字体为红色 LCD_ShowString(60,50,"Mini STM32"); LCD_ShowString(60,70,"ADC TEST"); LCD_ShowString(60,90,"ATOM@ALIENTEK"); LCD_ShowString(60,110,"2010/12/30"); //显示提示信息 POINT_COLOR=BLUE;//设置字体为蓝色 LCD_ShowString(60,130,"ADC_CH0_VAL:"); LCD_ShowString(60,150,"ADC_CH0_VOL:0.000V"); while(1) { adcx=Get_Adc(ADC_Channel_0); LCD_ShowNum(156,130,adcx,4,16);//显示ADC的值 temp=(float)adcx*(3.3/4096); adcx=temp; LCD_ShowNum(156,150,adcx,1,16);//显示电压值 temp-=adcx; temp*=1000; LCD_ShowNum(172,150,temp,3,16); LED0=!LED0; delay_ms(250); } }
static void SetupHardware( void ) { u8 buf[32]; #if 0//debug by karlno u8 *ptr1,*ptr2,*ptr3,*ptr4; #endif GPIO_Config();//针对gpio的一些配置 NVIC_Config();//针对中断向量的一些配置 EXTI_Config();//外部中断配置 #if 0//debug by karlno Debug("#### 123\n\r"); ptr1=Q_Mallco(200); ptr2=Q_Mallco(68); Q_Free(ptr1); ptr3=Q_Mallco(68); ptr3=Q_Mallco(68); while(1); #endif Debug("\n\n\n\r************************************\n\r"); Debug("* Q-SYS %s *\n\r",QSYS_VERSION); Debug("* Start up our dreams! *\n\r"); #if OS_USE_FREERTOS Debug("* Base on FreeRTOS *\n\r"); #elif OS_USE_UCOS Debug("* Base on uC/OS *\n\r"); #endif Debug("* Hardware PID : %d %d *\n\r",QXW_PRODUCT_ID,QXW_LCM_ID); Debug("* Hardware ID : %X *\n\r",GetHwID()); Debug("* Www.Q-ShareWe.Com *\n\r"); Debug("************************************\n\r\n\r"); M25P16_Init();//spi flash M25P16_Read_Id(buf); Debug("SPI Flash ID:\n\r"); DisplayBuf(buf,20,8); Debug("\n\r"); SPI_Touch_Init();//触摸屏 VsInit();//Vs1003的配置 //sd卡文件系统初始化 if(disk_initialize(0)) { Debug("Disk Initialize error!\n\r"); } else { Debug("Disk Initialize OK!\n\r"); #if 0//debug { FIL fsrc; // file objects FRESULT res; // FatFs function common result code UINT br; u8 *p=Q_Mallco(1024); u32 time=QW_GetNowTimeMs(); res = f_mount(0,&FS); // 初始化分区结构,它不初始化SD卡 if(res == FR_OK) { Debug("\n\nATA mounrt OK, fs_type = %d\n\r",FS.fs_type); } else { Debug("\nATA mounrt Error!!!\n%d\n\r",res); } res = f_open(&fsrc,"1.rar",FA_READ) ; Debug("Open %d\n\r",res); while(1) { res = f_read(&fsrc,p,fsrc.fsize,&br); // 读文件数据,长度file.fsize, if(br==0)break; } f_close(&fsrc); Debug("Time Gap:%d\n\r",QW_GetNowTimeMs()-time); while(1); } #endif FS_Init(); Debug("File system mount OK!\n\r"); Q_DB_SetStatus(Status_FsInitFinish,TRUE,NULL,0); } Adc_Init(); Tim2_Init();//用户定时器 Tim3_Init();//背光pwm初始化 Tim4_Init();//用户定时器 Tim5_Init();//用户定时器 USB_SetHw(); USB_Init(); }
void EcuM_AL_DriverInitOne(const EcuM_ConfigType* configPtr) { /* provide a proper clock */ Mcu_Init(configPtr->bsw_driver.init_one.mcu_cfg); Mcu_InitClock(0); Mcu_DistributePllClock(); /* ----------------------------------------------------------------------- Interrupt System: ----------------------------------------------------------------------- - four arbitration cycles (max. 255 interrupt sources) - two clocks per arbitration cycle */ __mtcr(0xFE2C, 0x00000000); /* load CPU interrupt control register */ __isync(); /* ----------------------------------------------------------------------- Peripheral Control Processor (PCP): ----------------------------------------------------------------------- - the PCP internal clock is always running - use Full Context save area (R[0] - R[7]) - start progam counter as left by last invocation - channel watchdog is disabled - maximum channel number checking is disabled */ /* - four arbitration cycles (max. 255 PCP channels) */ /* - two clocks per arbitration cycle */ PCP_ICR.U = 0x00000000; /* load PCP interrupt control register */ /* - the PCP warning mechanism is disabled */ PCP_ITR.U = 0x00000000; /* load PCP interrupt threshold register */ /* - type of service of PCP node 4 is CPU interrupt */ PCP_SRC4.U = 0x00001000; /* load service request control register 4 */ /* - type of service of PCP node 5 is CPU interrupt */ PCP_SRC5.U = 0x00001000; /* load service request control register 5 */ /* - type of service of PCP node 6 is CPU interrupt */ PCP_SRC6.U = 0x00001000; /* load service request control register 6 */ /* - type of service of PCP node 7 is CPU interrupt */ PCP_SRC7.U = 0x00001000; /* load service request control register 7 */ /* - type of service of PCP node 8 is CPU interrupt */ PCP_SRC8.U = 0x00001000; /* load service request control register 8 */ ts_initGPTAInt(); Port_Init(configPtr->bsw_driver.init_one.port_cfg); Adc_Init(configPtr->bsw_driver.init_one.adc_cfg); Fls_Init(configPtr->bsw_driver.init_one.fls_cfg); Gpt_Init(configPtr->bsw_driver.init_one.gpt_cfg); Pwm_Init(configPtr->bsw_driver.init_one.pwm_cfg); Spi_Init(configPtr->bsw_driver.init_one.spi_cfg); Wdg_Init(configPtr->bsw_driver.init_one.wdg_cfg); #ifdef ECUM_WDGM_INCLUDED WdgM_Init(configPtr->bsw_driver.init_one.wdgm_cfg); #endif /* setup end of init protected registers for OS */ ts_endinit_clear(); osInitProtected(); ts_endinit_set(); /* Overlay Ram: * Init registers and mem areas for switching from * working page (overlay ram) <-> reference page (flash) */ RAM_OverlayRamReset(); /* - the CPU interrupt system is globally disabled */ __enable(); Spi_SetAsyncMode(SPI_INTERRUPT_MODE); Adc_StartGroupConversion(0); Adc_StartGroupConversion(1); EcuM_SelectApplicationMode(OSDEFAULTAPPMODE); }
/* * 函数名:main * 描述 :主函数 * 输入 :无 * 输出 :无 */ int main(void) { uint32_t i, u32RxLen; u16 led0pwmval1=59999; u16 led0pwmval2=59999; u16 led0pwmval3=59999; u16 led0pwmval4=59999; u16 adcx; float temp; double x1,y1,x2,y2,fai; u8 LAT1,LNG1;//定义两个指针指向存放经纬度的内存地址 u8 processok=0;//所有数据每20ms处理一次 double lat,lng; double speed2; // double seitatest=0; static u8 heartbeat=0; const u8 at[] = {"receiveok"}; u8 reply[6]={0x01,0x04,0x01}; u8 gpsdata[100]={0};//存放待处理的GPS数组 u8 reply1[3];//准备存放回应的数据 u8 reply2[3];//存放左右倾角,滚转角 u8 reply3[3];//存放前后倾角,俯仰角 u8 package1[10];//存放纬度 u8 package2[10];//存放经度 u8 package3[10];//存放方位角 u8 package4[10];//存放滚转角 u8 package5[10];//存放前后倾角 u8 package6[4];//存放速度 u8 package7[4];//存放剩余电量 uint8_t source=0x01;//源地址 uint8_t destination=0x02;//目的地址 tsPacketOfAppInfo truesendout;//给这个类型定义一个名字 uint8_t len=61; // u8 gpgga[]={"$GPGGA,061021.05,3102.02726033,N,12126.86794498,E,2,12,0.9,25.022,M,8.127,M,1.0,0000*46\r\n"}; uint8_t sendbuff[]="receiveok"; u32RxLen=sizeof(at); ptuoqiu->latitude=&latitude3; ptuoqiu->longitude=&longitude3; gaosi->gaosix =&gaosix3; gaosi->gaosiy =&gaosiy3; gaosi->gaosix1 =&gaosix4; gaosi->gaosiy1 =&gaosiy4; DK_NVIC_Init(4); SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//设置systick的时钟是AHB不分频的 SysTick_Config(7200000);//设置两次中断的时间间隔为100ms /* USART1,2,3 ,UART4 config 115200 8-N-1 */ USART1_Config(); USART2_Config(); USART3_Config(); UART4_Config(); Usart_DMA_Config(); LED_GPIO_Config(); delay_ms(1000); PWM_Initch1(60000,0); //不分频。PWM频率=72000000/60000=1.2Khz PWM_Initch2(60000,0); PWM_Initch3(60000,0); PWM_Initch4(60000,0); TIM3->CR1|=0x01; //使能定时器3 LED0_PWM_VAL1=led0pwmval1; LED0_PWM_VAL2=led0pwmval2; LED0_PWM_VAL3=led0pwmval3; LED0_PWM_VAL4=led0pwmval4; //这个是测试用的数据 /*填充将要发送的数据*/ // for (i = 0; i < sizeof(at); i++) // { // SendBuff[i] = at[i]; // } // USART_SEND(SendBuff, sizeof(at)-1); // delay_ms(1000); /*填充将要发送的数据*/ // for (i = 0; i < SENDBUFF_SIZE; i++) // { // SendBuff[i] = 0x31; // } // USART_SEND(SendBuff, 30); // //测试数据结束 // /*串口向 DMA发出请求 */ // USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE); /*在DMA尚未传送完成时,cpu继续执行main函数中的代码*/ /*点亮了LED灯*/ /*而同时DMA在向串口运送数据,当DMA发送完成时,在中断函数关闭LED灯 */ Adc_Init();//ADC转换是分频为12MHz //order_sendinit(); while(1) { // gpggaresolve(gpgga); //Usart1_Send(command1, sizeof(comd1)); //delay_ms(500); // static u8 pathen=0; if (sUsart2_entity.u8RxFlag == 1) {//如果收到罗盘返回的数据 sUsart2_entity.u8RxFlag = 0; u32RxLen = sUsart2_entity.u16RxTotalNum; sUsart2_entity.u16RxTotalNum = 0; processok=1;//50ms到,可以开始处理数据 if(sUsart2_entity.u8RX_Buffer[1]==0x0d)//如果传回的数据是角度 { for(i=0;i<3;i++) { reply1[i]=sUsart2_entity.u8RX_Buffer[10+i];//取出方向角 reply2[i]=sUsart2_entity.u8RX_Buffer[4+i];//取出左右倾角,滚转角 reply3[i]=sUsart2_entity.u8RX_Buffer[7+i];//取出前后倾角,俯仰角 } } memset(sUsart2_entity.u8RX_Buffer,0,15); } if(sUsart3_entity.u8RxFlag==1) {//如果收到GPS传回的数据 sUsart3_entity.u8RxFlag = 0; u32RxLen = sUsart3_entity.u16RxTotalNum; sUsart3_entity.u16RxTotalNum = 0; // processok=1;//20ms到,可以开始处理数据 for(i=0;i<sizeof(sUsart3_entity.u8RX_Buffer);i++) { sUsart3_entity.u8RX_Buffer[i]=gpsdata[i]; } memset(sUsart3_entity.u8RX_Buffer,0,150); // gpggaresolve(sUsart3_entity.u8RX_Buffer); } if (sUart4_entity.u8RxFlag == 1) {//如果收到指令 sUart4_entity.u8RxFlag = 0; u32RxLen = sUart4_entity.u16RxTotalNum; sUart4_entity.u16RxTotalNum = 0; } if(speeden==1)//如果2秒到了的话,测速一次,检测剩余电量一次 { speeden=0; heartbeat++; memset(package6,0,4);//速度和电量的数组先清掉再赋新的值 memset(package7,0,4); speed2=getspeed((*(gaosi->gaosix1)),(*(gaosi->gaosiy1)));//1秒测速一次 // speed2=10.6; // seita=getheading(0.5,-1,1,-2);//检测方位角函数是否正常 // gettoorbit(200,330);//检测大调整函数 // changedirections(1,4,0.5,-1,1,-2);//检测微调是否正常 if(heartbeat==7)//每隔14s检测一次心跳是否正常 { heartbeat=0; hearttest();//检测心跳是否正常函数 } // (*(gaosi->gaosix1))+=0.05; // (*(gaosi->gaosiy1))+=0.05;//测试速度 // if((*(gaosi->gaosix1))>=5) // *(gaosi->gaosix1)=0; // if((*(gaosi->gaosiy1))>=5) // *(gaosi->gaosiy1)=0; // GaussProjCal(*(ptuoqiu->longitude),*(ptuoqiu->latitude),gaosi->gaosix,gaosi->gaosiy); // speed2=getspeed((*(gaosi->gaosix1)),(*(gaosi->gaosiy1)));//1秒测速一次 sprintf(package6,"%4.1f",speed2); for(i=50;i<=53;i++) { package[i]=package6[i-50];//速度数组赋值,准备打包 } temp=powadc();//1秒转换电压一次 sprintf(package7,"%4.1lf",temp); for (i=54;i<=57;i++) { package[i]=package7[i-54];//将电压值赋值到数组的后面 } } if(processok==1)//如果50ms到了的话,那么所有数据进行处理 { memset(package1,0,10);//数据域经纬度,方位角,前后倾角,左右滚转角数组清零 memset(package2,0,10); memset(package3,0,10); memset(package4,0,10); memset(package5,0,10); // memset(package6,0,4);//速度和电量的数组先清掉再赋新的值 // memset(package7,0,4); processok=0;//清零50ms标记 head2=hextodex(reply1);//将角度转换为十进制 roll2=rolltodec(reply2); pitch2=pitchtodec(reply3); gpggaresolve(sUsart3_entity.u8RX_Buffer,&LAT1,&LNG1);//处理GPS的数据 lat=longtodouble(ptuoqiu->LAT); lng=longtodouble(ptuoqiu->LNG); changeformat(lng,lat,ptuoqiu->latitude,ptuoqiu->longitude);//将GPS数据解析成经纬度 order();//判断串口4是否接收到什么指令了 if((pathok==1)&&(heartok==1))//如果允许路径转换的话 { move();//路径转换,大约耗时4ms左右 } sprintf(package1,"%10.6lf",*(ptuoqiu->latitude)); sprintf(package2,"%10.6lf",*(ptuoqiu->longitude)); sprintf(package3,"%10.6lf",head2); sprintf(package4,"%10.6lf",roll2); sprintf(package5,"%10.6lf",pitch2); // GaussProjCal(*(ptuoqiu->longitude),*(ptuoqiu->latitude),gaosi->gaosix,gaosi->gaosiy);//将小车当前的坐标转换为平面坐标 for(i=0;i<=9;i++)//纬度赋值到数据域 { package[i]=package1[i]; } for(i=10;i<=19;i++)//经度赋值到数据域 { package[i]=package2[i-10]; } for(i=20;i<=29;i++)//将方位角赋值到数据域中 { package[i]=package3[i-20]; } for(i=30;i<=39;i++)//将左右倾角赋值到数据域中 { package[i]=package4[i-30]; } for(i=40;i<=49;i++)//将前后倾角赋值到数据域中 { package[i]=package5[i-40]; } memset(sUart4_entity.u8RX_Buffer,0,150); count=SendData_thisprotocol(truesendout,source,destination,len);//所有要打包的数据准备到一个数组里 //返回打包后的数据个数,函数很好,但是用于VB非常麻烦,太麻烦了简直,所以不用了,解析的时候实在是崩溃了 head2=0; roll2=0; pitch2=0; memset(reply1,0,10);//三个角度数组都清零 memset(reply2,0,10); memset(reply3,0,10); // memset(package1,0,10); // memset(package2,0,10); // memset(package3,0,10); // memset(package4,0,10); // memset(package5,0,10); // memset(package6,0,4); // memset(package7,0,4); } } }
int main(void) { u8 Data_PC[SIZE]; //从Flash中读取数据到Data_PC,并上传至上位机 u16 a,b=0; delay_init(); //延时函数初始化 NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(9600); //串口初始化为9600 LED_Init(); //LED端口初始化 LCD_Init(); KEY_Init(); WORD_Init(); TIM2_Int_Init(999,7199); TIM3_Int_Init(9,7199); EXTIX_Init(); //外部中断初始化 Adc_Init(); //ADC初始化 SPI_Flash_Init(); //SPI FLASH 初始化 while(1) { //功能:开机状态显示 //说明:1.开机,绿灯亮(DS1) // 2.使用temp是为了避免重复执行该if语句 if(flag2==1&&temp==0) { while(SPI_Flash_ReadID()!=W25Q64) //检测不到W25Q64 { LCD_ShowString(40,150,200,16,16,"W25Q64 Check Failed!"); delay_ms(500); LCD_ShowString(40,150,200,16,16,"Please Check! "); delay_ms(500); LED0=!LED0;//DS0闪烁 } LCD_ShowString(60,130,200,16,16,"W25Q64 Ready!"); LED1=0; temp=1; } //功能:数据采集并保存至Flash中 //说明:1.使用temp1是为了避免重复使能TIM3 // 2.使用temp2是为了避免在数据上传至上位机的过程中,与终止上传功能相冲突 // 3.flag1=1代表按键按下,并开始采集 // 4.flag2=1代表开机,flag2=0代表未开机 // 5.采集过程中,红灯(DS0)以一定频率闪烁 if(flag2==1&&temp2==0&&flag1==1) { if(temp1==0) { LCD_ShowString(20,150,200,16,16,"Data collection began..."); TIM_Cmd(TIM3, ENABLE); //使能TIM3中断 LED0=0; } temp1=1; if(flag_cycle==0&&flag_cycle_1==0) { SPI_Flash_Write((u8*)TEXT_Buffer2,FLASH_SIZE+counter*SIZE,SIZE); counter++; flag_cycle_1=1; } if(flag_cycle==1&&flag_cycle_1==0) { SPI_Flash_Write((u8*)TEXT_Buffer1,FLASH_SIZE+counter*SIZE,SIZE); counter++; flag_cycle_1=1; } } //功能:将Flash中采集到的数据上传至上位机 //说明:1.使用temp1是为了保证上传是在采集之后进行 // 2.使用temp3是为了避免由于按键误操作使得该程序重复被执行 // 3.flag1=0代表按键再次被按下,上传开始 ;若再次被按下,则上传被终止;之后再按就没有作用了 // 4.上传过程中,红灯(DS0)以一定频率闪烁 if(temp1==1&&temp3==0&&flag1==0) { TIM_Cmd(TIM3, DISABLE); //失能TIM3中断 //用于解决当采集时间不是42ms的倍数时,部分采集数据未写入FLash的问题 if((time_collect-1)%42!=0) { data_residue=(time_collect-1)%42*6; if(flag_cycle==0) { SPI_Flash_Write((u8*)TEXT_Buffer2,FLASH_SIZE+(counter+1)*SIZE,SIZE); } if(flag_cycle==1) { SPI_Flash_Write((u8*)TEXT_Buffer1,FLASH_SIZE+(counter+1)*SIZE,SIZE); } } LCD_ShowString(20,170,200,16,16,"Data collection complete!"); LCD_ShowString(20,190,200,16,16,"Data is being uploaded..."); temp2=1; for(a=1;a<counter;a++) { LED0=!LED0; SPI_Flash_Read(Data_PC,FLASH_SIZE+a*SIZE,SIZE); for(b=0;b<SIZE;b++) { if(flag1==1) //上传中途使用按键停止传送 { break; } USART_GetFlagStatus(USART1, USART_FLAG_TC); USART_SendData(USART1,Data_PC[b]); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); } if(flag1==1) //上传中途使用按键停止传送 { LCD_ShowString(20,210,200,16,16,"Data upload is terminated!"); break; } } //用于解决当采集时间不是42ms的倍数时,部分采集数据未写入FLash的问题 if(flag1!=1&&(time_collect-1)%42!=0) { LED0=!LED0; SPI_Flash_Read(Data_PC,FLASH_SIZE+(a+1)*SIZE,SIZE); for(b=0;b<data_residue;b++) { if(flag1==1) //上传中途使用按键停止传送 { break; } USART_GetFlagStatus(USART1, USART_FLAG_TC); USART_SendData(USART1,Data_PC[b]); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); } if(flag1==1) //上传中途使用按键停止传送 { LCD_ShowString(20,210,200,16,16,"Data upload is terminated!"); break; } } if(flag1!=1) //要么显示数据上传完成,要么显示数据上传完成 { LCD_ShowString(20,210,200,16,16,"Data upload is completed!"); } temp3=1; } //功能:关机并擦除Flash //说明:1.flag2=0代表关机,与上temp1,temp2是要保证前面的已被执行 // 2.关机过程中擦除Flash,完成之后红绿灯同时亮一秒后灭 if(temp1==1&&temp2==1&&flag2==0) //关机机状态显示 { flag1=0; flag2=0; temp1=0; temp2=0; LED0=1; LED1=1; SPI_Flash_Erase_Chip(); LED0=0; LED1=0; delay_ms(1000); LED0=1; LED1=1; LCD_ShowString(80,230,200,16,16,"Shutdown!"); } } }
int main(void) { // u8 key; // u16 i=0; u16 adc_91000,adc_91200,reg_read_data=0,reg_write_data=0; float LMP91000_VOUT,LMP91200_VOUT,Temp_Integer,Temp_Decimal; short temp; u8 read_val[5] = {0xff}; u8 status = TI_LMP91000_NOT_READY; SystemInit(); delay_init(72); //延时初始化 NVIC_Configuration(); uart_init(9600); LED_Init(); KEY_Init(); Adc_Init(); IIC_Init(); //IIC初始化 LMP91200_Init(); //初始化PH delay_ms(500); printf("\nHello XXL"); /************************************************************ * 溶氧电极初始化及数据采集 ************************************************************/ LMP91000_ENABLE(); // enable LM while (status == TI_LMP91000_NOT_READY) // wait while device is not ready status = LMP91000_ReadOneByte(TI_LMP91000_STATUS_REG); // Read device ready status read_val[0] = LMP91000_ReadOneByte(TI_LMP91000_LOCK_REG); // Read from lock register default value 0x01 read_val[1] = LMP91000_ReadOneByte(TI_LMP91000_TIACN_REG); // Read TIA control register default value 0x03 read_val[2] = LMP91000_ReadOneByte(TI_LMP91000_REFCN_REG); // Read Reference control register default value 0x20 read_val[3] = LMP91000_ReadOneByte(TI_LMP91000_MODECN_REG); // Read Mode control register default value 0x00 LMP91000_WriteOneByte(TI_LMP91000_LOCK_REG, TI_LMP91000_WRITE_UNLOCK); // unlock the registers for write LMP91000_WriteOneByte(TI_LMP91000_TIACN_REG, TIACN_NEW_VALUE); // Modify TIA control register LMP91000_WriteOneByte(TI_LMP91000_REFCN_REG, REFCN_NEW_VALUE); // Modify REF control register LMP91000_WriteOneByte(TI_LMP91000_MODECN_REG, MODECN_NEW_VALUE); // Modify MODE control register read_val[1] = LMP91000_ReadOneByte(TI_LMP91000_TIACN_REG); // Read to confirm register is modified read_val[2] = LMP91000_ReadOneByte(TI_LMP91000_REFCN_REG); // Read to confirm register is modified read_val[3] = LMP91000_ReadOneByte(TI_LMP91000_MODECN_REG); // Read to confirm register is modified read_val[4] = LMP91000_ReadOneByte(TI_LMP91000_STATUS_REG); // test if write/read values match if (read_val[1] == TIACN_NEW_VALUE) { // while (1) // no error: blink LED continuously // { delay_ms(500); LED1=!LED1;//绿灯闪烁 // } } else { delay_ms(500); LED0=!LED0;//红灯闪烁 // error } // 获取LMP91000输出电压 // while(1) // { adc_91000=Get_Adc(ADC_Channel_8); LMP91000_VOUT=(float)adc_91000*(3.3/4096); LMP91000_VOUT=LMP91000_VOUT; printf("\n\nDO=%fv ",LMP91000_VOUT); temp=DS18B20_Get_Temp(); if(temp<0) { temp=-temp; } Temp_Integer=temp/10; Temp_Integer=Temp_Integer; //整数 Temp_Decimal=temp%10; Temp_Decimal=Temp_Decimal; //小数 printf(" Temp=%f.%fc " __TIME__ "",Temp_Integer,Temp_Decimal); delay_ms(1000); // } LMP91000_WriteOneByte(TI_LMP91000_LOCK_REG, TI_LMP91000_WRITE_LOCK); // lock the registers LMP91000_DISABLE(); /************************************************************ * PH电极初始化及数据采集,无论在空气,碱水,酸水中vout总是1.420~1.429,可能电极坏掉 ************************************************************/ Clr_LMP91200_CSN; reg_write_data = TI_LMP91200_CONFIG_REG_TEST_VALUE; // value to write reg_read_data = SPIx_ReadWriteByte(reg_write_data); // Write to config register, read old value reg_read_data = SPIx_ReadWriteByte(reg_write_data); // Write again to read previous update reg_read_data = SPIx_ReadWriteByte(reg_write_data); // Write again to read previous update,if not read this time,bit-15 will be wrong // Set_LMP91200_CSN; while(1) // test if write/read values match { if (reg_write_data == reg_read_data) { adc_91200=Get_Adc(ADC_Channel_9); LMP91200_VOUT=(float)adc_91200*(3.3/4096); LMP91200_VOUT=LMP91200_VOUT; LED1=!LED1; //正确则绿灯亮 delay_ms(500); } else { LED0=!LED0; //错误则黄灯亮 delay_ms(300); } } /************************************************************ * 温度传感器初始化及数据采集 ************************************************************/ while(DS18B20_Init())//初始化DS18B20,兼检测18B20 { delay_ms(600); // error_report();//DS18B20 未连接 } while(1) { temp=DS18B20_Get_Temp(); if(temp<0) { temp=-temp; } Temp_Integer=temp/10; Temp_Integer=Temp_Integer; //整数 Temp_Decimal=temp%10; Temp_Decimal=Temp_Decimal; //小数 delay_ms(500); LED1=!LED1;//DS1闪烁 } /************************************************************ * 按键扫描 ************************************************************/ #if 0 while(1) { key=KEY_Scan(); if(key==1)//KEY0按下,写入24C02 { ; } if(key==3)//KEY_UP按下,读取字符串并显示 { ; } i++; delay_ms(10); } #endif }
/**************************************************************/ //程 序 名: main() //开 发 者: MingH //入口参数: 无 //功能说明: 主函数 //**************************************************************/ int main(void) { unsigned char err_code; RCC_Config(); // 时钟初始化配置 Beep_Init(); // 蜂鸣器初始化配置 Touch_Init(); Pcie_Gpio_Init(); Tim3_Init(); RGB_Init(); //RGB 初始化 RCC_GetClocksFreq(&RCC_ClockFreq); SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); USB2Serial_Init(); // 串口初始化配置 Pwm_Init(); Adc_Init(); I2C_GPIO_Configuration(); err_code = LIS3DH_Init(); if (NO_ERROR == err_code) { printf("\r\nLIS3DH Init is succeed! \r\n"); } else { printf("\r\nLIS3DH Init is failed! \r\n"); } RTC_Init(); // RTC 初始化配置 if(SD_Init() == SD_OK) { printf ("\r\n发现SD卡!\r\n"); } else { printf("\r\n没有发现 SD 卡设备! \r\n"); } printf("\r\n\r\n"); save_sd_detect = SD_Detect(); //初始化SD卡插入状态 SysTick_Delay_ms(500); TIM_Cmd(TIM1, DISABLE); TIM_CtrlPWMOutputs(TIM1, DISABLE); while (1) { if(read_sd_detect_flag){ if (save_sd_detect != SD_Detect()){ /* 蜂鸣器响 */ TIM_Cmd(TIM1, ENABLE); TIM_CtrlPWMOutputs(TIM1, ENABLE); sd_detect_change = 1; //SD卡插入状态有变 buzzer_delay = 0; if (SD_Detect() != SD_NOT_PRESENT){ if(SD_Init() == SD_OK) { printf ("\r\n发现SD卡!\r\n"); } else { printf("\r\n没有发现 SD 卡设备! \r\n"); } printf("\r\n\r\n"); } } save_sd_detect = SD_Detect(); read_sd_detect_flag = 0; } Time_Show(); Test_Pcie_Gpio(); Touch_Key_Proc(); if (read_lis3dh_flag){ Collect_Data(ACCdata); for (i=0; i<3; i++){ if (oldACCdata[i] < ACCdata[i]){ ACCdiff[i] = ACCdata[i] - oldACCdata[i]; } else{ ACCdiff[i] = oldACCdata[i] - ACCdata[i]; } } RGB_Control(ACCdiff[0]<<1, ACCdiff[1]<<1, ACCdiff[2]<<1); for (i=0; i<3; i++){ oldACCdata[i] = ACCdata[i]; } read_lis3dh_flag = 0; } if (one_second_flag){ printf("X=%d, Y=%d, Z=%d\r\n\r\n", ACCdata[1], ACCdata[0], ACCdata[2]); Adc_Proc(); one_second_flag = 0; } } }
/** ****************************************************************************** ** \brief ADC0 initialization and single conversion start ******************************************************************************/ void Main_adc_irq( void ) { stc_adcn_t *pstcAdc = (stc_adcn_t *)&ADC_UNIT; uint32_t u32SamplingCount = 0; stc_adc_config_t stcConfig; stc_adc_scan_t stcScanCfg; stc_adc_irq_en_t stcIrqEn; stc_adc_irq_cb_t stcIrqCallBack; // Clear structures PDL_ZERO_STRUCT(stcConfig); PDL_ZERO_STRUCT(stcScanCfg); PDL_ZERO_STRUCT(stcIrqEn); PDL_ZERO_STRUCT(stcIrqCallBack); // Scan conversion configuration stcScanCfg.u32ScanCannelSelect.u32AD_CHn = ADC_INPUT_CH; stcScanCfg.enScanMode = ScanSingleConversion; stcScanCfg.enScanTimerTrigger = AdcNoTimer; stcScanCfg.bScanTimerStartEnable = FALSE; stcScanCfg.u8ScanFifoDepth = ADC_INPUT_NUM - 1; // Initialize interrupt structures stcIrqCallBack.pfnScanIrqCb = Main_adc_result_callback; stcIrqEn.bScanIrq = TRUE; // ADC configuration // Conversion time = Sampling time + Compare time // The sampling time should comply with a certain range to guarantee the accuracy (Tmin < Ts < Tmax). // For the value of Tmin and Tmax (e.g. 10us), see the product datasheet for detail (12-bit A/D converter of Electrical Characteristics chapter) ///// For FM4 and FM0+, the calculation of sampling time and compare time is shown as following: // Sampling time = HCLK cycle * Frequency division ratio * {(ST set value + 1) * STX setting multiplier + 3} // At the following configuration: // Sampling time = 5ns * 5 * {(8+1)*8+3} = 1.875us (if HCLK = 200MHz) // Sampling time = 25ns * 5 * {(8+1)*8+3} = 9.375us (if HCLK = 40MHz) // Compare time = Compare clock cycle * 14 = Base clock (HCLK) cycle * Frequency division ratio * 14 // At following configuration: // Compare time = 5ns * 5 * 14 = 350ns (if HCLK = 200MHz) // Compare time = 25ns * 5 * 14 = 1750ns (if HCLK = 40MHz) ///// For FM3, the calculation of sampling time and compare time is shown as following: // Sampling time = HCLK cycle * {(ST set value + 1) * STX setting multiplier + 3} // At the following configuration: // Sampling time = 7ns * {(8+1)*8+3} = 0.52us (if HCLK = 144MHz) // Compare time = Compare clock cycle * 14 = Base clock (HCLK) cycle * Frequency division ratio * 14 // At following configuration: // Compare time = 7ns * 5 * 14 = 490ns (if HCLK = 144MHz) stcConfig.bLsbAlignment = TRUE; stcConfig.u32SamplingTimeSelect.u32AD_CHn = 0; stcConfig.enSamplingTimeN0 = Value8; // STX setting multiplier 0: 8 stcConfig.u8SamplingTime0 = 8u; // ST value 0 : 8 stcConfig.enSamplingTimeN1 = Value8; // STX setting multiplier 1: 8 stcConfig.u8SamplingTime1 = 8u; // ST value 1 : 8 stcConfig.u8ComparingClockDiv = 3u; // Frequency division ratio: 5, 0:Ratio 2, 1:Ratio 3, ... stcConfig.pstcScanInit = &stcScanCfg; stcConfig.pstcIrqEn = &stcIrqEn; stcConfig.pstcIrqCb = &stcIrqCallBack; stcConfig.bTouchNvic = TRUE; if (Ok == Adc_Init(pstcAdc, &stcConfig)) ///< Init ADC0 { // enable ADC Scan IRQ Adc_EnableWaitReady(pstcAdc); ///< Enable ADC0 and wait for ready } while (1) { if (u32SamplingCount++ >= SAMPLE_TIMES) { break; } Adc_SwTriggerScan(pstcAdc); ///< Trigger ADC0 while (FALSE == bADCFinished); bADCFinished = FALSE; } PrintAdcData(mu32SampleRecord, SAMPLE_COUNT); Adc_DeInit(pstcAdc, TRUE); }
/** * Part of STARTUP I * * @param ConfigPtr */ void EcuM_AL_DriverInitOne(const EcuM_ConfigType *ConfigPtr) { (void)ConfigPtr; // VALIDATE_STATE( ECUM_STATE_STARTUP_ONE ); //lint --e{715} PC-Lint (715) - ConfigPtr usage depends on configuration of modules #if defined(USE_MCU) Mcu_Init(ConfigPtr->McuConfig); /* Set up default clock (Mcu_InitClock requires initRun==1) */ /* Ignoring return value */ (void) Mcu_InitClock(ConfigPtr->McuConfig->McuDefaultClockSettings); // Wait for PLL to sync. while (Mcu_GetPllStatus() != MCU_PLL_LOCKED) { ; } Mcu_DistributePllClock(); #endif #if defined(USE_DEM) // Preinitialize DEM NO_DRIVER(Dem_PreInit(ConfigPtr->DemConfig)); #endif #if defined(USE_PORT) // Setup Port Port_Init(ConfigPtr->PortConfig); #endif #if defined(USE_GPT) // Setup the GPT Gpt_Init(ConfigPtr->GptConfig); #endif // Setup watchdog #if defined(USE_WDG) Wdg_Init(ConfigPtr->WdgConfig); #endif #if defined(USE_WDGM) NO_DRIVER(WdgM_Init(ConfigPtr->WdgMConfig)); #endif #if defined(USE_DMA) // Setup DMA Dma_Init(ConfigPtr->DmaConfig); #endif #if defined(USE_ADC) // Setup ADC Adc_Init(ConfigPtr->AdcConfig); #endif // Setup ICU // TODO // Setup PWM #if defined(USE_PWM) // Setup PWM Pwm_Init(ConfigPtr->PwmConfig); #endif #if defined(CFG_SHELL) SHELL_Init(); #endif }
/** ****************************************************************************** ** \brief ADC0 initialization and single conversion start ******************************************************************************/ void Main_adc_polling( void ) { stc_adcn_t *pstcAdc = (stc_adcn_t *)&ADC_UNIT; stc_adc_config_t stcConfig; stc_adc_scan_t stcScanCfg; uint32_t u32Data = 0; uint32_t u32AdcValue = 0; ///< Result value uint32_t u32AdcChannel = 0; ///< Result channel uint32_t u32AdcCause = 0; ///< Trigger cause uint32_t u32SamplingCount = 10; // Clear structures PDL_ZERO_STRUCT(stcConfig); PDL_ZERO_STRUCT(stcScanCfg); // Scan conversion configuration stcScanCfg.u32ScanCannelSelect.u32AD_CHn = ADC_INPUT_CH; stcScanCfg.enScanMode = ScanSingleConversion; stcScanCfg.enScanTimerTrigger = AdcNoTimer; stcScanCfg.bScanTimerStartEnable = FALSE; stcScanCfg.u8ScanFifoDepth = 0; // Common setting // Conversion time = Sampling time + Compare time // The sampling time should comply with a certain range to guarantee the accuracy (Tmin < Ts < Tmax). // For the value of Tmin and Tmax (e.g. 10us), see the product datasheet for detail (12-bit A/D converter of Electrical Characteristics chapter) ///// For FM4 and FM0+, the calculation of sampling time and compare time is shown as following: // Sampling time = HCLK cycle * Frequency division ratio * {(ST set value + 1) * STX setting multiplier + 3} // At the following configuration: // Sampling time = 5ns * 5 * {(8+1)*8+3} = 1.875us (if HCLK = 200MHz) // Sampling time = 25ns * 5 * {(8+1)*8+3} = 9.375us (if HCLK = 40MHz) // Compare time = Compare clock cycle * 14 = Base clock (HCLK) cycle * Frequency division ratio * 14 // At following configuration: // Compare time = 5ns * 5 * 14 = 350ns (if HCLK = 200MHz) // Compare time = 25ns * 5 * 14 = 1750ns (if HCLK = 40MHz) ///// For FM3, the calculation of sampling time and compare time is shown as following: // Sampling time = HCLK cycle * {(ST set value + 1) * STX setting multiplier + 3} // At the following configuration: // Sampling time = 7ns * {(8+1)*8+3} = 0.52us (if HCLK = 144MHz) // Compare time = Compare clock cycle * 14 = Base clock (HCLK) cycle * Frequency division ratio * 14 // At following configuration: // Compare time = 7ns * 5 * 14 = 490ns (if HCLK = 144MHz) stcConfig.bLsbAlignment = TRUE; stcConfig.u32SamplingTimeSelect.u32AD_CHn = 0; stcConfig.enSamplingTimeN0 = Value8; // STX setting multiplier 0: 8 stcConfig.u8SamplingTime0 = 8u; // ST value 0 : 8 stcConfig.enSamplingTimeN1 = Value8; // STX setting multiplier 1: 8 stcConfig.u8SamplingTime1 = 8u; // ST value 1 : 8 stcConfig.u8ComparingClockDiv = 3u; // Frequency division ratio: 5, 0:Ratio 2, 1:Ratio 3, ... stcConfig.pstcScanInit = &stcScanCfg; if (Ok == Adc_Init(pstcAdc, &stcConfig)) ///< Init ADC0 { Adc_EnableWaitReady(pstcAdc); ///< Enable ADC0 and wait for ready } // repeat sampling start. while (u32SamplingCount-- > 0) { Adc_SwTriggerScan(pstcAdc); ///< Trigger ADC0 while (1) { if (TRUE == Adc_GetIrqFlag(pstcAdc, AdcScanIrq)) { Adc_ClrIrqFlag(pstcAdc, AdcScanIrq); break; } } // resolve the FIFO data. u32Data = Adc_ReadScanFifo(pstcAdc); if (0xFFFFFFFF == u32Data || AdcFifoDataValid != Adc_GetScanDataValid(pstcAdc, u32Data)) { #ifdef DEBUG_PRINT printf("Invalid Record\n"); #endif } else { u32AdcChannel = Adc_GetScanChannel(pstcAdc, u32Data); u32AdcValue = Adc_GetScanData(pstcAdc, u32Data); u32AdcCause = Adc_GetScanDataCause(pstcAdc, u32Data); #ifdef DEBUG_PRINT printf("CH:%d,val:%d,R=%d\n", u32AdcChannel, u32AdcValue, u32AdcCause); #endif } } Adc_DeInit(pstcAdc, TRUE); return; }
/** * Part of STARTUP I * * @param ConfigPtr */ void EcuM_AL_DriverInitOne(const EcuM_ConfigType *ConfigPtr) { (void)ConfigPtr; #if defined(USE_MCU) Mcu_Init(ConfigPtr->McuConfig); /* Set up default clock (Mcu_InitClock requires initRun==1) */ /* Ignoring return value */ (void) Mcu_InitClock(ConfigPtr->McuConfig->McuDefaultClockSettings); // Wait for PLL to sync. while (Mcu_GetPllStatus() != MCU_PLL_LOCKED) { ; } Mcu_DistributePllClock(); #endif #if defined(USE_DEM) // Preinitialize DEM NO_DRIVER(Dem_PreInit(ConfigPtr->DemConfig)); #endif #if defined(USE_PORT) // Setup Port Port_Init(ConfigPtr->PortConfig); #endif #if defined(USE_DIO) // Setup Dio Dio_Init(ConfigPtr->DioCfg); #endif #if defined(USE_GPT) // Setup the GPT Gpt_Init(ConfigPtr->GptConfig); #endif // Setup watchdog #if defined(USE_WDG) Wdg_Init(ConfigPtr->WdgConfig); #endif #if defined(USE_WDGM) NO_DRIVER(WdgM_Init(ConfigPtr->WdgMConfig)); #endif #if defined(USE_DMA) // Setup DMA Dma_Init(ConfigPtr->DmaConfig); #endif #if defined(USE_ADC) // Setup ADC Adc_Init(ConfigPtr->AdcConfig); #endif #if defined(USE_BSWM) // Setup BSWM - not supporting configustructure for BswM BswM_Init(NULL); #endif // Setup ICU #if defined(USE_ICU) Icu_Init(ConfigPtr->IcuConfig); #endif // Setup PWM #if defined(USE_PWM) // Setup PWM Pwm_Init(ConfigPtr->PwmConfig); #endif // Setup OCU #if defined(USE_OCU) Ocu_Init(ConfigPtr->OcuConfig); #endif #if defined(CFG_SHELL) SHELL_Init(); #endif }
int main(void) { static char ledsta; /***********************************/ SystemClock_HSI(9); //系统时钟初始化,时钟源内部HSI cycleCounterInit(); // Init cycle counter SysTick_Config(SystemCoreClock / 1000); //SysTick开启系统tick定时器并初始化其中断,1ms UART1_init(SysClock,uart1baudSet); //串口1初始化 NVIC_INIT(); //中断初始化 STMFLASH_Unlock(); //内部flash解锁 LoadParamsFromEEPROM(); //加载系统参数配置表 LedInit(); //IO初始化 Adc_Init(); //摇杆AD初始化 KeyInit(); //按键初始化 NRF24L01_INIT(); //NRF24L01初始化 SetTX_Mode(); //设无线模块为接收模式 controlClibra(); //遥控摇杆校准 #ifdef UART_DEBUG TIM3_Init(SysClock,2000); //定时器初始化,1s为周期打印摇杆值 #endif TIM4_Init(SysClock,TIME4_Preiod); //定时器4初始化,定时时间单位:(TIME4_Preiod)微秒 LedSet(led2,1); LedSet(led3,1); LoadRCdata(); //摇杆赋值 //RockerUnlockcrazepony(); //摆杆启动 Lockflag = 0; //解锁标志,1表示产生了一次按键操作,0表示该按键操作已经发送到飞控 LedSet(led2,0); LedSet(led3,0); while (1) { //10Hz loop if(flag10Hz == 1) //10Hz { flag10Hz = 0; /*status led*/ ledsta = !ledsta; LedSet(signalLED,ledsta); /*crazepony Lock*/ KeyLockcrazepony(); /*IMUcalibrate */ IMUcalibrate(); /*remote calibrate*/ Remotecalibrate(); } //50Hz loop if(flag50Hz == 1) { LoadRCdata(); flag50Hz = 0; } // 80Hz 12.5ms if(flag80Hz) { flag80Hz = 0; CommUAVUpload(MSP_SET_4CON); } } }