增加了usb虚拟串口的支持,编写了部分bmi088it读取
This commit is contained in:
parent
80df9bca15
commit
637d7de114
|
@ -1,21 +1,21 @@
|
||||||
/* USER CODE BEGIN Header */
|
/* USER CODE BEGIN Header */
|
||||||
/**
|
/**
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @file : usbd_cdc_if.h
|
* @file : usbd_cdc_if.h
|
||||||
* @version : v1.0_Cube
|
* @version : v1.0_Cube
|
||||||
* @brief : Header for usbd_cdc_if.c file.
|
* @brief : Header for usbd_cdc_if.c file.
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @attention
|
* @attention
|
||||||
*
|
*
|
||||||
* Copyright (c) 2023 STMicroelectronics.
|
* Copyright (c) 2023 STMicroelectronics.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* This software is licensed under terms that can be found in the LICENSE file
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
* in the root directory of this software component.
|
* in the root directory of this software component.
|
||||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
*
|
*
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
/* USER CODE END Header */
|
/* USER CODE END Header */
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
@ -23,7 +23,8 @@
|
||||||
#define __USBD_CDC_IF_H__
|
#define __USBD_CDC_IF_H__
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C"
|
||||||
|
{
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
@ -34,98 +35,97 @@
|
||||||
/* USER CODE END INCLUDE */
|
/* USER CODE END INCLUDE */
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
* @brief For Usb device.
|
* @brief For Usb device.
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** @defgroup USBD_CDC_IF USBD_CDC_IF
|
/** @defgroup USBD_CDC_IF USBD_CDC_IF
|
||||||
* @brief Usb VCP device module
|
* @brief Usb VCP device module
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** @defgroup USBD_CDC_IF_Exported_Defines USBD_CDC_IF_Exported_Defines
|
/** @defgroup USBD_CDC_IF_Exported_Defines USBD_CDC_IF_Exported_Defines
|
||||||
* @brief Defines.
|
* @brief Defines.
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
/* Define size for the receive and transmit buffer over CDC */
|
/* Define size for the receive and transmit buffer over CDC */
|
||||||
#define APP_RX_DATA_SIZE 2048
|
#define APP_RX_DATA_SIZE 2048
|
||||||
#define APP_TX_DATA_SIZE 2048
|
#define APP_TX_DATA_SIZE 2048
|
||||||
/* USER CODE BEGIN EXPORTED_DEFINES */
|
/* USER CODE BEGIN EXPORTED_DEFINES */
|
||||||
|
|
||||||
/* USER CODE END EXPORTED_DEFINES */
|
/* USER CODE END EXPORTED_DEFINES */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** @defgroup USBD_CDC_IF_Exported_Types USBD_CDC_IF_Exported_Types
|
/** @defgroup USBD_CDC_IF_Exported_Types USBD_CDC_IF_Exported_Types
|
||||||
* @brief Types.
|
* @brief Types.
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* USER CODE BEGIN EXPORTED_TYPES */
|
/* USER CODE BEGIN EXPORTED_TYPES */
|
||||||
|
|
||||||
/* USER CODE END EXPORTED_TYPES */
|
/* USER CODE END EXPORTED_TYPES */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** @defgroup USBD_CDC_IF_Exported_Macros USBD_CDC_IF_Exported_Macros
|
/** @defgroup USBD_CDC_IF_Exported_Macros USBD_CDC_IF_Exported_Macros
|
||||||
* @brief Aliases.
|
* @brief Aliases.
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* USER CODE BEGIN EXPORTED_MACRO */
|
/* USER CODE BEGIN EXPORTED_MACRO */
|
||||||
|
|
||||||
/* USER CODE END EXPORTED_MACRO */
|
/* USER CODE END EXPORTED_MACRO */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables
|
/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables
|
||||||
* @brief Public variables.
|
* @brief Public variables.
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** CDC Interface callback. */
|
/** CDC Interface callback. */
|
||||||
extern USBD_CDC_ItfTypeDef USBD_Interface_fops_FS;
|
extern USBD_CDC_ItfTypeDef USBD_Interface_fops_FS;
|
||||||
|
|
||||||
/* USER CODE BEGIN EXPORTED_VARIABLES */
|
/* USER CODE BEGIN EXPORTED_VARIABLES */
|
||||||
|
|
||||||
/* USER CODE END EXPORTED_VARIABLES */
|
/* USER CODE END EXPORTED_VARIABLES */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** @defgroup USBD_CDC_IF_Exported_FunctionsPrototype USBD_CDC_IF_Exported_FunctionsPrototype
|
/** @defgroup USBD_CDC_IF_Exported_FunctionsPrototype USBD_CDC_IF_Exported_FunctionsPrototype
|
||||||
* @brief Public functions declaration.
|
* @brief Public functions declaration.
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len);
|
uint8_t CDC_Transmit_FS(uint8_t *Buf, uint16_t Len);
|
||||||
|
|
||||||
/* USER CODE BEGIN EXPORTED_FUNCTIONS */
|
/* USER CODE BEGIN EXPORTED_FUNCTIONS */
|
||||||
|
uint8_t *CDCInitRxbufferNcallback(void (*callback)(uint32_t));
|
||||||
|
/* USER CODE END EXPORTED_FUNCTIONS */
|
||||||
|
|
||||||
/* USER CODE END EXPORTED_FUNCTIONS */
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* __USBD_CDC_IF_H__ */
|
#endif /* __USBD_CDC_IF_H__ */
|
||||||
|
|
||||||
|
|
|
@ -1,21 +1,21 @@
|
||||||
/* USER CODE BEGIN Header */
|
/* USER CODE BEGIN Header */
|
||||||
/**
|
/**
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @file : usbd_cdc_if.c
|
* @file : usbd_cdc_if.c
|
||||||
* @version : v1.0_Cube
|
* @version : v1.0_Cube
|
||||||
* @brief : Usb device for Virtual Com Port.
|
* @brief : Usb device for Virtual Com Port.
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @attention
|
* @attention
|
||||||
*
|
*
|
||||||
* Copyright (c) 2023 STMicroelectronics.
|
* Copyright (c) 2023 STMicroelectronics.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* This software is licensed under terms that can be found in the LICENSE file
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
* in the root directory of this software component.
|
* in the root directory of this software component.
|
||||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
*
|
*
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
/* USER CODE END Header */
|
/* USER CODE END Header */
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
@ -35,76 +35,75 @@
|
||||||
/* USER CODE END PV */
|
/* USER CODE END PV */
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
* @brief Usb device library.
|
* @brief Usb device library.
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** @addtogroup USBD_CDC_IF
|
/** @addtogroup USBD_CDC_IF
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** @defgroup USBD_CDC_IF_Private_TypesDefinitions USBD_CDC_IF_Private_TypesDefinitions
|
/** @defgroup USBD_CDC_IF_Private_TypesDefinitions USBD_CDC_IF_Private_TypesDefinitions
|
||||||
* @brief Private types.
|
* @brief Private types.
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* USER CODE BEGIN PRIVATE_TYPES */
|
/* USER CODE BEGIN PRIVATE_TYPES */
|
||||||
|
void (*transmitcpltcallback)(uint32_t);
|
||||||
/* USER CODE END PRIVATE_TYPES */
|
/* USER CODE END PRIVATE_TYPES */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** @defgroup USBD_CDC_IF_Private_Defines USBD_CDC_IF_Private_Defines
|
/** @defgroup USBD_CDC_IF_Private_Defines USBD_CDC_IF_Private_Defines
|
||||||
* @brief Private defines.
|
* @brief Private defines.
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* USER CODE BEGIN PRIVATE_DEFINES */
|
/* USER CODE BEGIN PRIVATE_DEFINES */
|
||||||
/* USER CODE END PRIVATE_DEFINES */
|
/* USER CODE END PRIVATE_DEFINES */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** @defgroup USBD_CDC_IF_Private_Macros USBD_CDC_IF_Private_Macros
|
/** @defgroup USBD_CDC_IF_Private_Macros USBD_CDC_IF_Private_Macros
|
||||||
* @brief Private macros.
|
* @brief Private macros.
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* USER CODE BEGIN PRIVATE_MACRO */
|
/* USER CODE BEGIN PRIVATE_MACRO */
|
||||||
|
|
||||||
/* USER CODE END PRIVATE_MACRO */
|
/* USER CODE END PRIVATE_MACRO */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** @defgroup USBD_CDC_IF_Private_Variables USBD_CDC_IF_Private_Variables
|
/** @defgroup USBD_CDC_IF_Private_Variables USBD_CDC_IF_Private_Variables
|
||||||
* @brief Private variables.
|
* @brief Private variables.
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
/* Create buffer for reception and transmission */
|
/* Create buffer for reception and transmission */
|
||||||
/* It's up to user to redefine and/or remove those define */
|
/* It's up to user to redefine and/or remove those define */
|
||||||
|
|
||||||
|
/* USER CODE BEGIN PRIVATE_VARIABLES */
|
||||||
/** Received data over USB are stored in this buffer */
|
/** Received data over USB are stored in this buffer */
|
||||||
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
|
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
|
||||||
|
|
||||||
/** Data to send over USB CDC are stored in this buffer */
|
/** Data to send over USB CDC are stored in this buffer */
|
||||||
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];
|
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];
|
||||||
|
|
||||||
/* USER CODE BEGIN PRIVATE_VARIABLES */
|
|
||||||
|
|
||||||
/* USER CODE END PRIVATE_VARIABLES */
|
/* USER CODE END PRIVATE_VARIABLES */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables
|
/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables
|
||||||
* @brief Public variables.
|
* @brief Public variables.
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern USBD_HandleTypeDef hUsbDeviceFS;
|
extern USBD_HandleTypeDef hUsbDeviceFS;
|
||||||
|
|
||||||
|
@ -113,18 +112,18 @@ extern USBD_HandleTypeDef hUsbDeviceFS;
|
||||||
/* USER CODE END EXPORTED_VARIABLES */
|
/* USER CODE END EXPORTED_VARIABLES */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** @defgroup USBD_CDC_IF_Private_FunctionPrototypes USBD_CDC_IF_Private_FunctionPrototypes
|
/** @defgroup USBD_CDC_IF_Private_FunctionPrototypes USBD_CDC_IF_Private_FunctionPrototypes
|
||||||
* @brief Private functions declaration.
|
* @brief Private functions declaration.
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int8_t CDC_Init_FS(void);
|
static int8_t CDC_Init_FS(void);
|
||||||
static int8_t CDC_DeInit_FS(void);
|
static int8_t CDC_DeInit_FS(void);
|
||||||
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length);
|
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t *pbuf, uint16_t length);
|
||||||
static int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len);
|
static int8_t CDC_Receive_FS(uint8_t *pbuf, uint32_t *Len);
|
||||||
static int8_t CDC_TransmitCplt_FS(uint8_t *pbuf, uint32_t *Len, uint8_t epnum);
|
static int8_t CDC_TransmitCplt_FS(uint8_t *pbuf, uint32_t *Len, uint8_t epnum);
|
||||||
|
|
||||||
/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */
|
/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */
|
||||||
|
@ -132,187 +131,197 @@ static int8_t CDC_TransmitCplt_FS(uint8_t *pbuf, uint32_t *Len, uint8_t epnum);
|
||||||
/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */
|
/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
USBD_CDC_ItfTypeDef USBD_Interface_fops_FS =
|
USBD_CDC_ItfTypeDef USBD_Interface_fops_FS =
|
||||||
{
|
{
|
||||||
CDC_Init_FS,
|
CDC_Init_FS,
|
||||||
CDC_DeInit_FS,
|
CDC_DeInit_FS,
|
||||||
CDC_Control_FS,
|
CDC_Control_FS,
|
||||||
CDC_Receive_FS,
|
CDC_Receive_FS,
|
||||||
CDC_TransmitCplt_FS
|
CDC_TransmitCplt_FS};
|
||||||
};
|
|
||||||
|
|
||||||
/* Private functions ---------------------------------------------------------*/
|
/* Private functions ---------------------------------------------------------*/
|
||||||
/**
|
/**
|
||||||
* @brief Initializes the CDC media low layer over the FS USB IP
|
* @brief Initializes the CDC media low layer over the FS USB IP
|
||||||
* @retval USBD_OK if all operations are OK else USBD_FAIL
|
* @retval USBD_OK if all operations are OK else USBD_FAIL
|
||||||
*/
|
*/
|
||||||
static int8_t CDC_Init_FS(void)
|
static int8_t CDC_Init_FS(void)
|
||||||
{
|
{
|
||||||
/* USER CODE BEGIN 3 */
|
/* USER CODE BEGIN 3 */
|
||||||
/* Set Application Buffers */
|
/* Set Application Buffers */
|
||||||
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0);
|
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0);
|
||||||
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS);
|
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS);
|
||||||
return (USBD_OK);
|
return (USBD_OK);
|
||||||
/* USER CODE END 3 */
|
/* USER CODE END 3 */
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief DeInitializes the CDC media low layer
|
* @brief DeInitializes the CDC media low layer
|
||||||
* @retval USBD_OK if all operations are OK else USBD_FAIL
|
* @retval USBD_OK if all operations are OK else USBD_FAIL
|
||||||
*/
|
*/
|
||||||
static int8_t CDC_DeInit_FS(void)
|
static int8_t CDC_DeInit_FS(void)
|
||||||
{
|
{
|
||||||
/* USER CODE BEGIN 4 */
|
/* USER CODE BEGIN 4 */
|
||||||
return (USBD_OK);
|
return (USBD_OK);
|
||||||
/* USER CODE END 4 */
|
/* USER CODE END 4 */
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Manage the CDC class requests
|
* @brief Manage the CDC class requests
|
||||||
* @param cmd: Command code
|
* @param cmd: Command code
|
||||||
* @param pbuf: Buffer containing command data (request parameters)
|
* @param pbuf: Buffer containing command data (request parameters)
|
||||||
* @param length: Number of data to be sent (in bytes)
|
* @param length: Number of data to be sent (in bytes)
|
||||||
* @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
|
* @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
|
||||||
*/
|
*/
|
||||||
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length)
|
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t *pbuf, uint16_t length)
|
||||||
{
|
{
|
||||||
/* USER CODE BEGIN 5 */
|
/* USER CODE BEGIN 5 */
|
||||||
switch(cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
case CDC_SEND_ENCAPSULATED_COMMAND:
|
case CDC_SEND_ENCAPSULATED_COMMAND:
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CDC_GET_ENCAPSULATED_RESPONSE:
|
case CDC_GET_ENCAPSULATED_RESPONSE:
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CDC_SET_COMM_FEATURE:
|
case CDC_SET_COMM_FEATURE:
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CDC_GET_COMM_FEATURE:
|
case CDC_GET_COMM_FEATURE:
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CDC_CLEAR_COMM_FEATURE:
|
case CDC_CLEAR_COMM_FEATURE:
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
/* Line Coding Structure */
|
/* Line Coding Structure */
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
/* Offset | Field | Size | Value | Description */
|
/* Offset | Field | Size | Value | Description */
|
||||||
/* 0 | dwDTERate | 4 | Number |Data terminal rate, in bits per second*/
|
/* 0 | dwDTERate | 4 | Number |Data terminal rate, in bits per second*/
|
||||||
/* 4 | bCharFormat | 1 | Number | Stop bits */
|
/* 4 | bCharFormat | 1 | Number | Stop bits */
|
||||||
/* 0 - 1 Stop bit */
|
/* 0 - 1 Stop bit */
|
||||||
/* 1 - 1.5 Stop bits */
|
/* 1 - 1.5 Stop bits */
|
||||||
/* 2 - 2 Stop bits */
|
/* 2 - 2 Stop bits */
|
||||||
/* 5 | bParityType | 1 | Number | Parity */
|
/* 5 | bParityType | 1 | Number | Parity */
|
||||||
/* 0 - None */
|
/* 0 - None */
|
||||||
/* 1 - Odd */
|
/* 1 - Odd */
|
||||||
/* 2 - Even */
|
/* 2 - Even */
|
||||||
/* 3 - Mark */
|
/* 3 - Mark */
|
||||||
/* 4 - Space */
|
/* 4 - Space */
|
||||||
/* 6 | bDataBits | 1 | Number Data bits (5, 6, 7, 8 or 16). */
|
/* 6 | bDataBits | 1 | Number Data bits (5, 6, 7, 8 or 16). */
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
case CDC_SET_LINE_CODING:
|
case CDC_SET_LINE_CODING:
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CDC_GET_LINE_CODING:
|
case CDC_GET_LINE_CODING:
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CDC_SET_CONTROL_LINE_STATE:
|
case CDC_SET_CONTROL_LINE_STATE:
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CDC_SEND_BREAK:
|
case CDC_SEND_BREAK:
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (USBD_OK);
|
return (USBD_OK);
|
||||||
/* USER CODE END 5 */
|
/* USER CODE END 5 */
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Data received over USB OUT endpoint are sent over CDC interface
|
* @brief Data received over USB OUT endpoint are sent over CDC interface
|
||||||
* through this function.
|
* through this function.
|
||||||
*
|
*
|
||||||
* @note
|
* @note
|
||||||
* This function will issue a NAK packet on any OUT packet received on
|
* This function will issue a NAK packet on any OUT packet received on
|
||||||
* USB endpoint until exiting this function. If you exit this function
|
* USB endpoint until exiting this function. If you exit this function
|
||||||
* before transfer is complete on CDC interface (ie. using DMA controller)
|
* before transfer is complete on CDC interface (ie. using DMA controller)
|
||||||
* it will result in receiving more data while previous ones are still
|
* it will result in receiving more data while previous ones are still
|
||||||
* not sent.
|
* not sent.
|
||||||
*
|
*
|
||||||
* @param Buf: Buffer of data to be received
|
* @param Buf: Buffer of data to be received
|
||||||
* @param Len: Number of data received (in bytes)
|
* @param Len: Number of data received (in bytes)
|
||||||
* @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
|
* @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
|
||||||
*/
|
*/
|
||||||
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
|
static int8_t CDC_Receive_FS(uint8_t *Buf, uint32_t *Len)
|
||||||
{
|
{
|
||||||
/* USER CODE BEGIN 6 */
|
/* USER CODE BEGIN 6 */
|
||||||
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
|
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
|
||||||
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
|
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
|
||||||
return (USBD_OK);
|
return (USBD_OK);
|
||||||
/* USER CODE END 6 */
|
/* USER CODE END 6 */
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief CDC_Transmit_FS
|
* @brief CDC_Transmit_FS
|
||||||
* Data to send over USB IN endpoint are sent over CDC interface
|
* Data to send over USB IN endpoint are sent over CDC interface
|
||||||
* through this function.
|
* through this function.
|
||||||
* @note
|
* @note
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* @param Buf: Buffer of data to be sent
|
* @param Buf: Buffer of data to be sent
|
||||||
* @param Len: Number of data to be sent (in bytes)
|
* @param Len: Number of data to be sent (in bytes)
|
||||||
* @retval USBD_OK if all operations are OK else USBD_FAIL or USBD_BUSY
|
* @retval USBD_OK if all operations are OK else USBD_FAIL or USBD_BUSY
|
||||||
*/
|
*/
|
||||||
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
|
uint8_t CDC_Transmit_FS(uint8_t *Buf, uint16_t Len)
|
||||||
{
|
{
|
||||||
uint8_t result = USBD_OK;
|
uint8_t result = USBD_OK;
|
||||||
/* USER CODE BEGIN 7 */
|
/* USER CODE BEGIN 7 */
|
||||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
|
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)hUsbDeviceFS.pClassData;
|
||||||
if (hcdc->TxState != 0){
|
if (hcdc->TxState != 0)
|
||||||
return USBD_BUSY;
|
{
|
||||||
}
|
return USBD_BUSY;
|
||||||
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
|
}
|
||||||
result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
|
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
|
||||||
/* USER CODE END 7 */
|
result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
|
||||||
return result;
|
/* USER CODE END 7 */
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t *CDCInitRxbufferNcallback(void (*callback)(uint32_t))
|
||||||
|
{
|
||||||
|
transmitcpltcallback=callback;
|
||||||
|
return (uint8_t *)UserRxBufferFS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief CDC_TransmitCplt_FS
|
* @brief CDC_TransmitCplt_FS
|
||||||
* Data transmitted callback
|
* Data transmitted callback
|
||||||
*
|
*
|
||||||
* @note
|
* @note
|
||||||
* This function is IN transfer complete callback used to inform user that
|
* This function is IN transfer complete callback used to inform user that
|
||||||
* the submitted Data is successfully sent over USB.
|
* the submitted Data is successfully sent over USB.
|
||||||
*
|
*
|
||||||
* @param Buf: Buffer of data to be received
|
* @param Buf: Buffer of data to be received
|
||||||
* @param Len: Number of data received (in bytes)
|
* @param Len: Number of data received (in bytes)
|
||||||
* @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
|
* @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
|
||||||
*/
|
*/
|
||||||
static int8_t CDC_TransmitCplt_FS(uint8_t *Buf, uint32_t *Len, uint8_t epnum)
|
static int8_t CDC_TransmitCplt_FS(uint8_t *Buf, uint32_t *Len, uint8_t epnum)
|
||||||
{
|
{
|
||||||
uint8_t result = USBD_OK;
|
uint8_t result = USBD_OK;
|
||||||
/* USER CODE BEGIN 13 */
|
/* USER CODE BEGIN 13 */
|
||||||
UNUSED(Buf);
|
UNUSED(Buf);
|
||||||
UNUSED(Len);
|
UNUSED(Len);
|
||||||
UNUSED(epnum);
|
UNUSED(epnum);
|
||||||
/* USER CODE END 13 */
|
if(transmitcpltcallback!=NULL)
|
||||||
return result;
|
{
|
||||||
|
transmitcpltcallback(*Len);
|
||||||
|
}
|
||||||
|
/* USER CODE END 13 */
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */
|
/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */
|
||||||
|
@ -320,9 +329,9 @@ static int8_t CDC_TransmitCplt_FS(uint8_t *Buf, uint32_t *Len, uint8_t epnum)
|
||||||
/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */
|
/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -116,6 +116,7 @@ bsp/spi/bsp_spi.c \
|
||||||
bsp/iic/bsp_iic.c \
|
bsp/iic/bsp_iic.c \
|
||||||
bsp/can/bsp_can.c \
|
bsp/can/bsp_can.c \
|
||||||
bsp/usart/bsp_usart.c \
|
bsp/usart/bsp_usart.c \
|
||||||
|
bsp/usb/bsp_usb.c \
|
||||||
bsp/log/bsp_log.c \
|
bsp/log/bsp_log.c \
|
||||||
bsp/bsp_init.c \
|
bsp/bsp_init.c \
|
||||||
modules/algorithm/controller.c \
|
modules/algorithm/controller.c \
|
||||||
|
@ -237,6 +238,7 @@ C_INCLUDES = \
|
||||||
-Ibsp/dwt \
|
-Ibsp/dwt \
|
||||||
-Ibsp/can \
|
-Ibsp/can \
|
||||||
-Ibsp/usart \
|
-Ibsp/usart \
|
||||||
|
-Ibsp/usb \
|
||||||
-Ibsp/gpio \
|
-Ibsp/gpio \
|
||||||
-Ibsp/spi \
|
-Ibsp/spi \
|
||||||
-Ibsp/iic \
|
-Ibsp/iic \
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include "bsp_init.h"
|
#include "bsp_init.h"
|
||||||
#include "bsp_log.h"
|
#include "bsp_log.h"
|
||||||
#include "bsp_dwt.h"
|
#include "bsp_dwt.h"
|
||||||
|
#include "bsp_usb.h"
|
||||||
#include "bsp_buzzer.h"
|
#include "bsp_buzzer.h"
|
||||||
#include "bsp_led.h"
|
#include "bsp_led.h"
|
||||||
#include "bsp_temperature.h"
|
#include "bsp_temperature.h"
|
||||||
|
@ -10,6 +11,7 @@ void BSPInit()
|
||||||
{
|
{
|
||||||
DWT_Init(168);
|
DWT_Init(168);
|
||||||
BSPLogInit();
|
BSPLogInit();
|
||||||
|
USBInit(); // 务必在进入操作系统之前执行USB初始化
|
||||||
|
|
||||||
// legacy support,待删除,将在实现了led/tempctrl/buzzer的module之后移动到app层
|
// legacy support,待删除,将在实现了led/tempctrl/buzzer的module之后移动到app层
|
||||||
LEDInit();
|
LEDInit();
|
||||||
|
|
|
@ -1 +1,27 @@
|
||||||
#include "bsp_usb.h"
|
#include "bsp_usb.h"
|
||||||
|
|
||||||
|
static uint8_t *bsp_usb_rx_buffer; // 接收到的数据会被放在这里,buffer size为2028
|
||||||
|
// 注意usb单个数据包(Full speed模式下)最大为64byte,超出可能会出现丢包情况
|
||||||
|
|
||||||
|
__weak void USBTransmitCpltCallback(uint32_t len)
|
||||||
|
{
|
||||||
|
// 本次发送的数据
|
||||||
|
UNUSED(len);
|
||||||
|
// 传输完成会调用此函数,to do something
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t *USBInit()
|
||||||
|
{
|
||||||
|
USB_ResetPort(USB_OTG_FS); // 上电后重新枚举usb设备
|
||||||
|
USBTransmit((uint8_t *)"USB DEVICE READY", sizeof("USB DEVICE READY")); // 发送初始化完成信息
|
||||||
|
bsp_usb_rx_buffer = CDCInitRxbufferNcallback(USBTransmitCpltCallback); // 获取接收数据指针
|
||||||
|
|
||||||
|
return bsp_usb_rx_buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
void USBTransmit(uint8_t *buffer, uint16_t len)
|
||||||
|
{
|
||||||
|
CDC_Transmit_FS(buffer, len); // 发送
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,4 +2,19 @@
|
||||||
#include "usbd_cdc.h"
|
#include "usbd_cdc.h"
|
||||||
#include "usbd_conf.h"
|
#include "usbd_conf.h"
|
||||||
#include "usbd_desc.h"
|
#include "usbd_desc.h"
|
||||||
|
#include "usbd_cdc_if.h"
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
USB_CONNECTION_RAWDATA = 0,
|
||||||
|
USB_CONNECTION_VOFA,
|
||||||
|
USB_CONNECTION_SEASKY,
|
||||||
|
} USB_Connection_Type_e; // 选择usb连接模式,默认为原始数据
|
||||||
|
// 方便调试,也可以不用
|
||||||
|
|
||||||
|
/* @note 虚拟串口的波特率/校验位/数据位等动态可变,取决于上位机的设定 */
|
||||||
|
/* 使用时不需要关心这些设置(作为从机) */
|
||||||
|
|
||||||
|
uint8_t *USBInit(); // bsp初始化时调用会重新枚举设备
|
||||||
|
|
||||||
|
void USBTransmit(uint8_t *buffer, uint16_t len); // 通过usb发送数据
|
|
@ -0,0 +1,3 @@
|
||||||
|
# bsp usb
|
||||||
|
|
||||||
|
简单写点,有待优化.
|
|
@ -148,29 +148,65 @@ static uint8_t BMI088GyroInit(BMI088Instance *bmi088)
|
||||||
reg = BMI088_Gyro_Init_Table[i][REG];
|
reg = BMI088_Gyro_Init_Table[i][REG];
|
||||||
data = BMI088_Gyro_Init_Table[i][DATA];
|
data = BMI088_Gyro_Init_Table[i][DATA];
|
||||||
BMI088GyroWrite(bmi088, reg, data); // 写入寄存器
|
BMI088GyroWrite(bmi088, reg, data); // 写入寄存器
|
||||||
BMI088GyroRead(bmi088, reg, &data, 1); // 写完之后立刻读回检查
|
BMI088GyroRead(bmi088, reg, &data, 1); // 写完之后立刻读回对应寄存器检查是否写入成功
|
||||||
if (data != BMI088_Gyro_Init_Table[i][DATA])
|
if (data != BMI088_Gyro_Init_Table[i][DATA])
|
||||||
error |= BMI088_Gyro_Init_Table[i][ERROR];
|
error |= BMI088_Gyro_Init_Table[i][ERROR];
|
||||||
//{i--;} 可以设置retry次数,如果retry次数用完了,则返回error
|
//{i--;} 可以设置retry次数,尝试重新写入.如果retry次数用完了,则返回error
|
||||||
}
|
}
|
||||||
|
|
||||||
bmi088->acc_coef = 1.0; // 尚未初始化时设定为1,使得BMI088Acquire可以正常使用
|
|
||||||
bmi088->BMI088_GYRO_SEN = BMI088_GYRO_2000_SEN; // 后续改为从initTable中获取
|
|
||||||
bmi088->BMI088_ACCEL_SEN = BMI088_ACCEL_6G_SEN; // 用宏字符串拼接
|
|
||||||
bmi088->gNorm
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
// -------------------------以上为私有函数,用于初始化BMI088acc和gyro的硬件和配置--------------------------------//
|
// -------------------------以上为私有函数,用于初始化BMI088acc和gyro的硬件和配置--------------------------------//
|
||||||
|
|
||||||
|
// -------------------------以下为私有函数,private用于IT模式下的中断处理---------------------------------//
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 待编写,很快!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static void BMI088AccSPIFinishCallback(SPIInstance *spi)
|
||||||
|
{
|
||||||
|
static BMI088Instance *bmi088;
|
||||||
|
bmi088 = (BMI088Instance *)(spi->id);
|
||||||
|
// code to go here ...
|
||||||
|
}
|
||||||
|
|
||||||
|
static void BMI088GyroSPIFinishCallback(SPIInstance *spi)
|
||||||
|
{
|
||||||
|
static BMI088Instance *bmi088;
|
||||||
|
bmi088 = (BMI088Instance *)(spi->id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void BMI088AccINTCallback(GPIOInstance *gpio)
|
||||||
|
{
|
||||||
|
static BMI088Instance *bmi088;
|
||||||
|
bmi088 = (BMI088Instance *)(gpio->id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void BMI088GyroINTCallback(GPIOInstance *gpio)
|
||||||
|
{
|
||||||
|
static BMI088Instance *bmi088;
|
||||||
|
bmi088 = (BMI088Instance *)(gpio->id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------以上为私有函数,private用于IT模式下的中断处理---------------------------------//
|
||||||
|
|
||||||
// -------------------------以下为公有函数,用于注册BMI088,标定和数据读取--------------------------------//
|
// -------------------------以下为公有函数,用于注册BMI088,标定和数据读取--------------------------------//
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief
|
||||||
|
* @todo 现在要考虑一下数据返回的方式,指针还是结构体? 7个float数据有点费时,不然用DMA? or memcpy
|
||||||
|
*
|
||||||
|
* @param bmi088
|
||||||
|
* @return BMI088_Data_t
|
||||||
|
*/
|
||||||
BMI088_Data_t BMI088Acquire(BMI088Instance *bmi088)
|
BMI088_Data_t BMI088Acquire(BMI088Instance *bmi088)
|
||||||
{
|
{
|
||||||
// 分配空间保存返回的数据,指针传递
|
// 分配空间保存返回的数据,指针传递
|
||||||
static BMI088_Data_t data_store;
|
static BMI088_Data_t data_store;
|
||||||
static float dt_imu = 1.0; // 初始化为1,这样也可以不用first_read_flag,各有优劣
|
static float dt_imu = 1.0; // 初始化为1,这样也可以不用first_read_flag,各有优劣
|
||||||
// 如果是blocking模式,则主动触发一次读取并返回数据
|
// 如果是blocking模式,则主动触发一次读取并返回数据
|
||||||
static uint8_t buf[6] = {0}; // 最多读取6个byte(gyro)
|
static uint8_t buf[6] = {0}; // 最多读取6个byte(gyro/acc,temp是2)
|
||||||
static uint8_t first_read_flag; // 判断是否时第一次进入此函数(第一次读取)
|
static uint8_t first_read_flag; // 判断是否时第一次进入此函数(第一次读取)
|
||||||
// 用于初始化DWT的计数,暂时没想到更好的方法
|
// 用于初始化DWT的计数,暂时没想到更好的方法
|
||||||
if (!first_read_flag)
|
if (!first_read_flag)
|
||||||
|
@ -182,7 +218,7 @@ BMI088_Data_t BMI088Acquire(BMI088Instance *bmi088)
|
||||||
BMI088AccelRead(bmi088, BMI088_ACCEL_XOUT_L, buf, 6);
|
BMI088AccelRead(bmi088, BMI088_ACCEL_XOUT_L, buf, 6);
|
||||||
static float calc_coef_acc; // 防止重复计算
|
static float calc_coef_acc; // 防止重复计算
|
||||||
if (!first_read_flag) // 初始化的时候赋值
|
if (!first_read_flag) // 初始化的时候赋值
|
||||||
calc_coef_acc = bmi088->BMI088_ACCEL_SEN * bmi088->acc_coef;
|
calc_coef_acc = bmi088->BMI088_ACCEL_SEN * bmi088->acc_coef; // 你要是不爽可以用宏或者全局变量,但我认为你现在很爽
|
||||||
bmi088->acc[0] = calc_coef_acc * (float)(int16_t)(((buf[1]) << 8) | buf[0]);
|
bmi088->acc[0] = calc_coef_acc * (float)(int16_t)(((buf[1]) << 8) | buf[0]);
|
||||||
bmi088->acc[1] = calc_coef_acc * (float)(int16_t)(((buf[3]) << 8) | buf[2]);
|
bmi088->acc[1] = calc_coef_acc * (float)(int16_t)(((buf[3]) << 8) | buf[2]);
|
||||||
bmi088->acc[3] = calc_coef_acc * (float)(int16_t)(((buf[5]) << 8) | buf[4]);
|
bmi088->acc[3] = calc_coef_acc * (float)(int16_t)(((buf[5]) << 8) | buf[4]);
|
||||||
|
@ -235,7 +271,7 @@ BMI088_Data_t BMI088Acquire(BMI088Instance *bmi088)
|
||||||
*/
|
*/
|
||||||
void BMI088CalibrateIMU(BMI088Instance *_bmi088)
|
void BMI088CalibrateIMU(BMI088Instance *_bmi088)
|
||||||
{
|
{
|
||||||
if (_bmi088->cali_mode == BMI088_CALIBRATE_ONLINE_MODE)
|
if (_bmi088->cali_mode == BMI088_CALIBRATE_ONLINE_MODE) // 性感bmi088在线标定,耗时6s
|
||||||
{
|
{
|
||||||
// 一次性参数用完就丢,不用static
|
// 一次性参数用完就丢,不用static
|
||||||
float startTime; // 开始标定时间,用于确定是否超时
|
float startTime; // 开始标定时间,用于确定是否超时
|
||||||
|
@ -288,7 +324,7 @@ void BMI088CalibrateIMU(BMI088Instance *_bmi088)
|
||||||
_bmi088->gyro_offset[2] += _bmi088->gyro[2]; // 累加当前值,最后除以calib times获得零飘
|
_bmi088->gyro_offset[2] += _bmi088->gyro[2]; // 累加当前值,最后除以calib times获得零飘
|
||||||
// 因为标定时传感器静止,所以采集到的值就是漂移
|
// 因为标定时传感器静止,所以采集到的值就是漂移
|
||||||
|
|
||||||
if (i == 0)
|
if (i == 0) // 避免未定义的行为(else中)
|
||||||
{
|
{
|
||||||
gNormMax = gNormTemp; // 初始化成当前的重力加速度模长
|
gNormMax = gNormTemp; // 初始化成当前的重力加速度模长
|
||||||
gNormMin = gNormTemp;
|
gNormMin = gNormTemp;
|
||||||
|
@ -340,9 +376,10 @@ void BMI088CalibrateIMU(BMI088Instance *_bmi088)
|
||||||
gyroDiff[2] > 0.15f ||
|
gyroDiff[2] > 0.15f ||
|
||||||
fabsf(_bmi088->gyro_offset[0]) > 0.01f ||
|
fabsf(_bmi088->gyro_offset[0]) > 0.01f ||
|
||||||
fabsf(_bmi088->gyro_offset[1]) > 0.01f ||
|
fabsf(_bmi088->gyro_offset[1]) > 0.01f ||
|
||||||
fabsf(_bmi088->gyro_offset[2]) > 0.01f); // 条件
|
fabsf(_bmi088->gyro_offset[2]) > 0.01f); // 满足条件说明标定环境不好
|
||||||
}
|
}
|
||||||
if (_bmi088->cali_mode == BMI088_LOAD_PRE_CALI_MODE) // 如果标定失败也会进来
|
|
||||||
|
if (_bmi088->cali_mode == BMI088_LOAD_PRE_CALI_MODE) // 如果标定失败也会进来,直接使用离线数据
|
||||||
{
|
{
|
||||||
// 读取标定数据
|
// 读取标定数据
|
||||||
// code to go here ...
|
// code to go here ...
|
||||||
|
@ -385,7 +422,23 @@ BMI088Instance *BMI088Register(BMI088_Init_Config_s *config)
|
||||||
|
|
||||||
// 还有其他方案可用,比如阻塞等待传输完成,但是比较笨.
|
// 还有其他方案可用,比如阻塞等待传输完成,但是比较笨.
|
||||||
|
|
||||||
// 注册实例
|
// 根据参数选择工作模式
|
||||||
|
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->spi_acc = SPIRegister(&config->spi_acc_config);
|
bmi088_instance->spi_acc = SPIRegister(&config->spi_acc_config);
|
||||||
bmi088_instance->spi_gyro = SPIRegister(&config->spi_gyro_config);
|
bmi088_instance->spi_gyro = SPIRegister(&config->spi_gyro_config);
|
||||||
bmi088_instance->acc_int = GPIORegister(&config->acc_int_config);
|
bmi088_instance->acc_int = GPIORegister(&config->acc_int_config);
|
||||||
|
@ -396,6 +449,12 @@ BMI088Instance *BMI088Register(BMI088_Init_Config_s *config)
|
||||||
error |= BMI088AccelInit(bmi088_instance);
|
error |= BMI088AccelInit(bmi088_instance);
|
||||||
error |= BMI088GyroInit(bmi088_instance);
|
error |= BMI088GyroInit(bmi088_instance);
|
||||||
|
|
||||||
|
// 尚未标定时先设置为默认值,使得数据拼接和缩放可以正常进行
|
||||||
|
bmi088_instance->acc_coef = 1.0; // 尚未初始化时设定为1,使得BMI088Acquire可以正常使用
|
||||||
|
bmi088_instance->BMI088_GYRO_SEN = BMI088_GYRO_2000_SEN; // 后续改为从initTable中获取
|
||||||
|
bmi088_instance->BMI088_ACCEL_SEN = BMI088_ACCEL_6G_SEN; // 用宏字符串拼接
|
||||||
|
// bmi088->gNorm =
|
||||||
|
|
||||||
// 标定acc和gyro
|
// 标定acc和gyro
|
||||||
BMI088CalibrateIMU(bmi088_instance);
|
BMI088CalibrateIMU(bmi088_instance);
|
||||||
|
|
||||||
|
|
|
@ -72,19 +72,19 @@ typedef struct
|
||||||
uint8_t acc_overrun : 1;
|
uint8_t acc_overrun : 1;
|
||||||
uint8_t temp_overrun : 1;
|
uint8_t temp_overrun : 1;
|
||||||
uint8_t imu_ready : 1; // 1:IMU数据准备好,0:IMU数据未准备好(gyro+acc)
|
uint8_t imu_ready : 1; // 1:IMU数据准备好,0:IMU数据未准备好(gyro+acc)
|
||||||
// 后续可添加其他标志位
|
// 后续可添加其他标志位,不够用可以扩充16or32,太多可以删
|
||||||
} update_flag;
|
} update_flag;
|
||||||
} BMI088Instance;
|
} BMI088Instance;
|
||||||
|
|
||||||
/* BMI088初始化配置 */
|
/* BMI088初始化配置 */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
BMI088_Work_Mode_e work_mode;
|
||||||
|
BMI088_Calibrate_Mode_e cali_mode;
|
||||||
SPI_Init_Config_s spi_gyro_config;
|
SPI_Init_Config_s spi_gyro_config;
|
||||||
SPI_Init_Config_s spi_acc_config;
|
SPI_Init_Config_s spi_acc_config;
|
||||||
GPIO_Init_Config_s gyro_int_config;
|
GPIO_Init_Config_s gyro_int_config;
|
||||||
GPIO_Init_Config_s acc_int_config;
|
GPIO_Init_Config_s acc_int_config;
|
||||||
BMI088_Work_Mode_e work_mode;
|
|
||||||
BMI088_Calibrate_Mode_e cali_mode;
|
|
||||||
PID_Init_Config_s heat_pid_config;
|
PID_Init_Config_s heat_pid_config;
|
||||||
PWM_Init_Config_s heat_pwm_config;
|
PWM_Init_Config_s heat_pwm_config;
|
||||||
} BMI088_Init_Config_s;
|
} BMI088_Init_Config_s;
|
||||||
|
@ -105,4 +105,12 @@ BMI088Instance *BMI088Register(BMI088_Init_Config_s *config);
|
||||||
* @return BMI088_Data_t 读取到的数据
|
* @return BMI088_Data_t 读取到的数据
|
||||||
*/
|
*/
|
||||||
BMI088_Data_t BMI088Acquire(BMI088Instance *bmi088);
|
BMI088_Data_t BMI088Acquire(BMI088Instance *bmi088);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 标定传感器
|
||||||
|
*
|
||||||
|
* @param _bmi088 待标定的实例
|
||||||
|
*/
|
||||||
|
void BMI088CalibrateIMU(BMI088Instance *_bmi088);
|
||||||
|
|
||||||
#endif // !__BMI088_H__
|
#endif // !__BMI088_H__
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
static Vision_Recv_s recv_data;
|
static Vision_Recv_s recv_data;
|
||||||
// @todo:由于后续需要进行IMU-Cam的硬件触发采集控制,因此可能需要将发送设置为定时任务,或由IMU采集完成产生的中断唤醒的任务,
|
// @todo:由于后续需要进行IMU-Cam的硬件触发采集控制,因此可能需要将发送设置为定时任务,或由IMU采集完成产生的中断唤醒的任务,
|
||||||
// 使得时间戳对齐. 因此,在send_data中设定其他的标志位数据,让ins_task填充姿态值.
|
// 后者显然更nice,使得时间戳对齐. 因此,在send_data中设定其他的标志位数据,让ins_task填充姿态值.
|
||||||
// static Vision_Send_s send_data;
|
// static Vision_Send_s send_data;
|
||||||
static USARTInstance *vision_usart_instance;
|
static USARTInstance *vision_usart_instance;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue