#ifndef__BSP_ICM42688_H__#define__BSP_ICM42688_H__#include#defineICM_USE_HARD_SPI//#define ICM_USE_HARD_I2C/* ICM42688 registers
https://store.invensense.com/datasheets/invensense/DS-ICM-42688v1-2.pdf
*/// Bank 0#defineICM42688_DEVICE_CONFIG0x11#defineICM42688_DRIVE_CONFIG0x13#defineICM42688_INT_CONFIG0x14#defineICM42688_FIFO_CONFIG0x16#defineICM42688_TEMP_DATA10x1D#defineICM42688_TEMP_DATA00x1E#defineICM42688_ACCEL_DATA_X10x1F#defineICM42688_ACCEL_DATA_X00x20#defineICM42688_ACCEL_DATA_Y10x21#defineICM42688_ACCEL_DATA_Y00x22#defineICM42688_ACCEL_DATA_Z10x23#defineICM42688_ACCEL_DATA_Z00x24#defineICM42688_GYRO_DATA_X10x25#defineICM42688_GYRO_DATA_X00x26#defineICM42688_GYRO_DATA_Y10x27#defineICM42688_GYRO_DATA_Y00x28#defineICM42688_GYRO_DATA_Z10x29#defineICM42688_GYRO_DATA_Z00x2A#defineICM42688_TMST_FSYNCH0x2B#defineICM42688_TMST_FSYNCL0x2C#defineICM42688_INT_STATUS0x2D#defineICM42688_FIFO_COUNTH0x2E#defineICM42688_FIFO_COUNTL0x2F#defineICM42688_FIFO_DATA0x30#defineICM42688_APEX_DATA00x31#defineICM42688_APEX_DATA10x32#defineICM42688_APEX_DATA20x33#defineICM42688_APEX_DATA30x34#defineICM42688_APEX_DATA40x35#defineICM42688_APEX_DATA50x36#defineICM42688_INT_STATUS20x37#defineICM42688_INT_STATUS30x38#defineICM42688_SIGNAL_PATH_RESET0x4B#defineICM42688_INTF_CONFIG00x4C#defineICM42688_INTF_CONFIG10x4D#defineICM42688_PWR_MGMT00x4E#defineICM42688_GYRO_CONFIG00x4F#defineICM42688_ACCEL_CONFIG00x50#defineICM42688_GYRO_CONFIG10x51#defineICM42688_GYRO_ACCEL_CONFIG00x52#defineICM42688_ACCEL_CONFIG10x53#defineICM42688_TMST_CONFIG0x54#defineICM42688_APEX_CONFIG00x56#defineICM42688_SMD_CONFIG0x57#defineICM42688_FIFO_CONFIG10x5F#defineICM42688_FIFO_CONFIG20x60#defineICM42688_FIFO_CONFIG30x61#defineICM42688_FSYNC_CONFIG0x62#defineICM42688_INT_CONFIG00x63#defineICM42688_INT_CONFIG10x64#defineICM42688_INT_SOURCE00x65#defineICM42688_INT_SOURCE10x66#defineICM42688_INT_SOURCE30x68#defineICM42688_INT_SOURCE40x69#defineICM42688_FIFO_LOST_PKT00x6C#defineICM42688_FIFO_LOST_PKT10x6D#defineICM42688_SELF_TEST_CONFIG0x70#defineICM42688_WHO_AM_I0x75#defineICM42688_REG_BANK_SEL0x76// Bank 1#defineICM42688_SENSOR_CONFIG00x03#defineICM42688_GYRO_CONFIG_STATIC20x0B#defineICM42688_GYRO_CONFIG_STATIC30x0C#defineICM42688_GYRO_CONFIG_STATIC40x0D#defineICM42688_GYRO_CONFIG_STATIC50x0E#defineICM42688_GYRO_CONFIG_STATIC60x0F#defineICM42688_GYRO_CONFIG_STATIC70x10#defineICM42688_GYRO_CONFIG_STATIC80x11#defineICM42688_GYRO_CONFIG_STATIC90x12#defineICM42688_GYRO_CONFIG_STATIC100x13#defineICM42688_XG_ST_DATA0x5F#defineICM42688_YG_ST_DATA0x60#defineICM42688_ZG_ST_DATA0x61#defineICM42688_TMSTVAL00x62#defineICM42688_TMSTVAL10x63#defineICM42688_TMSTVAL20x64#defineICM42688_INTF_CONFIG40x7A#defineICM42688_INTF_CONFIG50x7B#defineICM42688_INTF_CONFIG60x7C// Bank 2#defineICM42688_ACCEL_CONFIG_STATIC20x03#defineICM42688_ACCEL_CONFIG_STATIC30x04#defineICM42688_ACCEL_CONFIG_STATIC40x05#defineICM42688_XA_ST_DATA0x3B#defineICM42688_YA_ST_DATA0x3C#defineICM42688_ZA_ST_DATA0x3D// Bank 4#defineICM42688_GYRO_ON_OFF_CONFIG0x0E#defineICM42688_APEX_CONFIG10x40#defineICM42688_APEX_CONFIG20x41#defineICM42688_APEX_CONFIG30x42#defineICM42688_APEX_CONFIG40x43#defineICM42688_APEX_CONFIG50x44#defineICM42688_APEX_CONFIG60x45#defineICM42688_APEX_CONFIG70x46#defineICM42688_APEX_CONFIG80x47#defineICM42688_APEX_CONFIG90x48#defineICM42688_ACCEL_WOM_X_THR0x4A#defineICM42688_ACCEL_WOM_Y_THR0x4B#defineICM42688_ACCEL_WOM_Z_THR0x4C#defineICM42688_INT_SOURCE60x4D#defineICM42688_INT_SOURCE70x4E#defineICM42688_INT_SOURCE80x4F#defineICM42688_INT_SOURCE90x50#defineICM42688_INT_SOURCE100x51#defineICM42688_OFFSET_USER00x77#defineICM42688_OFFSET_USER10x78#defineICM42688_OFFSET_USER20x79#defineICM42688_OFFSET_USER30x7A#defineICM42688_OFFSET_USER40x7B#defineICM42688_OFFSET_USER50x7C#defineICM42688_OFFSET_USER60x7D#defineICM42688_OFFSET_USER70x7E#defineICM42688_OFFSET_USER80x7F#defineICM42688_ADDRESS0x69// Address of ICM42688 accel/gyro when ADO = HIGH#defineAFS_2G0x03#defineAFS_4G0x02#defineAFS_8G0x01#defineAFS_16G0x00// default#defineGFS_2000DPS0x00// default#defineGFS_1000DPS0x01#defineGFS_500DPS0x02#defineGFS_250DPS0x03#defineGFS_125DPS0x04#defineGFS_62_5DPS0x05#defineGFS_31_25DPS0x06#defineGFS_15_125DPS0x07#defineAODR_8000Hz0x03#defineAODR_4000Hz0x04#defineAODR_2000Hz0x05#defineAODR_1000Hz0x06// default#defineAODR_200Hz0x07#defineAODR_100Hz0x08#defineAODR_50Hz0x09#defineAODR_25Hz0x0A#defineAODR_12_5Hz0x0B#defineAODR_6_25Hz0x0C#defineAODR_3_125Hz0x0D#defineAODR_1_5625Hz0x0E#defineAODR_500Hz0x0F#defineGODR_8000Hz0x03#defineGODR_4000Hz0x04#defineGODR_2000Hz0x05#defineGODR_1000Hz0x06// default#defineGODR_200Hz0x07#defineGODR_100Hz0x08#defineGODR_50Hz0x09#defineGODR_25Hz0x0A#defineGODR_12_5Hz0x0B#defineGODR_500Hz0x0F#defineICM42688_ID0x47typedefstruct{int16_t x;/**< Raw int16_t value from the x axis */int16_t y;/**< Raw int16_t value from the y axis */int16_t z;/**< Raw int16_t value from the z axis */}icm42688RawData_t;//--------------------------------------------------------//int8_tbsp_Icm42688Init(void);int8_tbsp_IcmGetTemperature(int16_t* pTemp);int8_tbsp_IcmGetAccelerometer(icm42688RawData_t*accData);int8_tbsp_IcmGetGyroscope(icm42688RawData_t*GyroData);int8_tbsp_IcmGetRawData(icm42688RawData_t*accData,icm42688RawData_t*GyroData);#endif
/* USER CODE BEGIN Header *//**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
*
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*//* USER CODE END Header *//* Includes ------------------------------------------------------------------*/#include"main.h"#include"spi.h"#include"tim.h"#include"usart.h"#include"gpio.h"/* Private includes ----------------------------------------------------------*//* USER CODE BEGIN Includes */#include"icm42688.h"#include"stdio.h"#include"DWT.h"#include"io_spi.h"#include"icm_426xx_alg.h"#include"invn_algo_agm.h"/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*//* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*//* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*//* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV */int16_t iTemperature =0;icm42688RawData_t stAccData;icm42688RawData_t stGyroData;
InvnAlgoAGMConfig config;
InvnAlgoAGMInput input;
InvnAlgoAGMOutput output;externuint8_ttimes_t;staticuint32_ttest_t;int32_t sRacc_data [3];int32_t sRgyr_data [3];int32_t acc_cal_q16 [3];int32_t gyr_cal_q16 [3];int rc =1;/* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/voidSystemClock_Config(void);/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*//* USER CODE BEGIN 0 */intfputc(int ch, FILE *fp){while(!(USART1->SR &(1<<7)));
USART1->DR = ch;return ch;}/* USER CODE END 0 *//**
* @brief The application entry point.
* @retval int
*/intmain(void){/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_SPI2_Init();MX_USART1_UART_Init();MX_TIM2_Init();/* USER CODE BEGIN 2 */HAL_TIM_Base_Start_IT(&htim2);bsp_InitDWT();printf("wroking...\n");bsp_Icm42688Init();init_agm_algo();
rc =invn_algo_agm_init(&config);printf("sucess is 0,fail is 1,rc = %d\n",rc);invn_algo_agm_set_config(&config);// invn_algo_agm_version ();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while(1){// bsp_IcmGetTemperature(&iTemperature);// printf("1.Temp:%d\n",iTemperature);// // bsp_IcmGetAccelerometer(&stAccData);// printf("2.AccX:%d AccY:%d AccZ:%d\n",stAccData.x,stAccData.y,stAccData.z);// bsp_IcmGetGyroscope(&stGyroData);// printf("3.GyroX:%d GyroY:%d GyroZ:%d\n",stGyroData.x,stGyroData.y,stGyroData.z);// bsp_IcmGetRawData(&stAccData,&stGyroData);// printf("4.AccX:%d AccY:%d AccZ:%d GyroX:%d GyroY:%d GyroZ:%d\n",stAccData.x,stAccData.y,stAccData.z,stGyroData.x,stGyroData.y,stGyroData.z);// bsp_IcmGetTemperature(&iTemperature);// printf("Temp:%d\n",iTemperature);bsp_IcmGetRawData(&stAccData,&stGyroData);printf("AccX:%d--AccY:%d--AccZ:%d----GyroX:%d--GyroY:%d--GyroZ:%d\n",stAccData.x,stAccData.y,stAccData.z,stGyroData.x,stGyroData.y,stGyroData.z);
input.sRacc_data[0]= stAccData.x;
input.sRacc_data[1]= stAccData.y;
input.sRacc_data[2]= stAccData.z;
input.sRgyr_data[0]= stGyroData.x;
input.sRgyr_data[1]= stGyroData.y;
input.sRgyr_data[2]= stGyroData.z;invn_algo_agm_process(&input,&output);printf("X:%d--Y:%d--Z:%d---temp:%d\n",output.grv_quat_q30[0],output.grv_quat_q30[1],output.grv_quat_q30[2],output.grv_quat_q30[3]);HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */}/**
* @brief System Clock Configuration
* @retval None
*/voidSystemClock_Config(void){
RCC_OscInitTypeDef RCC_OscInitStruct ={0};
RCC_ClkInitTypeDef RCC_ClkInitStruct ={0};/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if(HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2)!= HAL_OK){Error_Handler();}HAL_RCC_MCOConfig(RCC_MCO, RCC_MCO1SOURCE_PLLCLK, RCC_MCODIV_1);}/* USER CODE BEGIN 4 */voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){if(htim->Instance == htim2.Instance){if(DWT_CYCCNT <test_t){if(times_t>72){times_t=0;}else{times_t++;}test_t= DWT_CYCCNT;}else{test_t= DWT_CYCCNT;}}}/* USER CODE END 4 *//**
* @brief This function is executed in case of error occurrence.
* @retval None
*/voidError_Handler(void){/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while(1){}/* USER CODE END Error_Handler_Debug */}#ifdefUSE_FULL_ASSERT/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/voidassert_failed(uint8_t*file,uint32_t line){/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */}#endif/* USE_FULL_ASSERT *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/