Пример #1
0
/*
 * Function to initialize the LIS2DH accelerometer
 * Here we use many functions written for the LIS3DH as the driver for that
 * chip is freely available from ST and is almost identical to the LIS2DH
 */
status_t LIS2DH_init(void)
{
    status_t ret = MEMS_SUCCESS;

    /* Set up low power function */
    if ((ret = LIS3DH_SetMode(LIS3DH_LOW_POWER)) != MEMS_SUCCESS)
    {
        return MEMS_ERROR;
    }
    if ((ret = LIS2DH_SetAct_THS(ACC_THRESHOLD_LOWPWR_G)) != MEMS_SUCCESS)
    {
        return MEMS_ERROR;
    }
    if ((ret = LIS2DH_SetAct_DUR(ACC_THRESHOLD_LOWPWR_DUR)) != MEMS_SUCCESS)
    {
        return MEMS_ERROR;
    }

    /* Set up interrupt on INT1 pin on movement */
    if ((ret = LIS3DH_SetODR(LIS3DH_ODR_100Hz)) != MEMS_SUCCESS)
    {
        return MEMS_ERROR;
    }
    if ((ret = LIS3DH_HPFAOI1Enable(MEMS_ENABLE)) != MEMS_SUCCESS)
    {
        return MEMS_ERROR;
    }
    if ((ret = LIS3DH_SetFilterDataSel(MEMS_SET)) != MEMS_SUCCESS)
    {
        return MEMS_ERROR;
    }
    if ((ret = LIS3DH_SetInt1Pin(LIS3DH_I1_INT1_ON_PIN_INT1_ENABLE)) != MEMS_SUCCESS)
    {
        return MEMS_ERROR;
    }
    if ((ret = LIS3DH_SetInt1Threshold(ACC_THRESHOLD_MOVEMENT)) != MEMS_SUCCESS)
    {
        return MEMS_ERROR;
    }
    if ((ret = LIS3DH_SetInt1Duration(ACC_THRESHOLD_DURATION)) != MEMS_SUCCESS)
    {
        return MEMS_ERROR;
    }
    if ((ret = LIS3DH_SetIntConfiguration(
                   LIS3DH_INT1_ZHIE_ENABLE |
                   LIS3DH_INT1_YHIE_ENABLE |
                   LIS3DH_INT1_XHIE_ENABLE)) != MEMS_SUCCESS)
    {
        return MEMS_ERROR;
    }
    if ((ret = LIS3DH_ResetInt1Latch()) != MEMS_SUCCESS)
    {
        return MEMS_ERROR;
    }
    /* Disable latch INT1 on movement */
    if ((ret = LIS3DH_Int1LatchEnable(MEMS_DISABLE)) != MEMS_SUCCESS)
    {
        return MEMS_ERROR;
    }

    /* Setup double-tap feature */
    if ((ret = LIS3DH_HPFClickEnable(MEMS_ENABLE)) != MEMS_SUCCESS)
    {
        return MEMS_ERROR;
    }
    if ((ret = LIS3DH_SetInt2Pin(LIS3DH_CLICK_ON_PIN_INT2_ENABLE)) != MEMS_SUCCESS)
    {
        return MEMS_ERROR;
    }
    if ((ret = LIS3DH_SetClickCFG(
                   LIS3DH_ZD_ENABLE |
                   LIS3DH_YD_DISABLE |
                   LIS3DH_XD_DISABLE )) != MEMS_SUCCESS)
    {
        return MEMS_ERROR;
    }
    if ((ret = LIS3DH_SetClickTHS(ACC_DOUBLE_TAP_THRESHOLD)) != MEMS_SUCCESS)
    {
        return MEMS_ERROR;
    }
    if ((ret = LIS3DH_SetClickLIMIT(ACC_DOUBLE_TAP_LIMIT)) != MEMS_SUCCESS)
    {
        return MEMS_ERROR;
    }
    if ((ret = LIS3DH_SetClickLATENCY(ACC_DOUBLE_TAP_LATENCY)) != MEMS_SUCCESS)
    {
        return MEMS_ERROR;
    }
    if ((ret = LIS3DH_SetClickWINDOW(ACC_DOUBLE_TAP_WINDOW)) != MEMS_SUCCESS)
    {
        return MEMS_ERROR;
    }
    /*
     * this doesnt work, the latch doesn't latch
     * but the interrupt stays high long enough for us to read it anyway
     * so we don't actually need to latch/read/clear.
     * Left here as a comment for future "why didn't we do it like this?"...
     */
    if ((ret = LIS2DH_ResetInt2Latch()) != MEMS_SUCCESS)
    {
        return MEMS_ERROR;
    }
    /* Latch INT2 on double tap */
    if ((ret = LIS2DH_Int2LatchEnable(MEMS_ENABLE)) != MEMS_SUCCESS)
    {
        return MEMS_ERROR;
    }

    /*
     DEBUGGING: Read all accelerometer registers

      uint8_t volatile i;
      uint8_t temp[0x40] = {0};
      for (i=0;i<=0x3f;i++)
      {
        LIS3DH_ReadReg(i, &temp[i]);
      }
    */
    return ret;
}
Пример #2
0
int main(void)
{

  /* USER CODE BEGIN 1 */

//  AxesRaw_t data;
	
	FRESULT res; /* FatFs function common result code */
	uint32_t byteswritten, bytesread; /* File write/read counts */
	char rtext[256]; /* File read buffer */
	
	//	HALL_SENS_PWR_ON;
	//	CLAMP_SENS_PWR_ON;
	
	//	1. SPI1 is for ACC 
	
	
  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC_Init();
  MX_SDIO_SD_Init();
  MX_SPI1_Init();
  MX_SPI2_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  MX_FATFS_Init();
  MX_RTC_Init();

  /* USER CODE BEGIN 2 */
	HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);
	HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 1, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);

  EXTI0_IRQHandler_Config();
