添加imu驱动

This commit is contained in:
fize 2022-12-12 15:05:54 +08:00
parent 107ae24419
commit 8233bf14d8
16 changed files with 1422 additions and 220 deletions

View File

@ -33,6 +33,7 @@
</option>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.includepaths.8201634" name="Include paths (-I)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.includepaths" useByScannerDiscovery="false" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/ASM330LHH}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/TDK}&quot;"/>
</option>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input.2109536874" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input"/>
</tool>
@ -46,12 +47,14 @@
</option>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths.49586449" name="Include paths (-I)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths" useByScannerDiscovery="false" valueType="includePath">
<listOptionValue builtIn="false" value="../Core/Inc"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/TDK}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/ASM330LHH}&quot;"/>
<listOptionValue builtIn="false" value="../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy"/>
<listOptionValue builtIn="false" value="../Drivers/STM32F1xx_HAL_Driver/Inc"/>
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Device/ST/STM32F1xx/Include"/>
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Include"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/IMU_DUAL/nmea}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/IMU_DUAL/TDK}&quot;"/>
</option>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.1270954699" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c"/>
</tool>
@ -133,6 +136,7 @@
</tool>
</fileInfo>
<sourceEntries>
<entry flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name="TDK"/>
<entry flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name="ASM330LHH"/>
<entry flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name="nmea"/>
<entry flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name="Core"/>

View File

@ -5,6 +5,7 @@
stmdev_ctx_t spi1_dev ;
extern SPI_HandleTypeDef hspi1;
asm_value asm330;
static int32_t platform_write(void *handle, uint8_t reg, const uint8_t *bufp,uint16_t len)
{
@ -47,8 +48,75 @@ static int32_t platform_read(void *handle, uint8_t reg, uint8_t *bufp,uint16_t l
void user_dev_init()
{
static uint8_t rst;
uint8_t temp;
spi1_dev.handle=&hspi1;
spi1_dev.mdelay=HAL_Delay;
spi1_dev.write_reg=platform_write;
spi1_dev.read_reg=platform_read;
asm330lhh_device_id_get(&spi1_dev, &temp);
asm330lhh_reset_set(&spi1_dev, PROPERTY_ENABLE);
do {
asm330lhh_reset_get(&spi1_dev, &rst);
} while (rst);
/* Start device configuration. */
asm330lhh_device_conf_set(&spi1_dev, PROPERTY_ENABLE);
/* Enable Block Data Update */
asm330lhh_block_data_update_set(&spi1_dev, PROPERTY_ENABLE);
/* Set Output Data Rate */
asm330lhh_xl_data_rate_set(&spi1_dev, ASM330LHH_XL_ODR_104Hz);
asm330lhh_gy_data_rate_set(&spi1_dev, ASM330LHH_GY_ODR_104Hz);
/* Set full scale */
asm330lhh_xl_full_scale_set(&spi1_dev, ASM330LHH_2g);
asm330lhh_gy_full_scale_set(&spi1_dev, ASM330LHH_2000dps);
asm330lhh_data_ready_mode_set(&spi1_dev, ASM330LHH_DRDY_PULSED);
asm330lhh_pin_int1_route_t route_val={0};
route_val.int1_ctrl.int1_drdy_xl=1;
asm330lhh_pin_int1_route_set(&spi1_dev, &route_val);
/* Configure filtering chain(No aux interface)
* Accelerometer - LPF1 + LPF2 path
*/
// asm330lhh_xl_hp_path_on_out_set(&spi1_dev, ASM330LHH_LP_ODR_DIV_100);
// asm330lhh_xl_filter_lp2_set(&spi1_dev, PROPERTY_ENABLE);
}
void asm_sample()
{
static int16_t data_raw_acceleration[3];
static int16_t data_raw_angular_rate[3];
uint8_t reg;
/* Read output only if new xl value is available */
asm330lhh_gy_flag_data_ready_get(&spi1_dev, &reg);
if (reg) {
asm330lhh_angular_rate_raw_get(&spi1_dev, data_raw_angular_rate);
asm330. x_gyro= 0.001*asm330lhh_from_fs2000dps_to_mdps(
data_raw_angular_rate[0]);
asm330. y_gyro = 0.001*asm330lhh_from_fs2000dps_to_mdps(
data_raw_angular_rate[1]);
asm330. z_gyro = 0.001*asm330lhh_from_fs2000dps_to_mdps(
data_raw_angular_rate[2]);
// angular_rate_mdps[0] = asm330lhh_from_fs2000dps_to_mdps(
// data_raw_angular_rate[0]);
// angular_rate_mdps[1] = asm330lhh_from_fs2000dps_to_mdps(
// data_raw_angular_rate[1]);
// angular_rate_mdps[2] = asm330lhh_from_fs2000dps_to_mdps(
// data_raw_angular_rate[2]);
}
asm330lhh_xl_flag_data_ready_get(&spi1_dev, &reg);
if (reg) {
asm330lhh_acceleration_raw_get(&spi1_dev, data_raw_acceleration);
asm330.x_acc = 0.0098*asm330lhh_from_fs2g_to_mg(
data_raw_acceleration[0]);
asm330.y_acc = 0.0098*asm330lhh_from_fs2g_to_mg(
data_raw_acceleration[1]);
asm330.z_acc = 0.0098*asm330lhh_from_fs2g_to_mg(
data_raw_acceleration[2]);
}
}

View File

@ -14,10 +14,23 @@
#define IMU_NOT_READY 1
#define IMU_LOCK 1
#define IMU_UNLOCK 0
typedef struct{
int16_t x_a; //加速度值原始数据
int16_t y_a;
int16_t z_a;
int16_t x_g; //角速度值原始数据
int16_t y_g;
int16_t z_g;
float x_acc; //转换为真实加速度
float y_acc;
float z_acc;
float x_gyro; //转换为真实角速度
float y_gyro;
float z_gyro;
}asm_value;
extern asm_value asm330;
void user_dev_init();
extern uint8_t rx_uart2;
extern stmdev_ctx_t spi1_dev;

View File

@ -57,6 +57,16 @@ void Error_Handler(void);
/* USER CODE END EFP */
/* Private defines -----------------------------------------------------------*/
#define SPI1_CSN_Pin GPIO_PIN_4
#define SPI1_CSN_GPIO_Port GPIOA
#define SPI1_INIT1_Pin GPIO_PIN_0
#define SPI1_INIT1_GPIO_Port GPIOB
#define SPI1_INIT1_EXTI_IRQn EXTI0_IRQn
#define SPI2_CSN_Pin GPIO_PIN_12
#define SPI2_CSN_GPIO_Port GPIOB
#define SPI2_INIT1_Pin GPIO_PIN_8
#define SPI2_INIT1_GPIO_Port GPIOA
#define SPI2_INIT1_EXTI_IRQn EXTI9_5_IRQn
/* USER CODE BEGIN Private defines */

View File

@ -42,7 +42,7 @@
/*#define HAL_CORTEX_MODULE_ENABLED */
/*#define HAL_CRC_MODULE_ENABLED */
/*#define HAL_DAC_MODULE_ENABLED */
/*#define HAL_DMA_MODULE_ENABLED */
#define HAL_DMA_MODULE_ENABLED
/*#define HAL_ETH_MODULE_ENABLED */
/*#define HAL_FLASH_MODULE_ENABLED */
#define HAL_GPIO_MODULE_ENABLED

View File

@ -56,7 +56,10 @@ void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
void EXTI0_IRQHandler(void);
void TIM1_BRK_IRQHandler(void);
void EXTI1_IRQHandler(void);
void DMA1_Channel6_IRQHandler(void);
void EXTI9_5_IRQHandler(void);
void TIM3_IRQHandler(void);
void USART1_IRQHandler(void);
void USART2_IRQHandler(void);
/* USER CODE BEGIN EFP */

View File

@ -17,61 +17,61 @@ extern nmea_t nmea;
IMU_mng IMU_mng_st={0};
IMU_mng IMU_mng_tdk={0};
extern void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == htim1.Instance)
{
if(nmea.sol.utctime.sec+0.0001<1)
{
nmea.sol.utctime.sec+=0.0001;
}
if(nmea.sol.time.sec+0.0001<1)
{
nmea.sol.time.sec+=0.0001;
}
}
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_1)
{
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1)==GPIO_PIN_RESET)//PPS impulse
{
nmea.sol.utctime.sec=0;
nmea.sol.time.sec=0;/* time (GPST) */
nmea.sol.utctime.time++;
nmea.sol.time.time++;/* time (GPST) */
}
}
if(GPIO_Pin == GPIO_PIN_0)
{
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0)==GPIO_PIN_RESET)//INI1 from ST IMU
{
if((!IMU_mng_st.lock)&&(!IMU_mng_st.ready))
{
IMU_mng_st.lock=IMU_LOCK;
IMU_mng_st.time= nmea.sol.time;
IMU_mng_st.utctime= nmea.sol.utctime;
IMU_mng_st.ready=IMU_READY;
IMU_mng_st.lock=IMU_UNLOCK;
}
}
}
}
//extern void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
//{
// if(htim->Instance == htim1.Instance)
// {
// if(nmea.sol.utctime.sec+0.0001<1)
// {
// nmea.sol.utctime.sec+=0.0001;
// }
// if(nmea.sol.time.sec+0.0001<1)
// {
// nmea.sol.time.sec+=0.0001;
// }
// }
//}
//void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
//{
// if(GPIO_Pin == GPIO_PIN_1)
// {
// if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1)==GPIO_PIN_RESET)//PPS impulse
// {
// nmea.sol.utctime.sec=0;
// nmea.sol.time.sec=0;/* time (GPST) */
// nmea.sol.utctime.time++;
// nmea.sol.time.time++;/* time (GPST) */
// }
// }
// if(GPIO_Pin == GPIO_PIN_0)
// {
// if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0)==GPIO_PIN_RESET)//INI1 from ST IMU
// {
// if((!IMU_mng_st.lock)&&(!IMU_mng_st.ready))
// {
// IMU_mng_st.lock=IMU_LOCK;
// IMU_mng_st.time= nmea.sol.time;
// IMU_mng_st.utctime= nmea.sol.utctime;
// IMU_mng_st.ready=IMU_READY;
// IMU_mng_st.lock=IMU_UNLOCK;
// }
//
// }
// }
//}
uint8_t rx_uart2=0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==huart2.Instance)
{
if(input_nmea(&nmea, rx_uart2)!=1)
{
HAL_UART_Receive_IT(&huart2, &rx_uart2, 1);
}
else
{
HAL_TIM_Base_Start(&htim1);
}
}
}
//void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
//{
// if(huart->Instance==huart2.Instance)
// {
// if(input_nmea(&nmea, rx_uart2)!=2)
// {
// HAL_UART_Receive_IT(&huart2, &rx_uart2, 1);
// }
// else
// {
// HAL_TIM_Base_Start(&htim1);
// }
// }
//
//}

View File

@ -23,7 +23,11 @@
/* USER CODE BEGIN Includes */
#include "user_asm330lhh.h"
#include "asm330lhh_reg.h"
#include "user_iam20680.h"
#include "iam20680.h"
#include "iam20680.h"
#include "rtklib.h"
#include "stdio.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
@ -37,39 +41,58 @@
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
SPI_HandleTypeDef hspi1;
SPI_HandleTypeDef hspi2;
TIM_HandleTypeDef htim1;
TIM_HandleTypeDef htim3;
UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart2_rx;
/* USER CODE BEGIN PV */
uint8_t SPI2_INT_RD=0;
uint8_t SPI1_INT_RD=0;
double time_hh=23,time_mm=59,time_ss=40,time_ms;
uint8_t Rx_Buffer[2500];
extern int8_t flag;
extern int GPS_week;
extern double GPS_sec;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_SPI1_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_TIM1_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_SPI2_Init(void);
static void MX_TIM3_Init(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint8_t temp[1000]={0};
uint32_t time_100us=0;
nmea_t nmea={0};
extern IMU_mng IMU_mng_st;
extern IMU_mng IMU_mng_tdk;
static int16_t data_raw_acceleration[3];
static int16_t data_raw_angular_rate[3];
static int16_t data_raw_temperature;
static float acceleration_mg[3];
static float angular_rate_mdps[3];
/* USER CODE END 0 */
/**
@ -100,32 +123,40 @@ int main(void)
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_SPI1_Init();
MX_USART1_UART_Init();
MX_TIM1_Init();
MX_USART2_UART_Init();
MX_SPI2_Init();
MX_TIM3_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start(&htim3);
user_dev_init();
HAL_Delay(1000);
asm330lhh_device_id_get(&spi1_dev, temp);
user_dev_init1();
// iam20680_init(&spi2_dev);
HAL_UART_Receive_IT(&huart2, &rx_uart2, 1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(IMU_mng_st.ready)
TIM3_Get_100us();
if(1 == SPI2_INT_RD)
{
//spi read
IMU_mng_st.ready=IMU_NOT_READY;
SPI2_INT_RD = 0;
// application_task();
}
if(1 == SPI1_INT_RD)
{
SPI1_INT_RD=0;
asm_sample();
printf("{ GPS_week: %d week_sec: %.3lf \r\n",GPS_week,GPS_sec+time_ms*0.001);
printf("x_a=%.3fm/s2 y_a=%.3fm/s2 z_a=%.3fm/s2\r\n",asm330.x_acc,asm330.y_acc,asm330.z_acc);
printf("x_g=%.3fdeg/s y_g=%.3fdeg/s z_g=%.3fdeg/s }\r\n\r\n\r\n",asm330.x_gyro,asm330.y_gyro,asm330.z_gyro);
// printf("time: %.0lfh:%.0lfm:%.0lfs:%.3fms \r\n",time_hh,time_mm,time_ss,time_ms);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
@ -210,48 +241,85 @@ static void MX_SPI1_Init(void)
}
/**
* @brief TIM1 Initialization Function
* @brief SPI2 Initialization Function
* @param None
* @retval None
*/
static void MX_TIM1_Init(void)
static void MX_SPI2_Init(void)
{
/* USER CODE BEGIN TIM1_Init 0 */
/* USER CODE BEGIN SPI2_Init 0 */
/* USER CODE END TIM1_Init 0 */
/* USER CODE END SPI2_Init 0 */
/* USER CODE BEGIN SPI2_Init 1 */
/* USER CODE END SPI2_Init 1 */
/* SPI2 parameter configuration*/
hspi2.Instance = SPI2;
hspi2.Init.Mode = SPI_MODE_MASTER;
hspi2.Init.Direction = SPI_DIRECTION_2LINES;
hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH;
hspi2.Init.CLKPhase = SPI_PHASE_2EDGE;
hspi2.Init.NSS = SPI_NSS_SOFT;
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi2.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi2) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN SPI2_Init 2 */
/* USER CODE END SPI2_Init 2 */
}
/**
* @brief TIM3 Initialization Function
* @param None
* @retval None
*/
static void MX_TIM3_Init(void)
{
/* USER CODE BEGIN TIM3_Init 0 */
/* USER CODE END TIM3_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
/* USER CODE BEGIN TIM1_Init 1 */
/* USER CODE BEGIN TIM3_Init 1 */
/* USER CODE END TIM1_Init 1 */
htim1.Instance = TIM1;
htim1.Init.Prescaler = 0;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 6400;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
/* USER CODE END TIM3_Init 1 */
htim3.Instance = TIM3;
htim3.Init.Prescaler = 6400-1;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 65535;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM1_Init 2 */
/* USER CODE BEGIN TIM3_Init 2 */
/* USER CODE END TIM1_Init 2 */
/* USER CODE END TIM3_Init 2 */
}
@ -271,7 +339,7 @@ static void MX_USART1_UART_Init(void)
/* USER CODE END USART1_Init 1 */
huart1.Instance = USART1;
huart1.Init.BaudRate = 460800;
huart1.Init.BaudRate = 921600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
@ -304,7 +372,7 @@ static void MX_USART2_UART_Init(void)
/* USER CODE END USART2_Init 1 */
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.BaudRate = 460800;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
@ -316,11 +384,28 @@ static void MX_USART2_UART_Init(void)
Error_Handler();
}
/* USER CODE BEGIN USART2_Init 2 */
__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart2, Rx_Buffer, sizeof(Rx_Buffer));
/* USER CODE END USART2_Init 2 */
}
/**
* Enable DMA controller clock
*/
static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
__HAL_RCC_DMA1_CLK_ENABLE();
/* DMA interrupt init */
/* DMA1_Channel6_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);
}
/**
* @brief GPIO Initialization Function
* @param None
@ -335,35 +420,61 @@ static void MX_GPIO_Init(void)
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
HAL_GPIO_WritePin(SPI1_CSN_GPIO_Port, SPI1_CSN_Pin, GPIO_PIN_SET);
/*Configure GPIO pin : PA1 */
GPIO_InitStruct.Pin = GPIO_PIN_1;
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(SPI2_CSN_GPIO_Port, SPI2_CSN_Pin, GPIO_PIN_SET);
/*Configure GPIO pins : PA1 SPI2_INIT1_Pin */
GPIO_InitStruct.Pin = GPIO_PIN_1|SPI2_INIT1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : PA4 */
GPIO_InitStruct.Pin = GPIO_PIN_4;
/*Configure GPIO pin : SPI1_CSN_Pin */
GPIO_InitStruct.Pin = SPI1_CSN_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_Init(SPI1_CSN_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pin : PB0 */
GPIO_InitStruct.Pin = GPIO_PIN_0;
/*Configure GPIO pin : SPI1_INIT1_Pin */
GPIO_InitStruct.Pin = SPI1_INIT1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_Init(SPI1_INIT1_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pin : SPI2_CSN_Pin */
GPIO_InitStruct.Pin = SPI2_CSN_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(SPI2_CSN_GPIO_Port, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI1_IRQn);
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
}
/* USER CODE BEGIN 4 */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
return ch;
}
#endif
/* USER CODE END 4 */
/**

View File

@ -23,6 +23,7 @@
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
extern DMA_HandleTypeDef hdma_usart2_rx;
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN TD */
@ -117,6 +118,34 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
/* USER CODE END SPI1_MspInit 1 */
}
else if(hspi->Instance==SPI2)
{
/* USER CODE BEGIN SPI2_MspInit 0 */
/* USER CODE END SPI2_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_SPI2_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/**SPI2 GPIO Configuration
PB13 ------> SPI2_SCK
PB14 ------> SPI2_MISO
PB15 ------> SPI2_MOSI
*/
GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_14;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* USER CODE BEGIN SPI2_MspInit 1 */
/* USER CODE END SPI2_MspInit 1 */
}
}
@ -147,6 +176,25 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi)
/* USER CODE END SPI1_MspDeInit 1 */
}
else if(hspi->Instance==SPI2)
{
/* USER CODE BEGIN SPI2_MspDeInit 0 */
/* USER CODE END SPI2_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_SPI2_CLK_DISABLE();
/**SPI2 GPIO Configuration
PB13 ------> SPI2_SCK
PB14 ------> SPI2_MISO
PB15 ------> SPI2_MOSI
*/
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
/* USER CODE BEGIN SPI2_MspDeInit 1 */
/* USER CODE END SPI2_MspDeInit 1 */
}
}
@ -158,19 +206,19 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi)
*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{
if(htim_base->Instance==TIM1)
if(htim_base->Instance==TIM3)
{
/* USER CODE BEGIN TIM1_MspInit 0 */
/* USER CODE BEGIN TIM3_MspInit 0 */
/* USER CODE END TIM1_MspInit 0 */
/* USER CODE END TIM3_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_TIM1_CLK_ENABLE();
/* TIM1 interrupt Init */
HAL_NVIC_SetPriority(TIM1_BRK_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM1_BRK_IRQn);
/* USER CODE BEGIN TIM1_MspInit 1 */
__HAL_RCC_TIM3_CLK_ENABLE();
/* TIM3 interrupt Init */
HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM3_IRQn);
/* USER CODE BEGIN TIM3_MspInit 1 */
/* USER CODE END TIM1_MspInit 1 */
/* USER CODE END TIM3_MspInit 1 */
}
}
@ -183,19 +231,19 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
*/
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base)
{
if(htim_base->Instance==TIM1)
if(htim_base->Instance==TIM3)
{
/* USER CODE BEGIN TIM1_MspDeInit 0 */
/* USER CODE BEGIN TIM3_MspDeInit 0 */
/* USER CODE END TIM1_MspDeInit 0 */
/* USER CODE END TIM3_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM1_CLK_DISABLE();
__HAL_RCC_TIM3_CLK_DISABLE();
/* TIM1 interrupt DeInit */
HAL_NVIC_DisableIRQ(TIM1_BRK_IRQn);
/* USER CODE BEGIN TIM1_MspDeInit 1 */
/* TIM3 interrupt DeInit */
HAL_NVIC_DisableIRQ(TIM3_IRQn);
/* USER CODE BEGIN TIM3_MspDeInit 1 */
/* USER CODE END TIM1_MspDeInit 1 */
/* USER CODE END TIM3_MspDeInit 1 */
}
}
@ -233,7 +281,7 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USART1 interrupt Init */
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
HAL_NVIC_SetPriority(USART1_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
/* USER CODE BEGIN USART1_MspInit 1 */
@ -262,8 +310,25 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USART2 DMA Init */
/* USART2_RX Init */
hdma_usart2_rx.Instance = DMA1_Channel6;
hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart2_rx.Init.Mode = DMA_NORMAL;
hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;
if (HAL_DMA_Init(&hdma_usart2_rx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(huart,hdmarx,hdma_usart2_rx);
/* USART2 interrupt Init */
HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
HAL_NVIC_SetPriority(USART2_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(USART2_IRQn);
/* USER CODE BEGIN USART2_MspInit 1 */
@ -314,6 +379,9 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
/* USART2 DMA DeInit */
HAL_DMA_DeInit(huart->hdmarx);
/* USART2 interrupt DeInit */
HAL_NVIC_DisableIRQ(USART2_IRQn);
/* USER CODE BEGIN USART2_MspDeInit 1 */

View File

@ -1,4 +1,6 @@
/* USER CODE BEGIN Header */
#include "stdio.h"
#include "rtklib.h"
/**
******************************************************************************
* @file stm32f1xx_it.c
@ -6,12 +8,13 @@
******************************************************************************
* @attention
*
* Copyright (c) 2022 STMicroelectronics.
* All rights reserved.
* <h2><center>&copy; Copyright (c) 2022 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
* 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
*
******************************************************************************
*/
@ -41,7 +44,13 @@
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
int16_t count=0,temp_count=0;
extern uint8_t Rx_Buffer[2500];
nmea_t nmea_gpa;
int8_t flag=0,flag_t=-3;
int GPS_week;
double UTC_time[6],GPS_sec;
extern double time_hh,time_mm,time_ss,time_ms;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
@ -55,7 +64,8 @@
/* USER CODE END 0 */
/* External variables --------------------------------------------------------*/
extern TIM_HandleTypeDef htim1;
extern TIM_HandleTypeDef htim3;
extern DMA_HandleTypeDef hdma_usart2_rx;
extern UART_HandleTypeDef huart1;
extern UART_HandleTypeDef huart2;
/* USER CODE BEGIN EV */
@ -208,24 +218,66 @@ void EXTI0_IRQHandler(void)
/* USER CODE BEGIN EXTI0_IRQn 0 */
/* USER CODE END EXTI0_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
HAL_GPIO_EXTI_IRQHandler(SPI1_INIT1_Pin);
/* USER CODE BEGIN EXTI0_IRQn 1 */
/* USER CODE END EXTI0_IRQn 1 */
}
/**
* @brief This function handles TIM1 break interrupt.
* @brief This function handles EXTI line1 interrupt.
*/
void TIM1_BRK_IRQHandler(void)
void EXTI1_IRQHandler(void)
{
/* USER CODE BEGIN TIM1_BRK_IRQn 0 */
/* USER CODE BEGIN EXTI1_IRQn 0 */
/* USER CODE END TIM1_BRK_IRQn 0 */
HAL_TIM_IRQHandler(&htim1);
/* USER CODE BEGIN TIM1_BRK_IRQn 1 */
/* USER CODE END EXTI1_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
/* USER CODE BEGIN EXTI1_IRQn 1 */
/* USER CODE END TIM1_BRK_IRQn 1 */
/* USER CODE END EXTI1_IRQn 1 */
}
/**
* @brief This function handles DMA1 channel6 global interrupt.
*/
void DMA1_Channel6_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel6_IRQn 0 */
/* USER CODE END DMA1_Channel6_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_usart2_rx);
/* USER CODE BEGIN DMA1_Channel6_IRQn 1 */
/* USER CODE END DMA1_Channel6_IRQn 1 */
}
/**
* @brief This function handles EXTI line[9:5] interrupts.
*/
void EXTI9_5_IRQHandler(void)
{
/* USER CODE BEGIN EXTI9_5_IRQn 0 */
/* USER CODE END EXTI9_5_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(SPI2_INIT1_Pin);
/* USER CODE BEGIN EXTI9_5_IRQn 1 */
/* USER CODE END EXTI9_5_IRQn 1 */
}
/**
* @brief This function handles TIM3 global interrupt.
*/
void TIM3_IRQHandler(void)
{
/* USER CODE BEGIN TIM3_IRQn 0 */
/* USER CODE END TIM3_IRQn 0 */
HAL_TIM_IRQHandler(&htim3);
/* USER CODE BEGIN TIM3_IRQn 1 */
/* USER CODE END TIM3_IRQn 1 */
}
/**
@ -248,14 +300,92 @@ void USART1_IRQHandler(void)
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
uint32_t temp,i;
uint8_t ans=1;
nmea_t* p=&nmea_gpa;
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
/* USER CODE BEGIN USART2_IRQn 1 */
if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE)!=RESET)
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
temp = __HAL_DMA_GET_COUNTER(&hdma_usart2_rx);
HAL_UART_DMAStop(&huart2);
for(i=0;i<2500-temp;i++)
{
ans=input_nmea(p,Rx_Buffer[i]);
}
if(ans==0)
{
// time2epoch(p->sol.utctime,UTC_time);
if(flag_t==-1 || flag_t==20){
GPS_sec=time2gpst(p->sol.time,&GPS_week);
// time_hh=UTC_time[3];
// time_mm=UTC_time[4];
flag_t=0;
}
flag_t+=1;
}
// printf("time: %.0lfh:%.0lfm:%.0lfs \r\n",time_hh,time_mm,time_ss);
HAL_UART_Receive_DMA(&huart2,Rx_Buffer, sizeof(Rx_Buffer));
/* USER CODE END USART2_IRQn 1 */
}
/* USER CODE BEGIN 1 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
extern uint8_t SPI2_INT_RD,SPI1_INT_RD;
if(GPIO_Pin == SPI2_INIT1_Pin)
{
SPI2_INT_RD =1;
}
if(GPIO_Pin == SPI1_INIT1_Pin)
{
SPI1_INT_RD=1;
}
if(GPIO_Pin == GPIO_PIN_1)
{
if(time_ss==59) //ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
{
time_ss=-1;
time_mm+=1;
if(time_mm==60)
{
time_mm=0;
time_hh+=1;
if(time_hh==24)
{
time_hh=0;
}
}
}
time_ss+=1;
time_ms=0;
GPS_sec+=1;
count=__HAL_TIM_GET_COUNTER(&htim3);
temp_count = __HAL_TIM_GET_COUNTER(&htim3);
}
}
double TIM3_Get_100us()
{
extern int16_t count,temp_count;
extern double time_ms,time_ss;
temp_count = __HAL_TIM_GET_COUNTER(&htim3);
if(temp_count >= count)
{
time_ms=(temp_count - count)*0.1; //100ns一次计数
}
else
{
time_ms=(65535-count+temp_count)*0.1; //计数值溢出的情况
}
return time_ms;
}
/* USER CODE END 1 */

