Example #1
0
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);	
	}											    
}	
Example #3
0
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*/
        }
    }
}
Example #4
0
//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);	//后台实时更新当前环境温度
}
Example #6
0
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;}
		}
}
Example #7
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);
  
}
Example #8
0
 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);
	}

 }
Example #9
0
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();
}
Example #10
0
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);

}
Example #11
0
/*
 * 函数名: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!");
    }
  }	
}
Example #13
0
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
 }
Example #14
0
/**************************************************************/
//程 序 名: 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;
		}
	}
}
Example #15
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);

}
Example #16
0
/**
 * 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


}
Example #17
0
/**
 ******************************************************************************
 ** \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
}
Example #19
0
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);   
		}
	}
}