//	EXTI13_IRQHandler_Config();
	
//	HAL_DBGMCU_EnableDBGStopMode();


	//HALL_SENS_PWR_ON;
	//CLAMP_SENS_PWR_OFF;
	
	
	// init gpio before!
	UC_2_8V;
 
 
	printf("FW start\r\n");


	LIS3DH_PreInit();
	LIS3DH_SetMode(LIS3DH_NORMAL); 				//reg1
	LIS3DH_SetODR(LIS3DH_ODR_400Hz); 			//reg1
	LIS3DH_SetAxis(LIS3DH_X_ENABLE | LIS3DH_Y_ENABLE | LIS3DH_Z_ENABLE ); //reg1

	//Direct IRQ from watemark and overrun to 1st pin. reg3
	LIS3DH_SetInt1Pin(LIS3DH_CLICK_ON_PIN_INT1_DISABLE 		| 	LIS3DH_I1_INT1_ON_PIN_INT1_DISABLE 	| 	LIS3DH_I1_INT2_ON_PIN_INT1_DISABLE 	| 
										LIS3DH_I1_DRDY1_ON_INT1_DISABLE			| 	LIS3DH_I1_DRDY2_ON_INT1_DISABLE 		| 	LIS3DH_WTM_ON_INT1_ENABLE 					| LIS3DH_INT1_OVERRUN_DISABLE);

	//REG4
	LIS3DH_SetBDU(MEMS_ENABLE);
  LIS3DH_SetFullScale(LIS3DH_FULLSCALE_2);  //reg4

	//REG5
  LIS3DH_FIFOModeEnable(LIS3DH_FIFO_STREAM_MODE);	//Enable store into FIFO reg5
	LIS3DH_Int1LatchEnable(MEMS_ENABLE);
	
	
	//LIS3DH_FIFO_CTRL_REG
	LIS3DH_SetTriggerInt(LIS3DH_TRIG_INT1);
	LIS3DH_SetWaterMark(15); 									// watermark for irq generation from fifo  LIS3DH_FIFO_CTRL_REG

	LIS3DH_ReadFIFO();												// clean FIFO and reset IRQ


while (1) {
	//LIS3DH_GetInt1Src(&resp);
	//printf("INT1SRC %i ", resp);
	
	/*LIS3DH_GetFifoSourceBit(LIS3DH_FIFO_SRC_WTM, &resp);
	printf("WTM %i ", resp);
	
	LIS3DH_GetReg3Bit(LIS3DH_I1_WTM, &resp);
	printf("WMBIT %i ", resp);
	
	LIS3DH_GetFifoSourceFSS(&resp);
	printf("FIFO %i\r\n", resp);
	
	
	//LIS3DH_GetIntCounter(&resp);
	//printf("Interrupts counter=%i\r\n", resp);	
	if (resp > 26) {
		
		//rep:
			//LIS3DH_GetFifoSourceFSS(&resp);
			//printf("> %i recs in FIFO (while)\r\n", resp);
			//HAL_Delay(15);
		//LIS3DH_GetInt1Src(&resp);
/*		rep:
		if(LIS3DH_GetAccAxesRaw(&data)==1){
				LIS3DH_GetFifoSourceBit(LIS3DH_FIFO_SRC_WTM, &resp);
				//printf("X=%6d Y=%6d Z=%6d \r\n", data.AXIS_X, data.AXIS_Y, data.AXIS_Z); 
			printf("  READ WTM%i\r\n", resp);
		} else {
				printf("ER\r\n");
		}
		
		LIS3DH_GetFifoSourceFSS(&resp);
		if (resp > 0) goto rep;
		
		LIS3DH_ResetInt1Latch();
		
		
		LIS3DH_FIFOModeEnable(LIS3DH_FIFO_STREAM_MODE);*/

			LIS3DH_ReadFIFO();
	HAL_Delay(2000);
}
//ENABLE ALL IRQs
//LIS3DH_SetInt1Pin(LIS3DH_CLICK_ON_PIN_INT1_DISABLE | LIS3DH_I1_INT1_ON_PIN_INT1_ENABLE | LIS3DH_I1_INT2_ON_PIN_INT1_ENABLE | LIS3DH_I1_DRDY1_ON_INT1_ENABLE | LIS3DH_I1_DRDY2_ON_INT1_ENABLE | LIS3DH_WTM_ON_INT1_ENABLE | LIS3DH_INT1_OVERRUN_ENABLE);
//LIS3DH_SetInt2Pin(LIS3DH_CLICK_ON_PIN_INT2_DISABLE | LIS3DH_I2_INT1_ON_PIN_INT2_ENABLE | LIS3DH_I2_INT2_ON_PIN_INT2_ENABLE | LIS3DH_I2_BOOT_ON_INT2_ENABLE | LIS3DH_INT_ACTIVE_HIGH);
//	HAL_Delay(2000);
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
		