View File

@ -2,44 +2,65 @@
CAD.formats=
CAD.pinconfig=
CAD.provider=
Dma.Request0=USART2_RX
Dma.RequestsNb=1
Dma.USART2_RX.0.Direction=DMA_PERIPH_TO_MEMORY
Dma.USART2_RX.0.Instance=DMA1_Channel6
Dma.USART2_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.USART2_RX.0.MemInc=DMA_MINC_ENABLE
Dma.USART2_RX.0.Mode=DMA_NORMAL
Dma.USART2_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.USART2_RX.0.PeriphInc=DMA_PINC_DISABLE
Dma.USART2_RX.0.Priority=DMA_PRIORITY_LOW
Dma.USART2_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
File.Version=6
GPIO.groupedBy=Group By Peripherals
KeepUserPlacement=false
Mcu.CPN=STM32F103C8T6
Mcu.Family=STM32F1
Mcu.IP0=NVIC
Mcu.IP1=RCC
Mcu.IP2=SPI1
Mcu.IP3=SYS
Mcu.IP4=TIM1
Mcu.IP5=USART1
Mcu.IP6=USART2
Mcu.IPNb=7
Mcu.IP0=DMA
Mcu.IP1=NVIC
Mcu.IP2=RCC
Mcu.IP3=SPI1
Mcu.IP4=SPI2
Mcu.IP5=SYS
Mcu.IP6=TIM3
Mcu.IP7=USART1
Mcu.IP8=USART2
Mcu.IPNb=9
Mcu.Name=STM32F103C(8-B)Tx
Mcu.Package=LQFP48
Mcu.Pin0=PA1
Mcu.Pin1=PA2
Mcu.Pin10=PA13
Mcu.Pin11=PA14
Mcu.Pin12=VP_SYS_VS_Systick
Mcu.Pin13=VP_TIM1_VS_ClockSourceINT
Mcu.Pin10=PB14
Mcu.Pin11=PB15
Mcu.Pin12=PA8
Mcu.Pin13=PA9
Mcu.Pin14=PA10
Mcu.Pin15=PA13
Mcu.Pin16=PA14
Mcu.Pin17=VP_SYS_VS_Systick
Mcu.Pin18=VP_TIM3_VS_ClockSourceINT
Mcu.Pin2=PA3
Mcu.Pin3=PA4
Mcu.Pin4=PA5
Mcu.Pin5=PA6
Mcu.Pin6=PA7
Mcu.Pin7=PB0
Mcu.Pin8=PA9
Mcu.Pin9=PA10
Mcu.PinsNb=14
Mcu.Pin8=PB12
Mcu.Pin9=PB13
Mcu.PinsNb=19
Mcu.ThirdPartyNb=0
Mcu.UserConstants=
Mcu.UserName=STM32F103C8Tx
MxCube.Version=6.7.0
MxDb.Version=DB.6.0.70
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.DMA1_Channel6_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.EXTI0_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.EXTI0_IRQn=true\:1\:0\:true\:false\:true\:true\:true\:true
NVIC.EXTI1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.EXTI9_5_IRQn=true\:2\:0\:true\:false\:true\:true\:true\:true
NVIC.ForceEnableDMAVector=true
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
@ -48,9 +69,9 @@ NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false
NVIC.TIM1_BRK_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.USART1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.USART2_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.TIM3_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.USART1_IRQn=true\:3\:0\:true\:false\:true\:true\:true\:true
NVIC.USART2_IRQn=true\:1\:0\:true\:false\:true\:true\:true\:true
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
PA1.GPIOParameters=GPIO_ModeDefaultEXTI
PA1.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING
@ -66,7 +87,8 @@ PA2.Mode=Asynchronous
PA2.Signal=USART2_TX
PA3.Mode=Asynchronous
PA3.Signal=USART2_RX
PA4.GPIOParameters=GPIO_Speed,PinState,GPIO_PuPd
PA4.GPIOParameters=GPIO_Speed,PinState,GPIO_PuPd,GPIO_Label
PA4.GPIO_Label=SPI1_CSN
PA4.GPIO_PuPd=GPIO_PULLUP
PA4.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
PA4.Locked=true
@ -78,12 +100,31 @@ PA6.Mode=Full_Duplex_Master
PA6.Signal=SPI1_MISO
PA7.Mode=Full_Duplex_Master
PA7.Signal=SPI1_MOSI
PA8.GPIOParameters=GPIO_Label
PA8.GPIO_Label=SPI2_INIT1
PA8.Locked=true
PA8.Signal=GPXTI8
PA9.Mode=Asynchronous
PA9.Signal=USART1_TX
PB0.GPIOParameters=GPIO_ModeDefaultEXTI
PB0.GPIOParameters=GPIO_Label,GPIO_ModeDefaultEXTI
PB0.GPIO_Label=SPI1_INIT1
PB0.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING
PB0.Locked=true
PB0.Signal=GPXTI0
PB12.GPIOParameters=GPIO_Speed,PinState,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PB12.GPIO_Label=SPI2_CSN
PB12.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP
PB12.GPIO_PuPd=GPIO_PULLUP
PB12.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
PB12.Locked=true
PB12.PinState=GPIO_PIN_SET
PB12.Signal=GPIO_Output
PB13.Mode=Full_Duplex_Master
PB13.Signal=SPI2_SCK
PB14.Mode=Full_Duplex_Master
PB14.Signal=SPI2_MISO
PB15.Mode=Full_Duplex_Master
PB15.Signal=SPI2_MOSI
PinOutPanel.RotationAngle=0
ProjectManager.AskForMigrate=true
ProjectManager.BackupPrevious=false
@ -112,7 +153,7 @@ ProjectManager.StackSize=0x400
ProjectManager.TargetToolchain=STM32CubeIDE
ProjectManager.ToolChainLocation=
ProjectManager.UnderRoot=true
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_SPI1_Init-SPI1-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_TIM1_Init-TIM1-false-HAL-true,6-MX_USART2_UART_Init-USART2-false-HAL-true
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_SPI1_Init-SPI1-false-HAL-true,5-MX_USART1_UART_Init-USART1-false-HAL-true,6-MX_TIM1_Init-TIM1-false-HAL-true,6-MX_USART2_UART_Init-USART2-false-HAL-true,7-MX_SPI2_Init-SPI2-false-HAL-true
RCC.ADCFreqValue=32000000
RCC.AHBFreq_Value=64000000
RCC.APB1CLKDivider=RCC_HCLK_DIV2
@ -136,6 +177,8 @@ SH.GPXTI0.0=GPIO_EXTI0
SH.GPXTI0.ConfNb=1
SH.GPXTI1.0=GPIO_EXTI1
SH.GPXTI1.ConfNb=1
SH.GPXTI8.0=GPIO_EXTI8
SH.GPXTI8.ConfNb=1
SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_8
SPI1.CLKPhase=SPI_PHASE_2EDGE
SPI1.CLKPolarity=SPI_POLARITY_HIGH
@ -144,19 +187,25 @@ SPI1.Direction=SPI_DIRECTION_2LINES
SPI1.IPParameters=VirtualType,Mode,Direction,BaudRatePrescaler,CalculateBaudRate,CLKPolarity,CLKPhase
SPI1.Mode=SPI_MODE_MASTER
SPI1.VirtualType=VM_MASTER
TIM1.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE
TIM1.ClockDivision=TIM_CLOCKDIVISION_DIV1
TIM1.IPParameters=ClockDivision,AutoReloadPreload,Prescaler,Period
TIM1.Period=6400
TIM1.Prescaler=0
USART1.BaudRate=460800
SPI2.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_4
SPI2.CLKPhase=SPI_PHASE_2EDGE
SPI2.CLKPolarity=SPI_POLARITY_HIGH
SPI2.CalculateBaudRate=8.0 MBits/s
SPI2.Direction=SPI_DIRECTION_2LINES
SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler,CLKPolarity,CLKPhase
SPI2.Mode=SPI_MODE_MASTER
SPI2.VirtualType=VM_MASTER
TIM3.IPParameters=Prescaler
TIM3.Prescaler=6400-1
USART1.BaudRate=921600
USART1.IPParameters=VirtualMode,BaudRate
USART1.VirtualMode=VM_ASYNC
USART2.IPParameters=VirtualMode
USART2.BaudRate=460800
USART2.IPParameters=VirtualMode,BaudRate
USART2.VirtualMode=VM_ASYNC
VP_SYS_VS_Systick.Mode=SysTick
VP_SYS_VS_Systick.Signal=SYS_VS_Systick
VP_TIM1_VS_ClockSourceINT.Mode=Internal
VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT
VP_TIM3_VS_ClockSourceINT.Mode=Internal
VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT
board=custom
isbadioc=false

