mirror of
https://gitee.com/dlmu-cone/bf_original_balance_chassis
synced 2026-07-23 19:25:09 +08:00
中断读取bmi088 修改部分文档
This commit is contained in:
9
.Doc/版本更替.md
Normal file
9
.Doc/版本更替.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# 版本更替
|
||||
|
||||
随着比赛的推进,我们的代码也在不断的更新,在不同的结点下会发布稳定可用版本,以便于大家使用。
|
||||
|
||||
指路gitee release页面:[https://gitee.com/hnuyuelurm/basic_framework/tags](https://gitee.com/hnuyuelurm/basic_framework/tags)
|
||||
|
||||
release页面会有一个版本号,例如`v1.0`,这个版本号就是我们的代码版本号,每次发布新的版本,版本号都会增加。
|
||||
|
||||
第一次使用尽量避免直接clone
|
||||
16
.mxproject
16
.mxproject
File diff suppressed because one or more lines are too long
@@ -57,8 +57,6 @@ void EXTI3_IRQHandler(void);
|
||||
void EXTI4_IRQHandler(void);
|
||||
void DMA1_Stream1_IRQHandler(void);
|
||||
void DMA1_Stream2_IRQHandler(void);
|
||||
void DMA1_Stream3_IRQHandler(void);
|
||||
void DMA1_Stream4_IRQHandler(void);
|
||||
void CAN1_RX0_IRQHandler(void);
|
||||
void CAN1_RX1_IRQHandler(void);
|
||||
void EXTI9_5_IRQHandler(void);
|
||||
@@ -73,7 +71,6 @@ void DMA1_Stream7_IRQHandler(void);
|
||||
void DMA2_Stream0_IRQHandler(void);
|
||||
void DMA2_Stream2_IRQHandler(void);
|
||||
void DMA2_Stream3_IRQHandler(void);
|
||||
void DMA2_Stream4_IRQHandler(void);
|
||||
void CAN2_RX0_IRQHandler(void);
|
||||
void CAN2_RX1_IRQHandler(void);
|
||||
void OTG_FS_IRQHandler(void);
|
||||
|
||||
2
Makefile
2
Makefile
@@ -1,5 +1,5 @@
|
||||
##########################################################################################################################
|
||||
# File automatically-generated by tool: [projectgenerator] version: [3.18.0-B7] date: [Thu Apr 13 18:20:17 CST 2023]
|
||||
# File automatically-generated by tool: [projectgenerator] version: [3.19.2] date: [Sat Dec 09 14:32:18 CST 2023]
|
||||
##########################################################################################################################
|
||||
|
||||
# ------------------------------------------------
|
||||
|
||||
24
Src/adc.c
24
Src/adc.c
@@ -25,7 +25,6 @@
|
||||
/* USER CODE END 0 */
|
||||
|
||||
ADC_HandleTypeDef hadc1;
|
||||
DMA_HandleTypeDef hdma_adc1;
|
||||
|
||||
/* ADC1 init function */
|
||||
void MX_ADC1_Init(void)
|
||||
@@ -85,26 +84,6 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
|
||||
/* USER CODE END ADC1_MspInit 0 */
|
||||
/* ADC1 clock enable */
|
||||
__HAL_RCC_ADC1_CLK_ENABLE();
|
||||
|
||||
/* ADC1 DMA Init */
|
||||
/* ADC1 Init */
|
||||
hdma_adc1.Instance = DMA2_Stream4;
|
||||
hdma_adc1.Init.Channel = DMA_CHANNEL_0;
|
||||
hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
|
||||
hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
|
||||
hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
|
||||
hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
|
||||
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
|
||||
hdma_adc1.Init.Mode = DMA_NORMAL;
|
||||
hdma_adc1.Init.Priority = DMA_PRIORITY_LOW;
|
||||
hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
|
||||
if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
__HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
|
||||
|
||||
/* USER CODE BEGIN ADC1_MspInit 1 */
|
||||
|
||||
/* USER CODE END ADC1_MspInit 1 */
|
||||
@@ -121,9 +100,6 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
|
||||
/* USER CODE END ADC1_MspDeInit 0 */
|
||||
/* Peripheral clock disable */
|
||||
__HAL_RCC_ADC1_CLK_DISABLE();
|
||||
|
||||
/* ADC1 DMA DeInit */
|
||||
HAL_DMA_DeInit(adcHandle->DMA_Handle);
|
||||
/* USER CODE BEGIN ADC1_MspDeInit 1 */
|
||||
|
||||
/* USER CODE END ADC1_MspDeInit 1 */
|
||||
|
||||
15
Src/dma.c
15
Src/dma.c
@@ -50,29 +50,20 @@ void MX_DMA_Init(void)
|
||||
/* DMA1_Stream2_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA1_Stream2_IRQn, 5, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA1_Stream2_IRQn);
|
||||
/* DMA1_Stream3_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA1_Stream3_IRQn, 5, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn);
|
||||
/* DMA1_Stream4_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA1_Stream4_IRQn, 5, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA1_Stream4_IRQn);
|
||||
/* DMA1_Stream7_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA1_Stream7_IRQn, 5, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA1_Stream7_IRQn);
|
||||
/* DMA2_Stream0_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 5, 0);
|
||||
HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);
|
||||
/* DMA2_Stream2_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 5, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);
|
||||
/* DMA2_Stream3_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 5, 0);
|
||||
HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn);
|
||||
/* DMA2_Stream4_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA2_Stream4_IRQn, 5, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA2_Stream4_IRQn);
|
||||
/* DMA2_Stream5_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA2_Stream5_IRQn, 5, 0);
|
||||
HAL_NVIC_SetPriority(DMA2_Stream5_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA2_Stream5_IRQn);
|
||||
/* DMA2_Stream6_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA2_Stream6_IRQn, 5, 0);
|
||||
|
||||
53
Src/spi.c
53
Src/spi.c
@@ -28,8 +28,6 @@ SPI_HandleTypeDef hspi1;
|
||||
SPI_HandleTypeDef hspi2;
|
||||
DMA_HandleTypeDef hdma_spi1_rx;
|
||||
DMA_HandleTypeDef hdma_spi1_tx;
|
||||
DMA_HandleTypeDef hdma_spi2_rx;
|
||||
DMA_HandleTypeDef hdma_spi2_tx;
|
||||
|
||||
/* SPI1 init function */
|
||||
void MX_SPI1_Init(void)
|
||||
@@ -139,7 +137,7 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
|
||||
hdma_spi1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
||||
hdma_spi1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
||||
hdma_spi1_rx.Init.Mode = DMA_NORMAL;
|
||||
hdma_spi1_rx.Init.Priority = DMA_PRIORITY_LOW;
|
||||
hdma_spi1_rx.Init.Priority = DMA_PRIORITY_HIGH;
|
||||
hdma_spi1_rx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
|
||||
hdma_spi1_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
|
||||
hdma_spi1_rx.Init.MemBurst = DMA_MBURST_SINGLE;
|
||||
@@ -160,7 +158,7 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
|
||||
hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
||||
hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
||||
hdma_spi1_tx.Init.Mode = DMA_NORMAL;
|
||||
hdma_spi1_tx.Init.Priority = DMA_PRIORITY_LOW;
|
||||
hdma_spi1_tx.Init.Priority = DMA_PRIORITY_HIGH;
|
||||
hdma_spi1_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
|
||||
if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK)
|
||||
{
|
||||
@@ -197,49 +195,6 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
|
||||
GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
|
||||
/* SPI2 DMA Init */
|
||||
/* SPI2_RX Init */
|
||||
hdma_spi2_rx.Instance = DMA1_Stream3;
|
||||
hdma_spi2_rx.Init.Channel = DMA_CHANNEL_0;
|
||||
hdma_spi2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
|
||||
hdma_spi2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
|
||||
hdma_spi2_rx.Init.MemInc = DMA_MINC_ENABLE;
|
||||
hdma_spi2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
||||
hdma_spi2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
||||
hdma_spi2_rx.Init.Mode = DMA_NORMAL;
|
||||
hdma_spi2_rx.Init.Priority = DMA_PRIORITY_LOW;
|
||||
hdma_spi2_rx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
|
||||
hdma_spi2_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
|
||||
hdma_spi2_rx.Init.MemBurst = DMA_MBURST_SINGLE;
|
||||
hdma_spi2_rx.Init.PeriphBurst = DMA_PBURST_SINGLE;
|
||||
if (HAL_DMA_Init(&hdma_spi2_rx) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
__HAL_LINKDMA(spiHandle,hdmarx,hdma_spi2_rx);
|
||||
|
||||
/* SPI2_TX Init */
|
||||
hdma_spi2_tx.Instance = DMA1_Stream4;
|
||||
hdma_spi2_tx.Init.Channel = DMA_CHANNEL_0;
|
||||
hdma_spi2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
|
||||
hdma_spi2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
|
||||
hdma_spi2_tx.Init.MemInc = DMA_MINC_ENABLE;
|
||||
hdma_spi2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
||||
hdma_spi2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
||||
hdma_spi2_tx.Init.Mode = DMA_NORMAL;
|
||||
hdma_spi2_tx.Init.Priority = DMA_PRIORITY_LOW;
|
||||
hdma_spi2_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
|
||||
hdma_spi2_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
|
||||
hdma_spi2_tx.Init.MemBurst = DMA_MBURST_SINGLE;
|
||||
hdma_spi2_tx.Init.PeriphBurst = DMA_PBURST_SINGLE;
|
||||
if (HAL_DMA_Init(&hdma_spi2_tx) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
__HAL_LINKDMA(spiHandle,hdmatx,hdma_spi2_tx);
|
||||
|
||||
/* SPI2 interrupt Init */
|
||||
HAL_NVIC_SetPriority(SPI2_IRQn, 5, 0);
|
||||
HAL_NVIC_EnableIRQ(SPI2_IRQn);
|
||||
@@ -294,10 +249,6 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle)
|
||||
*/
|
||||
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
|
||||
|
||||
/* SPI2 DMA DeInit */
|
||||
HAL_DMA_DeInit(spiHandle->hdmarx);
|
||||
HAL_DMA_DeInit(spiHandle->hdmatx);
|
||||
|
||||
/* SPI2 interrupt Deinit */
|
||||
HAL_NVIC_DisableIRQ(SPI2_IRQn);
|
||||
/* USER CODE BEGIN SPI2_MspDeInit 1 */
|
||||
|
||||
@@ -56,7 +56,6 @@
|
||||
|
||||
/* External variables --------------------------------------------------------*/
|
||||
extern PCD_HandleTypeDef hpcd_USB_OTG_FS;
|
||||
extern DMA_HandleTypeDef hdma_adc1;
|
||||
extern CAN_HandleTypeDef hcan1;
|
||||
extern CAN_HandleTypeDef hcan2;
|
||||
extern DMA_HandleTypeDef hdma_i2c2_rx;
|
||||
@@ -65,8 +64,6 @@ extern I2C_HandleTypeDef hi2c2;
|
||||
extern I2C_HandleTypeDef hi2c3;
|
||||
extern DMA_HandleTypeDef hdma_spi1_rx;
|
||||
extern DMA_HandleTypeDef hdma_spi1_tx;
|
||||
extern DMA_HandleTypeDef hdma_spi2_rx;
|
||||
extern DMA_HandleTypeDef hdma_spi2_tx;
|
||||
extern SPI_HandleTypeDef hspi1;
|
||||
extern SPI_HandleTypeDef hspi2;
|
||||
extern TIM_HandleTypeDef htim8;
|
||||
@@ -253,34 +250,6 @@ void DMA1_Stream2_IRQHandler(void)
|
||||
/* USER CODE END DMA1_Stream2_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles DMA1 stream3 global interrupt.
|
||||
*/
|
||||
void DMA1_Stream3_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN DMA1_Stream3_IRQn 0 */
|
||||
|
||||
/* USER CODE END DMA1_Stream3_IRQn 0 */
|
||||
HAL_DMA_IRQHandler(&hdma_spi2_rx);
|
||||
/* USER CODE BEGIN DMA1_Stream3_IRQn 1 */
|
||||
|
||||
/* USER CODE END DMA1_Stream3_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles DMA1 stream4 global interrupt.
|
||||
*/
|
||||
void DMA1_Stream4_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN DMA1_Stream4_IRQn 0 */
|
||||
|
||||
/* USER CODE END DMA1_Stream4_IRQn 0 */
|
||||
HAL_DMA_IRQHandler(&hdma_spi2_tx);
|
||||
/* USER CODE BEGIN DMA1_Stream4_IRQn 1 */
|
||||
|
||||
/* USER CODE END DMA1_Stream4_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles CAN1 RX0 interrupts.
|
||||
*/
|
||||
@@ -478,20 +447,6 @@ void DMA2_Stream3_IRQHandler(void)
|
||||
/* USER CODE END DMA2_Stream3_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles DMA2 stream4 global interrupt.
|
||||
*/
|
||||
void DMA2_Stream4_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN DMA2_Stream4_IRQn 0 */
|
||||
|
||||
/* USER CODE END DMA2_Stream4_IRQn 0 */
|
||||
HAL_DMA_IRQHandler(&hdma_adc1);
|
||||
/* USER CODE BEGIN DMA2_Stream4_IRQn 1 */
|
||||
|
||||
/* USER CODE END DMA2_Stream4_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles CAN2 RX0 interrupts.
|
||||
*/
|
||||
|
||||
@@ -46,7 +46,7 @@ static Shoot_Upload_Data_s shoot_fetch_data; // 从发射获取的反馈信息
|
||||
|
||||
static Robot_Status_e robot_state; // 机器人整体工作状态
|
||||
|
||||
BMI088Instance *bmi088; // 云台IMU
|
||||
BMI088Instance *bmi088_test; // 云台IMU
|
||||
BMI088_Data_t bmi088_data;
|
||||
void RobotCMDInit()
|
||||
{
|
||||
@@ -57,7 +57,7 @@ void RobotCMDInit()
|
||||
.spi_handle = &hspi1,
|
||||
.GPIOx = GPIOA,
|
||||
.cs_pin = GPIO_PIN_4,
|
||||
.spi_work_mode = SPI_IT_MODE,
|
||||
.spi_work_mode = SPI_DMA_MODE,
|
||||
},
|
||||
.acc_int_config = {
|
||||
.GPIOx = GPIOC,
|
||||
@@ -68,7 +68,7 @@ void RobotCMDInit()
|
||||
.spi_handle = &hspi1,
|
||||
.GPIOx = GPIOB,
|
||||
.cs_pin = GPIO_PIN_0,
|
||||
.spi_work_mode = SPI_IT_MODE,
|
||||
.spi_work_mode = SPI_DMA_MODE,
|
||||
},
|
||||
.gyro_int_config = {
|
||||
.GPIO_Pin = GPIO_PIN_5,
|
||||
@@ -90,7 +90,7 @@ void RobotCMDInit()
|
||||
.MaxOut = 100,
|
||||
},
|
||||
};
|
||||
bmi088 = BMI088Register(&bmi088_config);
|
||||
bmi088_test = BMI088Register(&bmi088_config);
|
||||
rc_data = RemoteControlInit(&huart3); // 修改为对应串口,注意如果是自研板dbus协议串口需选用添加了反相器的那个
|
||||
vision_recv_data = VisionInit(&huart1); // 视觉通信串口
|
||||
|
||||
@@ -319,7 +319,7 @@ static void EmergencyHandler()
|
||||
/* 机器人核心控制任务,200Hz频率运行(必须高于视觉发送频率) */
|
||||
void RobotCMDTask()
|
||||
{
|
||||
BMI088Acquire(bmi088,&bmi088_data) ;
|
||||
BMI088Acquire(bmi088_test,&bmi088_data) ;
|
||||
// 从其他应用获取回传数据
|
||||
#ifdef ONE_BOARD
|
||||
SubGetMessage(chassis_feed_sub, (void *)&chassis_fetch_data);
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
|
||||
#include "bsp_log.h"
|
||||
|
||||
osThreadId insTaskHandle;
|
||||
// osThreadId insTaskHandle;
|
||||
osThreadId robotTaskHandle;
|
||||
osThreadId motorTaskHandle;
|
||||
osThreadId daemonTaskHandle;
|
||||
osThreadId uiTaskHandle;
|
||||
|
||||
void StartINSTASK(void const *argument);
|
||||
// void StartINSTASK(void const *argument);
|
||||
void StartMOTORTASK(void const *argument);
|
||||
void StartDAEMONTASK(void const *argument);
|
||||
void StartROBOTTASK(void const *argument);
|
||||
@@ -35,9 +35,9 @@ void StartUITASK(void const *argument);
|
||||
*/
|
||||
void OSTaskInit()
|
||||
{
|
||||
osThreadDef(instask, StartINSTASK, osPriorityAboveNormal, 0, 1024);
|
||||
insTaskHandle = osThreadCreate(osThread(instask), NULL); // 由于是阻塞读取传感器,为姿态解算设置较高优先级,确保以1khz的频率执行
|
||||
// 后续修改为读取传感器数据准备好的中断处理,
|
||||
// osThreadDef(instask, StartINSTASK, osPriorityAboveNormal, 0, 1024);
|
||||
// insTaskHandle = osThreadCreate(osThread(instask), NULL); // 由于是阻塞读取传感器,为姿态解算设置较高优先级,确保以1khz的频率执行
|
||||
// // 后续修改为读取传感器数据准备好的中断处理,
|
||||
|
||||
osThreadDef(motortask, StartMOTORTASK, osPriorityNormal, 0, 256);
|
||||
motorTaskHandle = osThreadCreate(osThread(motortask), NULL);
|
||||
@@ -54,24 +54,24 @@ void OSTaskInit()
|
||||
HTMotorControlInit(); // 没有注册HT电机则不会执行
|
||||
}
|
||||
|
||||
__attribute__((noreturn)) void StartINSTASK(void const *argument)
|
||||
{
|
||||
static float ins_start;
|
||||
static float ins_dt;
|
||||
INS_Init(); // 确保BMI088被正确初始化.
|
||||
LOGINFO("[freeRTOS] INS Task Start");
|
||||
for (;;)
|
||||
{
|
||||
// 1kHz
|
||||
ins_start = DWT_GetTimeline_ms();
|
||||
INS_Task();
|
||||
ins_dt = DWT_GetTimeline_ms() - ins_start;
|
||||
if (ins_dt > 1)
|
||||
LOGERROR("[freeRTOS] INS Task is being DELAY! dt = [%f]", &ins_dt);
|
||||
VisionSend(); // 解算完成后发送视觉数据,但是当前的实现不太优雅,后续若添加硬件触发需要重新考虑结构的组织
|
||||
osDelay(1);
|
||||
}
|
||||
}
|
||||
// __attribute__((noreturn)) void StartINSTASK(void const *argument)
|
||||
// {
|
||||
// static float ins_start;
|
||||
// static float ins_dt;
|
||||
// INS_Init(); // 确保BMI088被正确初始化.
|
||||
// LOGINFO("[freeRTOS] INS Task Start");
|
||||
// for (;;)
|
||||
// {
|
||||
// // 1kHz
|
||||
// ins_start = DWT_GetTimeline_ms();
|
||||
// //INS_Task();
|
||||
// ins_dt = DWT_GetTimeline_ms() - ins_start;
|
||||
// if (ins_dt > 1)
|
||||
// LOGERROR("[freeRTOS] INS Task is being DELAY! dt = [%f]", &ins_dt);
|
||||
// VisionSend(); // 解算完成后发送视觉数据,但是当前的实现不太优雅,后续若添加硬件触发需要重新考虑结构的组织
|
||||
// osDelay(1);
|
||||
// }
|
||||
// }
|
||||
|
||||
__attribute__((noreturn)) void StartMOTORTASK(void const *argument)
|
||||
{
|
||||
|
||||
@@ -25,49 +25,36 @@ CAN2.IPParameters=CalculateTimeQuantum,BS1,BS2,Prescaler,CalculateBaudRate,TXFP,
|
||||
CAN2.NART=ENABLE
|
||||
CAN2.Prescaler=3
|
||||
CAN2.TXFP=ENABLE
|
||||
Dma.ADC1.8.Direction=DMA_PERIPH_TO_MEMORY
|
||||
Dma.ADC1.8.FIFOMode=DMA_FIFOMODE_DISABLE
|
||||
Dma.ADC1.8.Instance=DMA2_Stream4
|
||||
Dma.ADC1.8.MemDataAlignment=DMA_MDATAALIGN_HALFWORD
|
||||
Dma.ADC1.8.MemInc=DMA_MINC_ENABLE
|
||||
Dma.ADC1.8.Mode=DMA_NORMAL
|
||||
Dma.ADC1.8.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
|
||||
Dma.ADC1.8.PeriphInc=DMA_PINC_DISABLE
|
||||
Dma.ADC1.8.Priority=DMA_PRIORITY_LOW
|
||||
Dma.ADC1.8.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode
|
||||
Dma.I2C2_RX.9.Direction=DMA_PERIPH_TO_MEMORY
|
||||
Dma.I2C2_RX.9.FIFOMode=DMA_FIFOMODE_DISABLE
|
||||
Dma.I2C2_RX.9.Instance=DMA1_Stream2
|
||||
Dma.I2C2_RX.9.MemDataAlignment=DMA_MDATAALIGN_BYTE
|
||||
Dma.I2C2_RX.9.MemInc=DMA_MINC_ENABLE
|
||||
Dma.I2C2_RX.9.Mode=DMA_NORMAL
|
||||
Dma.I2C2_RX.9.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
|
||||
Dma.I2C2_RX.9.PeriphInc=DMA_PINC_DISABLE
|
||||
Dma.I2C2_RX.9.Priority=DMA_PRIORITY_LOW
|
||||
Dma.I2C2_RX.9.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode
|
||||
Dma.I2C2_TX.10.Direction=DMA_MEMORY_TO_PERIPH
|
||||
Dma.I2C2_TX.10.FIFOMode=DMA_FIFOMODE_DISABLE
|
||||
Dma.I2C2_TX.10.Instance=DMA1_Stream7
|
||||
Dma.I2C2_TX.10.MemDataAlignment=DMA_MDATAALIGN_BYTE
|
||||
Dma.I2C2_TX.10.MemInc=DMA_MINC_ENABLE
|
||||
Dma.I2C2_TX.10.Mode=DMA_NORMAL
|
||||
Dma.I2C2_TX.10.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
|
||||
Dma.I2C2_TX.10.PeriphInc=DMA_PINC_DISABLE
|
||||
Dma.I2C2_TX.10.Priority=DMA_PRIORITY_LOW
|
||||
Dma.I2C2_TX.10.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode
|
||||
Dma.I2C2_RX.6.Direction=DMA_PERIPH_TO_MEMORY
|
||||
Dma.I2C2_RX.6.FIFOMode=DMA_FIFOMODE_DISABLE
|
||||
Dma.I2C2_RX.6.Instance=DMA1_Stream2
|
||||
Dma.I2C2_RX.6.MemDataAlignment=DMA_MDATAALIGN_BYTE
|
||||
Dma.I2C2_RX.6.MemInc=DMA_MINC_ENABLE
|
||||
Dma.I2C2_RX.6.Mode=DMA_NORMAL
|
||||
Dma.I2C2_RX.6.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
|
||||
Dma.I2C2_RX.6.PeriphInc=DMA_PINC_DISABLE
|
||||
Dma.I2C2_RX.6.Priority=DMA_PRIORITY_LOW
|
||||
Dma.I2C2_RX.6.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode
|
||||
Dma.I2C2_TX.7.Direction=DMA_MEMORY_TO_PERIPH
|
||||
Dma.I2C2_TX.7.FIFOMode=DMA_FIFOMODE_DISABLE
|
||||
Dma.I2C2_TX.7.Instance=DMA1_Stream7
|
||||
Dma.I2C2_TX.7.MemDataAlignment=DMA_MDATAALIGN_BYTE
|
||||
Dma.I2C2_TX.7.MemInc=DMA_MINC_ENABLE
|
||||
Dma.I2C2_TX.7.Mode=DMA_NORMAL
|
||||
Dma.I2C2_TX.7.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
|
||||
Dma.I2C2_TX.7.PeriphInc=DMA_PINC_DISABLE
|
||||
Dma.I2C2_TX.7.Priority=DMA_PRIORITY_LOW
|
||||
Dma.I2C2_TX.7.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode
|
||||
Dma.Request0=USART6_RX
|
||||
Dma.Request1=USART6_TX
|
||||
Dma.Request10=I2C2_TX
|
||||
Dma.Request11=SPI1_TX
|
||||
Dma.Request2=USART1_TX
|
||||
Dma.Request3=USART1_RX
|
||||
Dma.Request4=SPI1_RX
|
||||
Dma.Request5=SPI2_RX
|
||||
Dma.Request6=SPI2_TX
|
||||
Dma.Request7=USART3_RX
|
||||
Dma.Request8=ADC1
|
||||
Dma.Request9=I2C2_RX
|
||||
Dma.RequestsNb=12
|
||||
Dma.Request5=USART3_RX
|
||||
Dma.Request6=I2C2_RX
|
||||
Dma.Request7=I2C2_TX
|
||||
Dma.Request8=SPI1_TX
|
||||
Dma.RequestsNb=9
|
||||
Dma.SPI1_RX.4.Direction=DMA_PERIPH_TO_MEMORY
|
||||
Dma.SPI1_RX.4.FIFOMode=DMA_FIFOMODE_ENABLE
|
||||
Dma.SPI1_RX.4.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL
|
||||
@@ -79,44 +66,18 @@ Dma.SPI1_RX.4.Mode=DMA_NORMAL
|
||||
Dma.SPI1_RX.4.PeriphBurst=DMA_PBURST_SINGLE
|
||||
Dma.SPI1_RX.4.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
|
||||
Dma.SPI1_RX.4.PeriphInc=DMA_PINC_DISABLE
|
||||
Dma.SPI1_RX.4.Priority=DMA_PRIORITY_LOW
|
||||
Dma.SPI1_RX.4.Priority=DMA_PRIORITY_HIGH
|
||||
Dma.SPI1_RX.4.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode,FIFOThreshold,MemBurst,PeriphBurst
|
||||
Dma.SPI1_TX.11.Direction=DMA_MEMORY_TO_PERIPH
|
||||
Dma.SPI1_TX.11.FIFOMode=DMA_FIFOMODE_DISABLE
|
||||
Dma.SPI1_TX.11.Instance=DMA2_Stream3
|
||||
Dma.SPI1_TX.11.MemDataAlignment=DMA_MDATAALIGN_BYTE
|
||||
Dma.SPI1_TX.11.MemInc=DMA_MINC_ENABLE
|
||||
Dma.SPI1_TX.11.Mode=DMA_NORMAL
|
||||
Dma.SPI1_TX.11.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
|
||||
Dma.SPI1_TX.11.PeriphInc=DMA_PINC_DISABLE
|
||||
Dma.SPI1_TX.11.Priority=DMA_PRIORITY_LOW
|
||||
Dma.SPI1_TX.11.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode
|
||||
Dma.SPI2_RX.5.Direction=DMA_PERIPH_TO_MEMORY
|
||||
Dma.SPI2_RX.5.FIFOMode=DMA_FIFOMODE_ENABLE
|
||||
Dma.SPI2_RX.5.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL
|
||||
Dma.SPI2_RX.5.Instance=DMA1_Stream3
|
||||
Dma.SPI2_RX.5.MemBurst=DMA_MBURST_SINGLE
|
||||
Dma.SPI2_RX.5.MemDataAlignment=DMA_MDATAALIGN_BYTE
|
||||
Dma.SPI2_RX.5.MemInc=DMA_MINC_ENABLE
|
||||
Dma.SPI2_RX.5.Mode=DMA_NORMAL
|
||||
Dma.SPI2_RX.5.PeriphBurst=DMA_PBURST_SINGLE
|
||||
Dma.SPI2_RX.5.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
|
||||
Dma.SPI2_RX.5.PeriphInc=DMA_PINC_DISABLE
|
||||
Dma.SPI2_RX.5.Priority=DMA_PRIORITY_LOW
|
||||
Dma.SPI2_RX.5.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode,FIFOThreshold,MemBurst,PeriphBurst
|
||||
Dma.SPI2_TX.6.Direction=DMA_MEMORY_TO_PERIPH
|
||||
Dma.SPI2_TX.6.FIFOMode=DMA_FIFOMODE_ENABLE
|
||||
Dma.SPI2_TX.6.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL
|
||||
Dma.SPI2_TX.6.Instance=DMA1_Stream4
|
||||
Dma.SPI2_TX.6.MemBurst=DMA_MBURST_SINGLE
|
||||
Dma.SPI2_TX.6.MemDataAlignment=DMA_MDATAALIGN_BYTE
|
||||
Dma.SPI2_TX.6.MemInc=DMA_MINC_ENABLE
|
||||
Dma.SPI2_TX.6.Mode=DMA_NORMAL
|
||||
Dma.SPI2_TX.6.PeriphBurst=DMA_PBURST_SINGLE
|
||||
Dma.SPI2_TX.6.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
|
||||
Dma.SPI2_TX.6.PeriphInc=DMA_PINC_DISABLE
|
||||
Dma.SPI2_TX.6.Priority=DMA_PRIORITY_LOW
|
||||
Dma.SPI2_TX.6.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode,FIFOThreshold,MemBurst,PeriphBurst
|
||||
Dma.SPI1_TX.8.Direction=DMA_MEMORY_TO_PERIPH
|
||||
Dma.SPI1_TX.8.FIFOMode=DMA_FIFOMODE_DISABLE
|
||||
Dma.SPI1_TX.8.Instance=DMA2_Stream3
|
||||
Dma.SPI1_TX.8.MemDataAlignment=DMA_MDATAALIGN_BYTE
|
||||
Dma.SPI1_TX.8.MemInc=DMA_MINC_ENABLE
|
||||
Dma.SPI1_TX.8.Mode=DMA_NORMAL
|
||||
Dma.SPI1_TX.8.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
|
||||
Dma.SPI1_TX.8.PeriphInc=DMA_PINC_DISABLE
|
||||
Dma.SPI1_TX.8.Priority=DMA_PRIORITY_HIGH
|
||||
Dma.SPI1_TX.8.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode
|
||||
Dma.USART1_RX.3.Direction=DMA_PERIPH_TO_MEMORY
|
||||
Dma.USART1_RX.3.FIFOMode=DMA_FIFOMODE_DISABLE
|
||||
Dma.USART1_RX.3.Instance=DMA2_Stream5
|
||||
@@ -137,16 +98,16 @@ Dma.USART1_TX.2.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
|
||||
Dma.USART1_TX.2.PeriphInc=DMA_PINC_DISABLE
|
||||
Dma.USART1_TX.2.Priority=DMA_PRIORITY_VERY_HIGH
|
||||
Dma.USART1_TX.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode
|
||||
Dma.USART3_RX.7.Direction=DMA_PERIPH_TO_MEMORY
|
||||
Dma.USART3_RX.7.FIFOMode=DMA_FIFOMODE_DISABLE
|
||||
Dma.USART3_RX.7.Instance=DMA1_Stream1
|
||||
Dma.USART3_RX.7.MemDataAlignment=DMA_MDATAALIGN_BYTE
|
||||
Dma.USART3_RX.7.MemInc=DMA_MINC_ENABLE
|
||||
Dma.USART3_RX.7.Mode=DMA_NORMAL
|
||||
Dma.USART3_RX.7.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
|
||||
Dma.USART3_RX.7.PeriphInc=DMA_PINC_DISABLE
|
||||
Dma.USART3_RX.7.Priority=DMA_PRIORITY_LOW
|
||||
Dma.USART3_RX.7.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode
|
||||
Dma.USART3_RX.5.Direction=DMA_PERIPH_TO_MEMORY
|
||||
Dma.USART3_RX.5.FIFOMode=DMA_FIFOMODE_DISABLE
|
||||
Dma.USART3_RX.5.Instance=DMA1_Stream1
|
||||
Dma.USART3_RX.5.MemDataAlignment=DMA_MDATAALIGN_BYTE
|
||||
Dma.USART3_RX.5.MemInc=DMA_MINC_ENABLE
|
||||
Dma.USART3_RX.5.Mode=DMA_NORMAL
|
||||
Dma.USART3_RX.5.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
|
||||
Dma.USART3_RX.5.PeriphInc=DMA_PINC_DISABLE
|
||||
Dma.USART3_RX.5.Priority=DMA_PRIORITY_LOW
|
||||
Dma.USART3_RX.5.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode
|
||||
Dma.USART6_RX.0.Direction=DMA_PERIPH_TO_MEMORY
|
||||
Dma.USART6_RX.0.FIFOMode=DMA_FIFOMODE_ENABLE
|
||||
Dma.USART6_RX.0.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL
|
||||
@@ -295,14 +256,11 @@ NVIC.CAN2_RX0_IRQn=true\:5\:0\:true\:false\:true\:true\:true\:true\:true
|
||||
NVIC.CAN2_RX1_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true
|
||||
NVIC.DMA1_Stream1_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
|
||||
NVIC.DMA1_Stream2_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
|
||||
NVIC.DMA1_Stream3_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
|
||||
NVIC.DMA1_Stream4_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
|
||||
NVIC.DMA1_Stream7_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
|
||||
NVIC.DMA2_Stream0_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
|
||||
NVIC.DMA2_Stream0_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true\:true
|
||||
NVIC.DMA2_Stream2_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
|
||||
NVIC.DMA2_Stream3_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
|
||||
NVIC.DMA2_Stream4_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
|
||||
NVIC.DMA2_Stream5_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
|
||||
NVIC.DMA2_Stream3_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true\:true
|
||||
NVIC.DMA2_Stream5_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true\:true
|
||||
NVIC.DMA2_Stream6_IRQn=true\:5\:0\:true\:false\:true\:true\:false\:true\:true
|
||||
NVIC.DMA2_Stream7_IRQn=true\:5\:0\:true\:false\:true\:true\:false\:true\:true
|
||||
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
|
||||
@@ -518,6 +476,7 @@ ProjectManager.PreviousToolchain=
|
||||
ProjectManager.ProjectBuild=false
|
||||
ProjectManager.ProjectFileName=basic_framework.ioc
|
||||
ProjectManager.ProjectName=basic_framework
|
||||
ProjectManager.ProjectStructure=
|
||||
ProjectManager.RegisterCallBack=
|
||||
ProjectManager.StackSize=0x5000
|
||||
ProjectManager.TargetToolchain=Makefile
|
||||
@@ -689,3 +648,4 @@ VP_TIM8_VS_ClockSourceINT.Signal=TIM8_VS_ClockSourceINT
|
||||
VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Mode=CDC_FS
|
||||
VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Signal=USB_DEVICE_VS_USB_DEVICE_CDC_FS
|
||||
board=custom
|
||||
rtos.0.ip=FREERTOS
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
#include "bmi088_regNdef.h"
|
||||
#include "bmi088.h"
|
||||
#include "user_lib.h"
|
||||
#include "daemon.h"
|
||||
|
||||
static DaemonInstance *bmi088_daemon_instance;
|
||||
// ---------------------------以下私有函数,用于读写BMI088寄存器封装,blocking--------------------------------//
|
||||
/**
|
||||
* @brief 读取BMI088寄存器Accel. BMI088要求在不释放CS的情况下连续读取
|
||||
@@ -41,7 +43,11 @@ static void BMI088GyroRead(BMI088Instance *bmi088, uint8_t reg, uint8_t *dataptr
|
||||
static uint8_t tx[7] = {0x80}; // 读取,第一个字节为0x80 | reg ,之后是dummy data
|
||||
static uint8_t rx[7]; // 第一个是dummy data,第三个开始是真正的数据
|
||||
tx[0] = 0x80 | reg;
|
||||
SPITransRecv(bmi088->spi_gyro, rx, tx, len + 1);
|
||||
//SPITransRecv(bmi088->spi_gyro, rx, tx, len + 1);
|
||||
do
|
||||
{
|
||||
SPITransRecv(bmi088->spi_gyro, rx, tx, len + 1);
|
||||
}while (rx[1] == 0 && rx[2] == 128 && rx[6] == 129); //@todo我也不知道哪来的错误帧 先这样吧。。。。。
|
||||
memcpy(dataptr, rx + 1, len); // @todo : memcpy有额外开销,后续可以考虑优化,在SPI中加入接口或模式,使得在一次传输结束后不释放CS,直接接着传输
|
||||
}
|
||||
|
||||
@@ -190,6 +196,7 @@ static void BMI088AccSPIFinishCallback(SPIInstance *spi)
|
||||
{
|
||||
// static BMI088Instance *bmi088;
|
||||
// bmi088 = (BMI088Instance *)(spi->id);
|
||||
|
||||
// 若第一次读取加速度,则在这里启动温度读取
|
||||
// 如果使用异步姿态更新,此处唤醒量测更新的任务
|
||||
}
|
||||
@@ -203,16 +210,32 @@ static void BMI088GyroSPIFinishCallback(SPIInstance *spi)
|
||||
|
||||
static void BMI088AccINTCallback(GPIOInstance *gpio)
|
||||
{
|
||||
// static BMI088Instance *bmi088;
|
||||
// bmi088 = (BMI088Instance *)(gpio->id);
|
||||
static BMI088Instance *bmi088;
|
||||
static uint8_t buf[6] = {0}; // 最多读取6个byte(gyro/acc,temp是2)
|
||||
bmi088 = (BMI088Instance *)(gpio->id);
|
||||
bmi088->update_flag.imu_ready = 1;
|
||||
bmi088->update_flag.acc = 1;
|
||||
BMI088AccelRead(bmi088, BMI088_ACCEL_XOUT_L, buf, 6);
|
||||
for (uint8_t i = 0; i < 3; i++)
|
||||
bmi088->acc[i] = bmi088->acc_coef * (float)(int16_t)(((buf[2 * i + 1]) << 8) | buf[2 * i]);
|
||||
// 启动加速度计数据读取(和温度读取,如果有必要),并转换为实际值
|
||||
// 读取完毕会调用BMI088AccSPIFinishCallback
|
||||
}
|
||||
|
||||
static void BMI088GyroINTCallback(GPIOInstance *gpio)
|
||||
{
|
||||
// static BMI088Instance *bmi088;
|
||||
// bmi088 = (BMI088Instance *)(gpio->id);
|
||||
static BMI088Instance *bmi088;
|
||||
static uint8_t buf[6] = {0}; // 最多读取6个byte(gyro/acc,temp是2)
|
||||
bmi088 = (BMI088Instance *)(gpio->id);
|
||||
bmi088->update_flag.imu_ready = 1;
|
||||
bmi088->update_flag.gyro = 1;
|
||||
BMI088GyroRead(bmi088, BMI088_GYRO_X_L, buf, 6);
|
||||
for (uint8_t i = 0; i < 3; i++)
|
||||
bmi088->gyro[i] = bmi088->BMI088_GYRO_SEN * (float)(int16_t)(((buf[2 * i + 1]) << 8) | buf[2 * i]);
|
||||
if(bmi088->gyro[0] < -20)
|
||||
{
|
||||
bmi088->update_flag.temp = 1;
|
||||
}
|
||||
// 启动陀螺仪数据读取,并转换为实际值
|
||||
// 读取完毕会调用BMI088GyroSPIFinishCallback
|
||||
}
|
||||
@@ -250,7 +273,16 @@ uint8_t BMI088Acquire(BMI088Instance *bmi088, BMI088_Data_t *data_store)
|
||||
// 如果是IT模式,则检查标志位.当传感器数据准备好会触发外部中断,中断服务函数会将标志位置1
|
||||
if (bmi088->work_mode == BMI088_BLOCK_TRIGGER_MODE && bmi088->update_flag.imu_ready == 1)
|
||||
{
|
||||
memcpy(data_store, &bmi088->gyro, sizeof(BMI088_Data_t));
|
||||
if(bmi088->update_flag.acc == 1)
|
||||
{
|
||||
memcpy(data_store->acc,bmi088->acc,3*sizeof(float));
|
||||
bmi088->update_flag.acc = 0;
|
||||
}
|
||||
if(bmi088->update_flag.gyro == 1)
|
||||
{
|
||||
memcpy(data_store->gyro,bmi088->gyro,3*sizeof(float));
|
||||
bmi088->update_flag.gyro = 0;
|
||||
}
|
||||
bmi088->update_flag.imu_ready = 0;
|
||||
return 1;
|
||||
}
|
||||
@@ -313,8 +345,8 @@ void BMI088CalibrateIMU(BMI088Instance *_bmi088)
|
||||
BMI088Acquire(_bmi088, &raw_data);
|
||||
gNormTemp = NormOf3d(raw_data.acc);
|
||||
_bmi088->gNorm += gNormTemp; // 计算范数并累加,最后除以calib times获取单次值
|
||||
for (uint8_t i = 0; i < 3; i++)
|
||||
_bmi088->gyro_offset[i] += raw_data.gyro[i]; // 因为标定时传感器静止,所以采集到的值就是漂移,累加当前值,最后除以calib times获得零飘
|
||||
for (uint8_t ii = 0; ii < 3; ii++)
|
||||
_bmi088->gyro_offset[ii] += raw_data.gyro[ii]; // 因为标定时传感器静止,所以采集到的值就是漂移,累加当前值,最后除以calib times获得零飘
|
||||
|
||||
if (i == 0) // 避免未定义的行为(else中)
|
||||
{
|
||||
@@ -403,26 +435,9 @@ BMI088Instance *BMI088Register(BMI088_Init_Config_s *config)
|
||||
// SPI_ACC DMA CALLBACK: 解算加速度计数据,清除温度wait标志位并启动温度传输,第二次进入中断时解算温度数据
|
||||
|
||||
// 还有其他方案可用,比如阻塞等待传输完成,但是比较笨.
|
||||
|
||||
// 根据参数选择工作模式
|
||||
if (config->work_mode == BMI088_BLOCK_PERIODIC_MODE)
|
||||
{
|
||||
config->spi_acc_config.spi_work_mode = SPI_BLOCK_MODE;
|
||||
config->spi_gyro_config.spi_work_mode = SPI_BLOCK_MODE;
|
||||
// callbacks are all NULL
|
||||
}
|
||||
else if (config->work_mode == BMI088_BLOCK_TRIGGER_MODE)
|
||||
{
|
||||
config->spi_gyro_config.spi_work_mode = SPI_DMA_MODE; // 如果DMA资源不够,可以用SPI_IT_MODE
|
||||
config->spi_gyro_config.spi_work_mode = SPI_DMA_MODE;
|
||||
// 设置回调函数
|
||||
config->spi_acc_config.callback = BMI088AccSPIFinishCallback;
|
||||
config->spi_gyro_config.callback = BMI088GyroSPIFinishCallback;
|
||||
config->acc_int_config.gpio_model_callback = BMI088AccINTCallback;
|
||||
config->gyro_int_config.gpio_model_callback = BMI088GyroINTCallback;
|
||||
bmi088_instance->acc_int = GPIORegister(&config->acc_int_config); // 只有在非阻塞模式下才需要注册中断
|
||||
bmi088_instance->gyro_int = GPIORegister(&config->gyro_int_config);
|
||||
} // 注册实例
|
||||
// 根据参数选择工作模式
|
||||
bmi088_instance->spi_acc = SPIRegister(&config->spi_acc_config);
|
||||
bmi088_instance->spi_gyro = SPIRegister(&config->spi_gyro_config);
|
||||
bmi088_instance->heat_pwm = PWMRegister(&config->heat_pwm_config);
|
||||
@@ -441,6 +456,20 @@ BMI088Instance *BMI088Register(BMI088_Init_Config_s *config)
|
||||
bmi088_instance->work_mode = BMI088_BLOCK_PERIODIC_MODE; // 临时设置为阻塞模式
|
||||
BMI088CalibrateIMU(bmi088_instance); // 标定acc和gyro
|
||||
bmi088_instance->work_mode = config->work_mode; // 恢复工作模式
|
||||
if (config->work_mode == BMI088_BLOCK_TRIGGER_MODE)
|
||||
{
|
||||
bmi088_instance->spi_acc->spi_work_mode = SPI_DMA_MODE;
|
||||
bmi088_instance->spi_gyro->spi_work_mode = SPI_DMA_MODE;
|
||||
|
||||
// 设置回调函数
|
||||
bmi088_instance->spi_acc->callback = BMI088AccSPIFinishCallback;
|
||||
bmi088_instance->spi_gyro->callback = BMI088GyroSPIFinishCallback;
|
||||
|
||||
bmi088_instance->acc_int = GPIORegister(&config->acc_int_config); // 只有在非阻塞模式下才需要注册中断
|
||||
bmi088_instance->gyro_int = GPIORegister(&config->gyro_int_config);
|
||||
|
||||
bmi088_instance->acc_int->gpio_model_callback = BMI088AccINTCallback;
|
||||
bmi088_instance->gyro_int->gpio_model_callback = BMI088GyroINTCallback;
|
||||
} // 注册实例
|
||||
return bmi088_instance;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user