//		if(LIS3DH_GetAccAxesRaw(&data)==1){
//			printf("X=%6d Y=%6d Z=%6d \r\n", data.AXIS_X, data.AXIS_Y, data.AXIS_Z); 
//		} else {
//			printf("ER\r\n");
//		}
		HAL_Delay(50);

		//	lowest_power();		//go to stop. Wakeup on RTC wakeup or 1st or 2d PIN wakeup
  }
	
	
//SDIO FAT PART.
	
	//ENABLE_2_5V;	//DC-DC enable
	SD_PWR_ON;		//Power to SD card
	//INIT SD and CARD after because no power to sd
	
	HAL_Delay(50);
  MX_SDIO_SD_Init();
  MX_FATFS_Init();

/*##-1- FatFS: Link the SD disk I/O driver ##########*/
 
 if(FATFS_LinkDriver(&SD_Driver, SDPath) == 0){
		/* success: set the orange LED on */
		 //HAL_GPIO_WritePin(GPIOG, GPIO_PIN_7, GPIO_PIN_RESET);
		/*##-2- Register the file system object to the FatFs module 
	 
		NB! mout right now!
	 ###*/
		res = f_mount(&SDFatFs, (TCHAR const*)SD_Path, 1) ;
	 
		 if(res != FR_OK){
				 /* FatFs Initialization Error : set the red LED on */
				 printf ("Problem fmount\r\n");
				 while(1);
		 } else {
				/*##-3- Create a FAT file system (format) on the logical drive#*/
				 /* WARNING: Formatting the uSD card will delete all content on the device */
					res = f_mkfs((TCHAR const*)SD_Path, 0, 0);
					if(res != FR_OK){
						 /* FatFs Format Error : set the red LED on */
							printf ("Problem f_mkfs\r\n");
						 while(1);
					} else {
						/*##-4- Create & Open a new text file object with write access#*/
						 if(f_open(&MyFile, "Hello.txt", FA_CREATE_ALWAYS | FA_WRITE) != FR_OK){
								 /* 'Hello.txt' file Open for write Error : set the red LED on */
								 printf ("Problem f_open\r\n");
								 while(1);
						 } else {
								 /*##-5- Write data to the text file ####################*/
								 res = f_write(&MyFile, wtext, sizeof(wtext), (void*)&byteswritten);
									 
								 if((byteswritten == 0) || (res != FR_OK)){
										 /* 'Hello.txt' file Write or EOF Error : set the red LED on */
										 printf ("Problem f_write\r\n");
										 while(1);
								 } else {
									 
										 /*##-6- Successful open/write : set the blue LED on */
										// HAL_GPIO_WritePin(GPIOG, GPIO_PIN_12, GPIO_PIN_RESET);
										 f_close(&MyFile);
									 
										 /*##-7- Open the text file object with read access #*/
										 if(f_open(&MyFile, "Hello.txt", FA_READ) != FR_OK){
												 /* 'Hello.txt' file Open for read Error : set the red LED on */
												//HAL_GPIO_WritePin(GPIOG, GPIO_PIN_10, GPIO_PIN_RESET);
													printf ("Problem f_open\r\n");
												 while(1);
										 } else {
												 /*##-8- Read data from the text file #########*/
												 res = f_read(&MyFile, rtext, sizeof(wtext), &bytesread);
//												 if((strcmp(rtext,wtext)!=0)|| (res != FR_OK)){
//													 /* 'Hello.txt' file Read or EOF Error : set the red LED on */
//													 				 printf ("Problem f_read\r\n");
//													 while(1);
//												 } else {
//													 printf ("FAT operation done OK!\r\n");
													 /* Successful read : set the green LED On */
													 //HAL_GPIO_WritePin(GPIOG, GPIO_PIN_6, GPIO_PIN_RESET);
													 /*##-9- Close the open text file ################*/
													 f_close(&MyFile);
												 }
										 }
								 }
						 }
				 }
		 }
 
 /*##-10- Unlink the micro SD disk I/O driver #########*/
 FATFS_UnLinkDriver(SD_Path);
	
  /* USER CODE END 3 */

}