361
TDK/iam20680.c Normal file
View File

@ -0,0 +1,361 @@
/**
* @file iam20680.c
* @author Joseph Gillispie
* @date 22Aug2022
* @brief This is the source file for the TDK IAM-20680 acceleromter/gyrometer.
*/
/*! @file iam20680.c
* @brief Driver for IAM-20680 sensor
*/
#include "iam20680.h"
/**\name Internal macros */
/**\name Internal APIs */
// Ex: power modes, calibration checks, etc
/*!
* @brief This API must be called before other APIs. It verifies the chip ID of the sensor.
*/
uint8_t iam20680_init(struct iam20680_dev *dev)
{
uint8_t status;
uint8_t buff;
// Reset device to defaults.
buff = 0x80;
status = iam20680_write_regs((uint8_t)IAM20680_PWR_MGMT_1, &buff, 1, dev);
// Check chip ID to ensure IAM-20680 exists on board.
// I2C:0x68 or 0x69 depending upon the value driven on AD0 pin
status = iam20680_read_regs((uint8_t)IAM20680_WHO_AM_I, &buff, 1, dev);
dev->chip_id = buff;
// Configure int pin as data ready.
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_INT_ENABLE, &buff, 1, dev);
buff &= ~0x01;
buff |= 1 << 0; // DATA_RDY_INT_EN
status |= iam20680_write_regs((uint8_t)IAM20680_INT_ENABLE, &buff, 1, dev);
// Set gyro low noise mode.
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_LP_MODE_CFG, &buff, 1, dev);
buff &= ~0x80;
buff |= 1 << 7; // GYRO_CYCLE
status |= iam20680_write_regs((uint8_t)IAM20680_LP_MODE_CFG, &buff, 1, dev);
// Set accel low noise mode.
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_PWR_MGMT_1, &buff, 1, dev);
buff &= ~0x20;
buff |= 1 << 5; // ACCEL_CYCLE
status |= iam20680_write_regs((uint8_t)IAM20680_PWR_MGMT_1, &buff, 1, dev);
// Wait 20 ms.
iam20680_delay_ms(20, dev);
// Bypass gyro DLPF.
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_GYRO_CONFIG, &buff, 1, dev);
buff &= ~0x03;
buff |= 0 << 0; // FCHOICE
status |= iam20680_write_regs((uint8_t)IAM20680_GYRO_CONFIG, &buff, 1, dev);
// Bypass accel DLPF.
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_ACCEL_CONFIG2, &buff, 1, dev);
buff &= ~0x08;
buff |= 0 << 3; // ACCEL_FCHOICE_B
status |= iam20680_write_regs((uint8_t)IAM20680_ACCEL_CONFIG2, &buff, 1, dev);
// Set DLPF_CFG.
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_CONFIG, &buff, 1, dev);
buff &= ~0x07;
buff |= 1 << 0; // DLPF_CFG
status |= iam20680_write_regs((uint8_t)IAM20680_CONFIG, &buff, 1, dev);
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_ACCEL_CONFIG2, &buff, 1, dev);
buff &= ~0x07;
buff |= 1 << 0; // A_DLPF_CFG
status |= iam20680_write_regs((uint8_t)IAM20680_ACCEL_CONFIG2, &buff, 1, dev);
// Set averaging filter.
// Gyro
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_LP_MODE_CFG, &buff, 1, dev);
buff &= ~0x70;
buff |= 0 << 4; // G_AVGCFG
status |= iam20680_write_regs((uint8_t)IAM20680_LP_MODE_CFG, &buff, 1, dev);
// Accel
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_ACCEL_CONFIG2, &buff, 1, dev);
buff &= ~0x30;
buff |= 0 << 4; // DEC2_CFG
status |= iam20680_write_regs((uint8_t)IAM20680_ACCEL_CONFIG2, &buff, 1, dev);
// Set SMPLRT_DIV.
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_SMPLRT_DIV, &buff, 1, dev);
buff = 0x09; // 10 ms / 100 Hz
status |= iam20680_write_regs((uint8_t)IAM20680_SMPLRT_DIV, &buff, 1, dev);
// Disable accel and gyro all axes.
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_PWR_MGMT_2, &buff, 1, dev);
buff |= 0x3F;
status |= iam20680_write_regs((uint8_t)IAM20680_PWR_MGMT_2, &buff, 1, dev);
// Set full scale range.
// Gyro
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_GYRO_CONFIG, &buff, 1, dev);
buff &= ~0x18;
buff |= 1 << 3; // FS_SEL
status |= iam20680_write_regs((uint8_t)IAM20680_GYRO_CONFIG, &buff, 1, dev);
// Accel
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_ACCEL_CONFIG, &buff, 1, dev);
buff &= ~0x18;
buff |= 0 << 3; // ACCEL_FS_SEL
status |= iam20680_write_regs((uint8_t)IAM20680_ACCEL_CONFIG, &buff, 1, dev);
// Enable accel.
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_PWR_MGMT_2, &buff, 1, dev);
buff &= ~0x38;
buff |= 0 << 3; // Enable x, y, and z.
status |= iam20680_write_regs((uint8_t)IAM20680_PWR_MGMT_2, &buff, 1, dev);
iam20680_delay_ms(20, dev);
// Enable gyro.
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_PWR_MGMT_2, &buff, 1, dev);
buff &= ~0x07;
buff |= 0 << 0; // Enable x, y, and z.
status |= iam20680_write_regs((uint8_t)IAM20680_PWR_MGMT_2, &buff, 1, dev);
iam20680_delay_ms(50, dev);
// Reset and enable FIFO.
// Disable FIFO
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_USER_CTRL, &buff, 1, dev);
buff &= ~0x40;
buff |= 0 << 6; // FIFO_EN
status |= iam20680_write_regs((uint8_t)IAM20680_USER_CTRL, &buff, 1, dev);
// Reset FIFO
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_USER_CTRL, &buff, 1, dev);
buff &= ~0x04;
buff |= 1 << 2; // FIFO_RST
status |= iam20680_write_regs((uint8_t)IAM20680_USER_CTRL, &buff, 1, dev);
// Enable gyro FIFO
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_FIFO_EN, &buff, 1, dev);
buff &= ~0x70;
buff |= 7 << 4; // Write x, y, and z to FIFO at data rate.
status |= iam20680_write_regs((uint8_t)IAM20680_FIFO_EN, &buff, 1, dev);
// Enable accel FIFO
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_FIFO_EN, &buff, 1, dev);
buff &= ~0x08;
buff |= 1 << 3; // Write x, y, and z to FIFO at data rate.
status |= iam20680_write_regs((uint8_t)IAM20680_FIFO_EN, &buff, 1, dev);
// Enable FIFO
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_USER_CTRL, &buff, 1, dev);
buff &= ~0x40;
buff |= 1 << 6; // FIFO_EN
status |= iam20680_write_regs((uint8_t)IAM20680_USER_CTRL, &buff, 1, dev);
return status;
}
/*!
* @brief This API must be called before other APIs. It verifies the chip ID of the sensor.
*/
uint8_t iam20680_init2(struct iam20680_dev *dev)
{
uint8_t status = 0x00;
uint8_t buff;
// Delay 100 ms from power-up before register read/write.
iam20680_delay_ms(100, dev);
// Disable I2C.
status |= iam20680_read_regs((uint8_t)IAM20680_USER_CTRL, &buff, 1, dev);
buff |= 0x10; // I2C_IF_DIS
status |= iam20680_write_regs((uint8_t)IAM20680_USER_CTRL, &buff, 1, dev);
// Check WHO_AM_I register.
status = iam20680_read_regs((uint8_t)IAM20680_WHO_AM_I, &buff, 1, dev);
dev->chip_id = buff;
// Reset driver states.
status |= iam20680_read_regs((uint8_t)IAM20680_PWR_MGMT_1, &buff, 1, dev);
buff |= 0x80; // DEVICE_RESET
status |= iam20680_write_regs((uint8_t)IAM20680_PWR_MGMT_1, &buff, 1, dev);
iam20680_delay_ms(100, dev);
//buff = 0x00;
while ((buff & (0x80)) != 0x00)
{
iam20680_read_regs((uint8_t)IAM20680_PWR_MGMT_1, &buff, 1, dev);
iam20680_delay_ms(1, dev);
}
// Disable I2C.
status |= iam20680_read_regs((uint8_t)IAM20680_USER_CTRL, &buff, 1, dev);
buff |= 0x10; // I2C_IF_DIS
status |= iam20680_write_regs((uint8_t)IAM20680_USER_CTRL, &buff, 1, dev);
// Wake up.
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_PWR_MGMT_1, &buff, 1, dev);
buff &= ~0x40; // SLEEP
status |= iam20680_write_regs((uint8_t)IAM20680_PWR_MGMT_1, &buff, 1, dev);
iam20680_delay_ms(5, dev);
// Set up CLKSEL.
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_PWR_MGMT_1, &buff, 1, dev);
buff &= ~0x07; // Clear CLKSEL
buff |= 0x01; // Set CLKSEL
status |= iam20680_write_regs((uint8_t)IAM20680_PWR_MGMT_1, &buff, 1, dev);
// Disable gyro and accel.
// Set full scale range.
// Set bandwidth.
// Set averaging filter.
// Set sampling rate.
// Disable FIFO.
// Configure FIFO.
// Enable Data Ready interrupt.
return status;
}
/*!
* @brief This API must be called before other APIs. It verifies the chip ID of the sensor.
*/
uint8_t iam20680_init_simple(struct iam20680_dev *dev)
{
uint8_t buff;
uint8_t status = 0x00;
// Reset driver states.
status |= iam20680_read_regs((uint8_t)IAM20680_PWR_MGMT_1, &buff, 1, dev);
buff |= 0x80; // DEVICE_RESET
status |= iam20680_write_regs((uint8_t)IAM20680_PWR_MGMT_1, &buff, 1, dev);
iam20680_delay_ms(100, dev);
//buff = 0x00;
while ((buff & (0x80)) != 0x00)
{
iam20680_read_regs((uint8_t)IAM20680_PWR_MGMT_1, &buff, 1, dev);
iam20680_delay_ms(1, dev);
}
// Let device select best clock source.
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_PWR_MGMT_1, &buff, 1, dev);
buff &= ~0x07; // Clear CLKSEL
buff |= 0x01; // Set CLKSEL
status |= iam20680_write_regs((uint8_t)IAM20680_PWR_MGMT_1, &buff, 1, dev);
// Select ODR.
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_SMPLRT_DIV, &buff, 1, dev);
buff = 0x09; // Set ODR = 100 Hz
status |= iam20680_write_regs((uint8_t)IAM20680_PWR_MGMT_1, &buff, 1, dev);
// Select FS range.
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_ACCEL_CONFIG, &buff, 1, dev);
buff &= 0x18;
buff |= 0 << 3;
status |= iam20680_write_regs((uint8_t)IAM20680_ACCEL_CONFIG, &buff, 1, dev);
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_GYRO_CONFIG, &buff, 1, dev);
buff &= 0x18;
buff |= 0 << 3;
status |= iam20680_write_regs((uint8_t)IAM20680_GYRO_CONFIG, &buff, 1, dev);
// Select filter.
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_ACCEL_CONFIG2, &buff, 1, dev);
buff &= 0x07;
buff |= 5 << 0;
status |= iam20680_write_regs((uint8_t)IAM20680_ACCEL_CONFIG2, &buff, 1, dev);
buff = 0x00;
status |= iam20680_read_regs((uint8_t)IAM20680_CONFIG, &buff, 1, dev);
buff &= 0x07;
buff |= 5 << 0;
status |= iam20680_write_regs((uint8_t)IAM20680_CONFIG, &buff, 1, dev);
return status;
}
/*!
* @brief This API writes the data to the given register address of the sensor.
*/
uint8_t iam20680_write_regs(uint8_t reg_addr, uint8_t *reg_data, uint8_t len, struct iam20680_dev *dev)
{
// Write the data.
dev->status = dev->write(reg_addr, reg_data, len);
return dev->status;
}
/*!
* @brief This api reads the data from the given register address of the sensor.
*/
uint8_t iam20680_read_regs(uint8_t reg_addr, uint8_t *reg_data, uint8_t len, struct iam20680_dev *dev)
{
// Check if SPI is used.
if (dev->interface == IAM20680_SPI)
{
reg_addr |= 0x80;
}
// Read the data.
dev->status = dev->read(reg_addr, reg_data, len);
return dev->status;
}
/*!
* @brief This api provides and blocking ms delay function.
*/
uint8_t iam20680_delay_ms(uint32_t delay, struct iam20680_dev *dev)
{
dev->status = 1;
dev->delay(delay);
dev->status = 0;
return dev->status;
}
/*!
* @brief This api gets acceleromter, temperature, and gyrometer data.
*/
uint8_t iam20680_get_data(struct iam20680_data *data, struct iam20680_dev *dev)
{
uint8_t buff[14] = {0}; // Accel, temp, and gyro two bytes each.
dev->status = iam20680_read_regs((uint8_t)IAM20680_ACCEL_XOUT_H, &buff[0], sizeof(buff), dev);
data->accel_x = (buff[0] << 8) | buff[1];
data->accel_y = (buff[2] << 8) | buff[3];
data->accel_z = (buff[4] << 8) | buff[5];
data->temp = (buff[6] << 8) | buff[7];
data->gyro_x = (buff[8] << 8) | buff[9];
data->gyro_y = (buff[10] << 8) | buff[11];
data->gyro_z = (buff[12] << 8) | buff[13];
return dev->status;
}

