/* * 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; }
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 */ }