329
TDK/iam20680.h Normal file
View File

@ -0,0 +1,329 @@
/**
* @file iam20680.h
* @author Joseph Gillispie
* @date 22Aug2022
* @brief This is the header file for the TDK IAM-20680 acceleromter/gyrometer.
*/
#ifndef __IAM20680_H
#define __IAM20680_H
#ifdef __cplusplus
extern "C" {
#endif
/*****************************************************************************
* INCLUDES
****************************************************************************/
/**
* @brief Required includes
*/
#include <stdio.h>
#include <stdint.h>
/*****************************************************************************
* MACROS AND DEFINES
****************************************************************************/
/**
* @brief Register addresses
*/
#define IAM20680_SELF_TEST_X_GYRO 0x00
#define IAM20680_SELF_TEST_Y_GYRO 0x01
#define IAM20680_SELF_TEST_Z_GYRO 0x02
#define IAM20680_SELF_TEST_X_ACCEL 0x0D
#define IAM20680_SELF_TEST_Y_ACCEL 0x0E
#define IAM20680_SELF_TEST_Z_ACCEL 0x0F
#define IAM20680_XG_OFFS_USRH 0x13
#define IAM20680_XG_OFFS_USRL 0x14
#define IAM20680_YG_OFFS_USRH 0x15
#define IAM20680_YG_OFFS_USRL 0x16
#define IAM20680_ZG_OFFS_USRH 0x17
#define IAM20680_ZG_OFFS_USRL 0x18
#define IAM20680_SMPLRT_DIV 0x19
#define IAM20680_CONFIG 0x1A
#define IAM20680_GYRO_CONFIG 0x1B
#define IAM20680_ACCEL_CONFIG 0x1C
#define IAM20680_ACCEL_CONFIG2 0x1D
#define IAM20680_LP_MODE_CFG 0x1E
#define IAM20680_ACCEL_WOM_THR 0x1F
#define IAM20680_FIFO_EN 0x23
#define IAM20680_FSYNC_INT 0x36
#define IAM20680_INT_PIN_CFG 0x37
#define IAM20680_INT_ENABLE 0x38
#define IAM20680_INT_STATUS 0x3A
#define IAM20680_ACCEL_XOUT_H 0x3B
#define IAM20680_ACCEL_XOUT_L 0x3C
#define IAM20680_ACCEL_YOUT_H 0x3D
#define IAM20680_ACCEL_YOUT_L 0x3E
#define IAM20680_ACCEL_ZOUT_H 0x3F
#define IAM20680_ACCEL_ZOUT_L 0x40
#define IAM20680_TEMP_OUT_H 0x41
#define IAM20680_TEMP_OUT_L 0x42
#define IAM20680_GYRO_XOUT_H 0x43
#define IAM20680_GYRO_XOUT_L 0x44
#define IAM20680_GYRO_YOUT_H 0x45
#define IAM20680_GYRO_YOUT_L 0x46
#define IAM20680_GYRO_ZOUT_H 0x47
#define IAM20680_GYRO_ZOUT_L 0x48
#define IAM20680_SIGNAL_PATH_RESET 0x68
#define IAM20680_ACCEL_INTEL_CTRL 0x69
#define IAM20680_USER_CTRL 0x6A
#define IAM20680_PWR_MGMT_1 0x6B
#define IAM20680_PWR_MGMT_2 0x6C
#define IAM20680_FIFO_COUNTH 0x72
#define IAM20680_FIFO_COUNTL 0x73
#define IAM20680_FIFO_R_W 0x74
#define IAM20680_WHO_AM_I 0x75
#define IAM20680_XA_OFFSET_H 0x77
#define IAM20680_XA_OFFSET_L 0x78
#define IAM20680_YA_OFFSET_H 0x7A
#define IAM20680_YA_OFFSET_L 0x7B
#define IAM20680_ZA_OFFSET_H 0x7D
#define IAM20680_ZA_OFFSET_L 0x7E
/**\name Status */
#define IAM20680_OK 0x00 /*< OK */
#define IAM20680_ERR 0x01 /*< ERROR */
/**\name Who Am I */
#define IAM20680_CHIP_ID 0xA9
/**\name Interface */
#define IAM20680_SPI 0x00
#define IAM20680_I2C 0x01
/*****************************************************************************
* TYPEDEFS
****************************************************************************/
/**
* @brief Type definitions
*/
/**
* @brief Bus communication read function pointer. This should be mapped to
* the platform-specific read function of the user application.
*
* @param[in] reg_addr : Register address from which data is read.
* @param[in] reg_data : Pointer to data buffer where read data is stored.
* @param[in] len : Number of bytes of data to be read.
*
* @retval 0 -> Success.
* @retval Non-zero -> Fail.
*/
typedef uint8_t (*iam20680_read_fptr_typedef)(uint8_t reg_addr, uint8_t *reg_data, uint16_t len);
/**
* @brief Bus communication write function pointer. Should be mapped to
* the platform-specific write function of the user application.
*
* @param[in] reg_addr : Register address to which data is written.
* @param[in] reg_data : Pointer to data buffer in which data to be written is stored.
* @param[in] len : Number of bytes of data to write.
*
* @retval 0 -> Success.
* @retval Non-zero -> Fail.
*/
typedef uint8_t (*iam20680_write_fptr_typedef)(uint8_t reg_addr, uint8_t *reg_data, uint16_t len);
/**
* @brief Timer delay function pointer. This function should be mapped to a platform-specific
* hardware timer.
*
* @param[in] delay : Desired delay in ms.
*
* @retval 0 -> Success.
* @retval Non-zero -> Fail.
*/
typedef void (*iam20680_delay_fptr_typedef)(uint32_t delay);
/**
* @brief IAM-20680 accelerometer and gyrometer data.
*/
struct iam20680_data {
int16_t accel_x; /*< Acclerometer x data */
int16_t accel_y; /*< Acclerometer y data */
int16_t accel_z; /*< Acclerometer z data */
int16_t temp; /*< Temperature data */
int16_t gyro_x; /*< Gyrometer x data */
int16_t gyro_y; /*< Gyrometer y data */
int16_t gyro_z; /*< Gyrometer z data */
};
/**
* @brief IAM-20680 register settings.
*/
struct iam20680_settings {
};
/**
* @brief IAM-20680 device parameters.
*/
struct iam20680_dev {
iam20680_read_fptr_typedef read; /*< Read function pointer */
iam20680_write_fptr_typedef write; /*< Write function pointer */
iam20680_delay_fptr_typedef delay; /*< Delay function pointer */
uint8_t interface; /*< Interface type (I2C, SPI) */
struct iam20680_settings settings; /*< Sensor settings */
uint8_t status; /*< Returned status of read/write functions */
uint8_t chip_id; /*< Chip ID */
};
/*****************************************************************************
* GLOBAL FUNCTION PROTOTYPES
****************************************************************************/
/**
* \ingroup iam20680
* \defgroup iam20680ApiInit Initialization
* @brief Initialize the sensor and device structure
*/
/*!
* \ingroup iam20680ApiInit
* \page iam20680_api_iam20680_init iam20680_init
* \code
* uint8_t iam20680_init(struct iam20680_dev *dev);
* \endcode
* @details This API must be called before other APIs. It verifies the chip ID of the sensor.
*
* @param[in, out] dev : Structure Instance of iam20680_dev
* @return Result of API execution status.
*
* @retval 0 -> Success
* @retval Non-zero -> Fail
*/
uint8_t iam20680_init(struct iam20680_dev *dev);
/**
* \ingroup iam20680
* \defgroup iam20680ApiInit2 Initialization
* @brief Initialize the sensor and device structure
*/
/*!
* \ingroup iam20680ApiInit2
* \page iam20680_api_iam20680_init2 iam20680_init2
* \code
* uint8_t iam20680_init2(struct iam20680_dev *dev);
* \endcode
* @details This API must be called before other APIs. It verifies the chip ID of the sensor.
*
* @param[in, out] dev : Structure Instance of iam20680_dev
* @return Result of API execution status.
*
* @retval 0 -> Success
* @retval Non-zero -> Fail
*/
uint8_t iam20680_init2(struct iam20680_dev *dev);
/*!
* \ingroup iam20680ApiInit2
* \page iam20680_api_iam20680_init_simple iam20680_init_simple
* \code
* uint8_t iam20680_init_simple(struct iam20680_dev *dev);
* \endcode
* @details This API must be called before other APIs. It verifies the chip ID of the sensor.
*
* @param[in, out] dev : Structure Instance of iam20680_dev
* @return Result of API execution status.
*
* @retval 0 -> Success
* @retval Non-zero -> Fail
*/
uint8_t iam20680_init_simple(struct iam20680_dev *dev);
/**
* \ingroup iam20680
* \defgroup iam20680ApiRegister Registers
* @brief Generic API for accessing sensor registers
*/
/*!
* \ingroup iam20680ApiRegister
* \page iam20680_api_iam20680_write_regs iam20680_write_regs
* \code
* uint8_t iam20680_write_regs(uint8_t reg_addr, uint8_t *reg_data, uint8_t len, struct iam20680_dev *dev);
* \endcode
* @details This API writes the given data to the register address of the sensor
*
* @param[in] reg_addr : Register address to where the data is to be written.
* @param[in] reg_data : Pointer to data buffer which is to be written in the reg_addr of sensor.
* @param[in] len : Number of bytes of data to write.
* @param[in, out] : Structure instance of iam20680_dev.
*
* @regurn Result of API execution status.
*
* @retval 0 -> Success.
* @retvan Non-zero -> Fail.
*
*/
uint8_t iam20680_write_regs(uint8_t reg_addr, uint8_t *reg_data, uint8_t len, struct iam20680_dev *dev);
/*!
* \ingroup iam20680ApiRegister
* \page iam20680_api_iam20680_read_regs iam20680_read_regs
* \code
* uint8_t iam20680_read_regs(uint8_t reg_addr, uint8_t *reg_data, uint8_t len, struct iam20680_dev *dev);
* \endcode
* @details This API writes the given data to the register address of the sensor
*
* @param[in] reg_addr : Register address from where the data is to be read.
* @param[in] reg_data : Pointer to data buffer to store the read data.
* @param[in] len : Number of bytes of data to be read.
* @param[in, out] : Structure instance of iam20680_dev.
*
* @regurn Result of API execution status.
*
* @retval 0 -> Success.
* @retvan Non-zero -> Fail.
*
*/
uint8_t iam20680_read_regs(uint8_t reg_addr, uint8_t *reg_data, uint8_t len, struct iam20680_dev *dev);
/*!
* \ingroup iam20680ApiRegister
* \page iam20680_api_iam20680_delay iam20680_delay
* \code
* uint8_t iam20680_delay(uint32_t delay, iam20680_dev *dev);
* \endcode
* @details This API provides a blocking delay with one ms resolution
*
* @param[in] delay : Delay in ms.
* @param[in, out] : Structure instance of iam20680_dev.
*
* @regurn Result of API execution status.
*
* @retval 0 -> Success.
* @retvan Non-zero -> Fail.
*
*/
uint8_t iam20680_delay_ms(uint32_t delay, struct iam20680_dev *dev);
/*!
* \ingroup iam20680ApiRegister
* \page iam20680_api_iam20680_get_data iam20680_delay
* \code
* uint8_t iam20680_get_data(struct iam20680_data *data, iam20680_dev *dev);
* \endcode
* @details This API gets accelerometer, temperature, and gyrometer data
*
* @param[in] data : Data structure to store sensor readings.
* @param[in, out] : Structure instance of iam20680_dev.
*
* @regurn Result of API execution status.
*
* @retval 0 -> Success.
* @retvan Non-zero -> Fail.
*
*/
uint8_t iam20680_get_data(struct iam20680_data *data, struct iam20680_dev *dev);
#ifdef __cplusplus
}
#endif
#endif /* __IAM20680_H */

36
TDK/user_iam20680.c Normal file
View File

@ -0,0 +1,36 @@
#include "user_iam20680.h"
struct iam20680_dev spi2_dev;
extern SPI_HandleTypeDef hspi2;
uint8_t iam_read(uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi2, &reg_addr, 1, 1000);
HAL_SPI_Receive(&hspi2,reg_data, len, 1000);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
return 0;
}
uint8_t iam_write(uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi2, &reg_addr, 1, 1000);
HAL_SPI_Transmit(&hspi2, reg_data, len, 1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET);
return 0;
}
void user_dev_init1()
{
spi2_dev.delay=HAL_Delay;
spi2_dev.interface = IAM20680_SPI;
spi2_dev.read=iam_read;
spi2_dev.write=iam_write;
iam20680_init(&spi2_dev);
}

20
TDK/user_iam20680.h Normal file
View File

@ -0,0 +1,20 @@
/*
* user_iam20680.h
*
* Created on: Dec 7, 2022
* Author: FizeC
*/
#ifndef USER_IAM20680_H_
#define USER_IAM20680_H_
#include <string.h>
#include <stdio.h>
#include "rtklib.h"
#include "iam20680.h"
#include "stm32f1xx_hal.h"
void user_dev_init1();
extern struct iam20680_dev spi2_dev;
#endif /* USER_IAM20680_H_ */

View File

@ -15,7 +15,7 @@
//#define SQR(x) ((x) * (x))
//#define MAX_VAR_EPH SQR(300.0) /* max variance eph to reject satellite (m^2) */
//
//static const double gpst0[] = {1980, 1, 6, 0, 0, 0}; /* gps time reference */
static const double gpst0[] = {1980, 1, 6, 0, 0, 0}; /* gps time reference */
//static const double gst0[] = {1999, 8, 22, 0, 0, 0}; /* galileo system time reference */
//static const double bdt0[] = {2006, 1, 1, 0, 0, 0}; /* beidou time reference */
//
@ -1615,37 +1615,37 @@ static double leaps[MAXLEAPS + 1][7] = {/* leap seconds (y,m,d,h,m,s,utc-gpst) *
//// time.sec = ep[5] - sec;
//// return time;
////}
///* time to calendar day/time ---------------------------------------------------
// * convert gtime_t struct to calendar day/time
// * args : gtime_t t I gtime_t struct
// * double *ep O day/time {year,month,day,hour,min,sec}
// * return : none
// * notes : proper in 1970-2037 or 1970-2099 (64bit time_t)
// *-----------------------------------------------------------------------------*/
//extern void time2epoch(gtime_t t, double *ep)
//{
// const int mday[] = {/* # of days in a month */
// 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
// 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// int days, sec, mon, day;
//
// /* leap year if year%4==0 in 1901-2099 */
// days = (int)(t.time / 86400);
// sec = (int)(t.time - (time_t)days * 86400);
// for (day = days % 1461, mon = 0; mon < 48; mon++)
// {
// if (day >= mday[mon])
// day -= mday[mon];
// else
// break;
// }
// ep[0] = 1970 + days / 1461 * 4 + mon / 12;
// ep[1] = mon % 12 + 1;
// ep[2] = day + 1;
// ep[3] = sec / 3600;
// ep[4] = sec % 3600 / 60;
// ep[5] = sec % 60 + t.sec;
//}
/* time to calendar day/time ---------------------------------------------------
* convert gtime_t struct to calendar day/time
* args : gtime_t t I gtime_t struct
* double *ep O day/time {year,month,day,hour,min,sec}
* return : none
* notes : proper in 1970-2037 or 1970-2099 (64bit time_t)
*-----------------------------------------------------------------------------*/
extern void time2epoch(gtime_t t, double *ep)
{
const int mday[] = {/* # of days in a month */
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int days, sec, mon, day;
/* leap year if year%4==0 in 1901-2099 */
days = (int)(t.time / 86400);
sec = (int)(t.time - (time_t)days * 86400);
for (day = days % 1461, mon = 0; mon < 48; mon++)
{
if (day >= mday[mon])
day -= mday[mon];
else
break;
}
ep[0] = 1970 + days / 1461 * 4 + mon / 12;
ep[1] = mon % 12 + 1;
ep[2] = day + 1;
ep[3] = sec / 3600;
ep[4] = sec % 3600 / 60;
ep[5] = sec % 60 + t.sec;
}
///* same as above but output limited to n decimals for formatted output */
//extern void time2epoch_n(gtime_t t, double *ep, int n)
//{
@ -1676,22 +1676,22 @@ static double leaps[MAXLEAPS + 1][7] = {/* leap seconds (y,m,d,h,m,s,utc-gpst) *
// t.sec = sec - (int)sec;
// return t;
//}
///* time to gps time ------------------------------------------------------------
// * convert gtime_t struct to week and tow in gps time
// * args : gtime_t t I gtime_t struct
// * int *week IO week number in gps time (NULL: no output)
// * return : time of week in gps time (s)
// *-----------------------------------------------------------------------------*/
//extern double time2gpst(gtime_t t, int *week)
//{
// gtime_t t0 = epoch2time(gpst0);
// time_t sec = t.time - t0.time;
// int w = (int)(sec / (86400 * 7));
//
// if (week)
// *week = w;
// return (double)(sec - (double)w * 86400 * 7) + t.sec;
//}
/* time to gps time ------------------------------------------------------------
* convert gtime_t struct to week and tow in gps time
* args : gtime_t t I gtime_t struct
* int *week IO week number in gps time (NULL: no output)
* return : time of week in gps time (s)
*-----------------------------------------------------------------------------*/
extern double time2gpst(gtime_t t, int *week)
{
gtime_t t0 = epoch2time(gpst0);
time_t sec = t.time - t0.time;
int w = (int)(sec / (86400 * 7));
if (week)
*week = w;
return (double)(sec - (double)w * 86400 * 7) + t.sec;
}
///* galileo system time to time -------------------------------------------------
// * convert week and tow in galileo system time (gst) to gtime_t struct
// * args : int week I week number in gst