From 5ed47878828153803233daa26fdb7d48e712334c Mon Sep 17 00:00:00 2001 From: Maxime Date: Tue, 20 May 2025 14:19:31 +0200 Subject: [PATCH] =?UTF-8?q?correction=20et=20code=20pid=20pr=C3=AAt=20?= =?UTF-8?q?=C3=A0=20l'envoi=20dans=20les=20moteurs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Inc/tim.h | 3 + Core/Src/main.c | 2 +- Core/Src/modelec.cpp | 22 +-- Core/Src/motors.cpp | 18 +- Core/Src/tim.c | 134 ++++++++++++- USB_Device/App/usbd_cdc_if.c | 370 +++++++++++++++++++++++++++++------ USB_Device/App/usbd_cdc_if.h | 111 ++++++++++- pcb_odo.ioc | 35 +++- 8 files changed, 604 insertions(+), 91 deletions(-) diff --git a/Core/Inc/tim.h b/Core/Inc/tim.h index 0e17667..5b0c7db 100644 --- a/Core/Inc/tim.h +++ b/Core/Inc/tim.h @@ -38,6 +38,8 @@ extern TIM_HandleTypeDef htim2; extern TIM_HandleTypeDef htim3; +extern TIM_HandleTypeDef htim8; + /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ @@ -45,6 +47,7 @@ extern TIM_HandleTypeDef htim3; void MX_TIM1_Init(void); void MX_TIM2_Init(void); void MX_TIM3_Init(void); +void MX_TIM8_Init(void); void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); diff --git a/Core/Src/main.c b/Core/Src/main.c index 4e56626..766b66e 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -22,7 +22,6 @@ #include "usb_device.h" #include "gpio.h" - /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ @@ -98,6 +97,7 @@ int main(void) MX_TIM1_Init(); MX_TIM3_Init(); MX_USB_Device_Init(); + MX_TIM8_Init(); /* USER CODE BEGIN 2 */ // HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1); // IN1A diff --git a/Core/Src/modelec.cpp b/Core/Src/modelec.cpp index ee7bf94..aa7c05c 100644 --- a/Core/Src/modelec.cpp +++ b/Core/Src/modelec.cpp @@ -79,7 +79,7 @@ void determinationCoefPosition(Point objectifPoint, Point pointActuel, PidPositi int erreurG = pidG.getPWMCommand(nouvelOrdreG); int erreurD = pidD.getPWMCommand(nouvelOrdreD); - const int maxErreur = 20; + const int maxErreur = 5; if (erreurG > maxErreur) { erreurG = maxErreur; @@ -112,7 +112,7 @@ void ModelecOdometrySetup(void **out_pid, void **out_pidG, void **out_pidD) { theta = 0.0f; //motor.accelerer(300); - *out_pid = new PidPosition(0,0,0,0,0,0,Point()); + *out_pid = new PidPosition(1.5,0.02,0.4,3.0, 0.01, 0.6, Point()); *out_pidG = new PidVitesse(0.2, 0.05, 0.01, 0); *out_pidD = new PidVitesse(0.2, 0.05, 0.01, 0); @@ -172,8 +172,8 @@ void ModelecOdometryUpdate() { //motor.setLeftCurrentSpeed(vitesseLeft); //motor.setRightCurrentSpeed(vitesseRight); - motor.setLeftCurrentSpeed(motor.getLeftCurrentSpeed()+0.05); - motor.setRightCurrentSpeed(motor.getRightCurrentSpeed()+0.05); + motor.setLeftCurrentSpeed(vitesseLeft); + motor.setRightCurrentSpeed(vitesseRight); } void publishStatus(){ @@ -195,21 +195,21 @@ void ModelecOdometryLoop(void* pid, void* pidG, void* pidD) { //On met à jour toutes les 10ms if (isDelayPassed(10)) { ModelecOdometryUpdate(); - USB_Comm_Process(); - /* - HAL_Delay(1000); + //USB_Comm_Process(); + + //HAL_Delay(1000); Point currentPoint(x, y,theta, StatePoint::INTERMEDIAIRE); - Point targetPoint(0.20, 0.20,0, StatePoint::FINAL); + Point targetPoint(0.50, 0.0,0, StatePoint::FINAL); char debugMsg[128]; sprintf(debugMsg, "Speed avant determination : L=%.3f | R=%.3f\r\n", - motor.getLeftCurrentSpeed(), motor.getRightCurrentSpeed()); + motor.getLeftCurrentSpeed(), motor.getRightCurrentSpeed()); CDC_Transmit_FS((uint8_t*)debugMsg, strlen(debugMsg)); determinationCoefPosition(currentPoint,targetPoint, *pidPosition, *pidVitesseG, *pidVitesseD); - HAL_Delay(1000); + //HAL_Delay(1000); motor.update(); - */ + diff --git a/Core/Src/motors.cpp b/Core/Src/motors.cpp index 18495ef..c23c65f 100644 --- a/Core/Src/motors.cpp +++ b/Core/Src/motors.cpp @@ -125,6 +125,15 @@ void Motor::stopTurning() { void Motor::update() { + const int16_t PWM_MAX = 626; + + + if (this->leftTarget_PWM > PWM_MAX) this->leftTarget_PWM = PWM_MAX; + if (this->leftTarget_PWM < -PWM_MAX) this->leftTarget_PWM = -PWM_MAX; + + if (this->rightTarget_PWM > PWM_MAX) this->rightTarget_PWM = PWM_MAX; + if (this->rightTarget_PWM < -PWM_MAX) this->rightTarget_PWM = -PWM_MAX; + // Appliquer targetSpeed dans currentSpeed this->leftCurrent_PWM = this->leftTarget_PWM; this->rightCurrent_PWM = this->rightTarget_PWM; @@ -146,12 +155,15 @@ void Motor::update() { TIM1->CCR2 = static_cast(-this->rightCurrent_PWM); // IN2B (arrière) TIM1->CCR1 = 0; // IN1B } + //[STM32] PWM_LEFT: 600 | PWM_RIGHT: 600 || TIM8->CCR1: 0 | TIM8->CCR2: 0 M1->CCR1: 600 | TIM1->CCR2: 0 char msg[128]; - snprintf(msg, sizeof(msg), - "TIM8->CCR1: %lu | TIM8->CCR2: %lu | TIM1->CCR1: %lu | TIM1->CCR2: %lu\r\n", + snprintf(msg, sizeof(msg), + "PWM_LEFT: %d | PWM_RIGHT: %d || TIM8->CCR1: %lu | TIM8->CCR2: %lu | TIM1->CCR1: %lu | TIM1->CCR2: %lu\r\n", + this->leftCurrent_PWM, this->rightCurrent_PWM, (uint32_t)TIM8->CCR1, (uint32_t)TIM8->CCR2, (uint32_t)TIM1->CCR1, (uint32_t)TIM1->CCR2); - CDC_Transmit_FS((uint8_t*)msg, strlen(msg)); + + CDC_Transmit_FS((uint8_t*)msg, strlen(msg)); } diff --git a/Core/Src/tim.c b/Core/Src/tim.c index 80aad96..f56a766 100644 --- a/Core/Src/tim.c +++ b/Core/Src/tim.c @@ -27,6 +27,7 @@ TIM_HandleTypeDef htim1; TIM_HandleTypeDef htim2; TIM_HandleTypeDef htim3; +TIM_HandleTypeDef htim8; /* TIM1 init function */ void MX_TIM1_Init(void) @@ -196,6 +197,87 @@ void MX_TIM3_Init(void) /* USER CODE END TIM3_Init 2 */ +} +/* TIM8 init function */ +void MX_TIM8_Init(void) +{ + + /* USER CODE BEGIN TIM8_Init 0 */ + + /* USER CODE END TIM8_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + TIM_OC_InitTypeDef sConfigOC = {0}; + TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; + + /* USER CODE BEGIN TIM8_Init 1 */ + + /* USER CODE END TIM8_Init 1 */ + htim8.Instance = TIM8; + htim8.Init.Prescaler = 0; + htim8.Init.CounterMode = TIM_COUNTERMODE_UP; + htim8.Init.Period = 630; + htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim8.Init.RepetitionCounter = 0; + htim8.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; + if (HAL_TIM_Base_Init(&htim8) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim8, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_Init(&htim8) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim8, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; + sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; + if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) + { + Error_Handler(); + } + sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; + sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; + sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; + sBreakDeadTimeConfig.DeadTime = 0; + sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; + sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; + sBreakDeadTimeConfig.BreakFilter = 0; + sBreakDeadTimeConfig.BreakAFMode = TIM_BREAK_AFMODE_INPUT; + sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE; + sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH; + sBreakDeadTimeConfig.Break2Filter = 0; + sBreakDeadTimeConfig.Break2AFMode = TIM_BREAK_AFMODE_INPUT; + sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; + if (HAL_TIMEx_ConfigBreakDeadTime(&htim8, &sBreakDeadTimeConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM8_Init 2 */ + + /* USER CODE END TIM8_Init 2 */ + HAL_TIM_MspPostInit(&htim8); + } void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) @@ -212,6 +294,17 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) /* USER CODE END TIM1_MspInit 1 */ } + else if(tim_baseHandle->Instance==TIM8) + { + /* USER CODE BEGIN TIM8_MspInit 0 */ + + /* USER CODE END TIM8_MspInit 0 */ + /* TIM8 clock enable */ + __HAL_RCC_TIM8_CLK_ENABLE(); + /* USER CODE BEGIN TIM8_MspInit 1 */ + + /* USER CODE END TIM8_MspInit 1 */ + } } void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef* tim_encoderHandle) @@ -284,7 +377,6 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) /* USER CODE BEGIN TIM1_MspPostInit 0 */ /* USER CODE END TIM1_MspPostInit 0 */ - __HAL_RCC_GPIOA_CLK_ENABLE(); /**TIM1 GPIO Configuration PA8 ------> TIM1_CH1 @@ -301,6 +393,35 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) /* USER CODE END TIM1_MspPostInit 1 */ } + else if(timHandle->Instance==TIM8) + { + /* USER CODE BEGIN TIM8_MspPostInit 0 */ + + /* USER CODE END TIM8_MspPostInit 0 */ + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**TIM8 GPIO Configuration + PA14 ------> TIM8_CH2 + PA15 ------> TIM8_CH1 + */ + GPIO_InitStruct.Pin = GPIO_PIN_14; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF5_TIM8; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_15; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF2_TIM8; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM8_MspPostInit 1 */ + + /* USER CODE END TIM8_MspPostInit 1 */ + } } @@ -318,6 +439,17 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) /* USER CODE END TIM1_MspDeInit 1 */ } + else if(tim_baseHandle->Instance==TIM8) + { + /* USER CODE BEGIN TIM8_MspDeInit 0 */ + + /* USER CODE END TIM8_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM8_CLK_DISABLE(); + /* USER CODE BEGIN TIM8_MspDeInit 1 */ + + /* USER CODE END TIM8_MspDeInit 1 */ + } } void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef* tim_encoderHandle) diff --git a/USB_Device/App/usbd_cdc_if.c b/USB_Device/App/usbd_cdc_if.c index e3d262c..c769c92 100644 --- a/USB_Device/App/usbd_cdc_if.c +++ b/USB_Device/App/usbd_cdc_if.c @@ -1,50 +1,142 @@ -/* usbd_cdc_if.c */ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : usbd_cdc_if.c + * @version : v3.0_Cube + * @brief : Usb device for Virtual Com Port. + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ #include "usbd_cdc_if.h" -#include -#include + +/* USER CODE BEGIN INCLUDE */ + +/* USER CODE END INCLUDE */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ + +/* USER CODE BEGIN PV */ +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE END PV */ + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @brief Usb device library. + * @{ + */ + +/** @addtogroup USBD_CDC_IF + * @{ + */ + +/** @defgroup USBD_CDC_IF_Private_TypesDefinitions USBD_CDC_IF_Private_TypesDefinitions + * @brief Private types. + * @{ + */ + +/* USER CODE BEGIN PRIVATE_TYPES */ + +/* USER CODE END PRIVATE_TYPES */ + +/** + * @} + */ + +/** @defgroup USBD_CDC_IF_Private_Defines USBD_CDC_IF_Private_Defines + * @brief Private defines. + * @{ + */ + +/* USER CODE BEGIN PRIVATE_DEFINES */ +/* USER CODE END PRIVATE_DEFINES */ + +/** + * @} + */ + +/** @defgroup USBD_CDC_IF_Private_Macros USBD_CDC_IF_Private_Macros + * @brief Private macros. + * @{ + */ + +/* USER CODE BEGIN PRIVATE_MACRO */ + +/* USER CODE END PRIVATE_MACRO */ + +/** + * @} + */ + +/** @defgroup USBD_CDC_IF_Private_Variables USBD_CDC_IF_Private_Variables + * @brief Private variables. + * @{ + */ +/* Create buffer for reception and transmission */ +/* It's up to user to redefine and/or remove those define */ +/** Received data over USB are stored in this buffer */ +uint8_t UserRxBufferFS[APP_RX_DATA_SIZE]; + +/** Data to send over USB CDC are stored in this buffer */ +uint8_t UserTxBufferFS[APP_TX_DATA_SIZE]; + +/* USER CODE BEGIN PRIVATE_VARIABLES */ + +/* USER CODE END PRIVATE_VARIABLES */ + +/** + * @} + */ + +/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables + * @brief Public variables. + * @{ + */ extern USBD_HandleTypeDef hUsbDeviceFS; -static uint8_t UserRxBufferFS[APP_RX_DATA_SIZE]; -static uint8_t UserTxBufferFS[APP_TX_DATA_SIZE]; +/* USER CODE BEGIN EXPORTED_VARIABLES */ -static int8_t CDC_Init_FS(void) +/* USER CODE END EXPORTED_VARIABLES */ + +/** + * @} + */ + +/** @defgroup USBD_CDC_IF_Private_FunctionPrototypes USBD_CDC_IF_Private_FunctionPrototypes + * @brief Private functions declaration. + * @{ + */ + +static int8_t CDC_Init_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_Receive_FS(uint8_t* pbuf, uint32_t *Len); +static int8_t CDC_TransmitCplt_FS(uint8_t *pbuf, uint32_t *Len, uint8_t epnum); + +/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */ + +/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */ + +/** + * @} + */ + +USBD_CDC_ItfTypeDef USBD_Interface_fops_FS = { - USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0); - USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS); - USBD_CDC_ReceivePacket(&hUsbDeviceFS); - return (USBD_OK); -} - -static int8_t CDC_DeInit_FS(void) -{ - return (USBD_OK); -} - -static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length) -{ - return (USBD_OK); -} - -static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) -{ - Buf[*Len] = '\0'; - USB_CDC_ProcessCommand((char*)Buf); - USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]); - USBD_CDC_ReceivePacket(&hUsbDeviceFS); - return (USBD_OK); -} - -static int8_t CDC_TransmitCplt_FS(uint8_t *Buf, uint32_t *Len, uint8_t epnum) -{ - UNUSED(Buf); - UNUSED(Len); - UNUSED(epnum); - return (USBD_OK); -} - -USBD_CDC_ItfTypeDef USBD_Interface_fops_FS = { CDC_Init_FS, CDC_DeInit_FS, CDC_Control_FS, @@ -52,35 +144,185 @@ USBD_CDC_ItfTypeDef USBD_Interface_fops_FS = { CDC_TransmitCplt_FS }; -uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len) +/* Private functions ---------------------------------------------------------*/ +/** + * @brief Initializes the CDC media low layer over the FS USB IP + * @retval USBD_OK if all operations are OK else USBD_FAIL + */ +static int8_t CDC_Init_FS(void) { - if (hUsbDeviceFS.pClassData == NULL) return USBD_FAIL; - USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len); - return USBD_CDC_TransmitPacket(&hUsbDeviceFS); + /* USER CODE BEGIN 3 */ + /* Set Application Buffers */ + USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0); + USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS); + return (USBD_OK); + /* USER CODE END 3 */ } -/* Command parser */ -void USB_CDC_ProcessCommand(const char* command) +/** + * @brief DeInitializes the CDC media low layer + * @retval USBD_OK if all operations are OK else USBD_FAIL + */ +static int8_t CDC_DeInit_FS(void) { - char response[APP_TX_DATA_SIZE]; + /* USER CODE BEGIN 4 */ + return (USBD_OK); + /* USER CODE END 4 */ +} - if (strncmp(command, "GET;POS", 7) == 0) { - snprintf(response, sizeof(response), "SET;POS;100;200;1.57\r\n"); - } else if (strncmp(command, "GET;SPEED", 9) == 0) { - snprintf(response, sizeof(response), "SET;SPEED;10;20;0.5\r\n"); - } else if (strncmp(command, "GET;DIST;", 9) == 0) { - int tof_id = atoi(command + 9); - snprintf(response, sizeof(response), "SET;DIST;%d;123\r\n", tof_id); - } else if (strncmp(command, "GET;PID", 7) == 0) { - snprintf(response, sizeof(response), "SET;PID;1.0;0.5;0.1\r\n"); - } else if (strncmp(command, "SET;POS;", 9) == 0 || - strncmp(command, "SET;PID;", 9) == 0 || - strncmp(command, "SET;START;", 11) == 0 || - strncmp(command, "SET;WAYPOINT;", 13) == 0) { - snprintf(response, sizeof(response), "OK;%s\r\n", command + 4); - } else { - snprintf(response, sizeof(response), "KO;%s\r\n", command); +/** + * @brief Manage the CDC class requests + * @param cmd: Command code + * @param pbuf: Buffer containing command data (request parameters) + * @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 + */ +static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length) +{ + /* USER CODE BEGIN 5 */ + switch(cmd) + { + case CDC_SEND_ENCAPSULATED_COMMAND: + + break; + + case CDC_GET_ENCAPSULATED_RESPONSE: + + break; + + case CDC_SET_COMM_FEATURE: + + break; + + case CDC_GET_COMM_FEATURE: + + break; + + case CDC_CLEAR_COMM_FEATURE: + + break; + + /*******************************************************************************/ + /* Line Coding Structure */ + /*-----------------------------------------------------------------------------*/ + /* Offset | Field | Size | Value | Description */ + /* 0 | dwDTERate | 4 | Number |Data terminal rate, in bits per second*/ + /* 4 | bCharFormat | 1 | Number | Stop bits */ + /* 0 - 1 Stop bit */ + /* 1 - 1.5 Stop bits */ + /* 2 - 2 Stop bits */ + /* 5 | bParityType | 1 | Number | Parity */ + /* 0 - None */ + /* 1 - Odd */ + /* 2 - Even */ + /* 3 - Mark */ + /* 4 - Space */ + /* 6 | bDataBits | 1 | Number Data bits (5, 6, 7, 8 or 16). */ + /*******************************************************************************/ + case CDC_SET_LINE_CODING: + + break; + + case CDC_GET_LINE_CODING: + + break; + + case CDC_SET_CONTROL_LINE_STATE: + + break; + + case CDC_SEND_BREAK: + + break; + + default: + break; } - CDC_Transmit_FS((uint8_t*)response, strlen(response)); + return (USBD_OK); + /* USER CODE END 5 */ } + +/** + * @brief Data received over USB OUT endpoint are sent over CDC interface + * through this function. + * + * @note + * This function will issue a NAK packet on any OUT packet received on + * USB endpoint until exiting this function. If you exit this function + * before transfer is complete on CDC interface (ie. using DMA controller) + * it will result in receiving more data while previous ones are still + * not sent. + * + * @param Buf: Buffer of data to be received + * @param Len: Number of data received (in bytes) + * @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) +{ + /* USER CODE BEGIN 6 */ + USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]); + USBD_CDC_ReceivePacket(&hUsbDeviceFS); + return (USBD_OK); + /* USER CODE END 6 */ +} + +/** + * @brief CDC_Transmit_FS + * Data to send over USB IN endpoint are sent over CDC interface + * through this function. + * @note + * + * + * @param Buf: Buffer of data to be sent + * @param Len: Number of data to be sent (in bytes) + * @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 result = USBD_OK; + /* USER CODE BEGIN 7 */ + USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData; + if (hcdc->TxState != 0){ + return USBD_BUSY; + } + USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len); + result = USBD_CDC_TransmitPacket(&hUsbDeviceFS); + /* USER CODE END 7 */ + return result; +} + +/** + * @brief CDC_TransmitCplt_FS + * Data transmitted callback + * + * @note + * This function is IN transfer complete callback used to inform user that + * the submitted Data is successfully sent over USB. + * + * @param Buf: Buffer of data to be received + * @param Len: Number of data received (in bytes) + * @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) +{ + uint8_t result = USBD_OK; + /* USER CODE BEGIN 13 */ + UNUSED(Buf); + UNUSED(Len); + UNUSED(epnum); + /* USER CODE END 13 */ + return result; +} + +/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */ + +/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */ + +/** + * @} + */ + +/** + * @} + */ diff --git a/USB_Device/App/usbd_cdc_if.h b/USB_Device/App/usbd_cdc_if.h index 2afa84d..9b0c37c 100644 --- a/USB_Device/App/usbd_cdc_if.h +++ b/USB_Device/App/usbd_cdc_if.h @@ -1,5 +1,24 @@ -/* usbd_cdc_if.h */ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : usbd_cdc_if.h + * @version : v3.0_Cube + * @brief : Header for usbd_cdc_if.c file. + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __USBD_CDC_IF_H__ #define __USBD_CDC_IF_H__ @@ -7,18 +26,106 @@ extern "C" { #endif +/* Includes ------------------------------------------------------------------*/ #include "usbd_cdc.h" +/* USER CODE BEGIN INCLUDE */ + +/* USER CODE END INCLUDE */ + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @brief For Usb device. + * @{ + */ + +/** @defgroup USBD_CDC_IF USBD_CDC_IF + * @brief Usb VCP device module + * @{ + */ + +/** @defgroup USBD_CDC_IF_Exported_Defines USBD_CDC_IF_Exported_Defines + * @brief Defines. + * @{ + */ +/* Define size for the receive and transmit buffer over CDC */ #define APP_RX_DATA_SIZE 2048 #define APP_TX_DATA_SIZE 2048 +/* USER CODE BEGIN EXPORTED_DEFINES */ +/* USER CODE END EXPORTED_DEFINES */ + +/** + * @} + */ + +/** @defgroup USBD_CDC_IF_Exported_Types USBD_CDC_IF_Exported_Types + * @brief Types. + * @{ + */ + +/* USER CODE BEGIN EXPORTED_TYPES */ + +/* USER CODE END EXPORTED_TYPES */ + +/** + * @} + */ + +/** @defgroup USBD_CDC_IF_Exported_Macros USBD_CDC_IF_Exported_Macros + * @brief Aliases. + * @{ + */ + +/* USER CODE BEGIN EXPORTED_MACRO */ + +/* USER CODE END EXPORTED_MACRO */ + +/** + * @} + */ + +/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables + * @brief Public variables. + * @{ + */ + +/** CDC Interface callback. */ extern USBD_CDC_ItfTypeDef USBD_Interface_fops_FS; +/* USER CODE BEGIN EXPORTED_VARIABLES */ + +/* USER CODE END EXPORTED_VARIABLES */ + +/** + * @} + */ + +/** @defgroup USBD_CDC_IF_Exported_FunctionsPrototype USBD_CDC_IF_Exported_FunctionsPrototype + * @brief Public functions declaration. + * @{ + */ + uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len); -void USB_CDC_ProcessCommand(const char* command); + +/* USER CODE BEGIN EXPORTED_FUNCTIONS */ + +/* USER CODE END EXPORTED_FUNCTIONS */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ #ifdef __cplusplus } #endif #endif /* __USBD_CDC_IF_H__ */ + diff --git a/pcb_odo.ioc b/pcb_odo.ioc index 85e528c..c9d7512 100644 --- a/pcb_odo.ioc +++ b/pcb_odo.ioc @@ -13,25 +13,29 @@ Mcu.IP2=SYS Mcu.IP3=TIM1 Mcu.IP4=TIM2 Mcu.IP5=TIM3 -Mcu.IP6=USB -Mcu.IP7=USB_DEVICE -Mcu.IPNb=8 +Mcu.IP6=TIM8 +Mcu.IP7=USB +Mcu.IP8=USB_DEVICE +Mcu.IPNb=9 Mcu.Name=STM32G491K(C-E)Ux Mcu.Package=UFQFPN32 Mcu.Pin0=PF0-OSC_IN Mcu.Pin1=PA0 -Mcu.Pin10=VP_SYS_VS_DBSignals -Mcu.Pin11=VP_TIM1_VS_ClockSourceINT -Mcu.Pin12=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS +Mcu.Pin10=PB4 +Mcu.Pin11=VP_SYS_VS_Systick +Mcu.Pin12=VP_SYS_VS_DBSignals +Mcu.Pin13=VP_TIM1_VS_ClockSourceINT +Mcu.Pin14=VP_TIM8_VS_ClockSourceINT +Mcu.Pin15=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS Mcu.Pin2=PA1 Mcu.Pin3=PA4 Mcu.Pin4=PA8 Mcu.Pin5=PA9 Mcu.Pin6=PA11 Mcu.Pin7=PA12 -Mcu.Pin8=PB4 -Mcu.Pin9=VP_SYS_VS_Systick -Mcu.PinsNb=13 +Mcu.Pin8=PA14 +Mcu.Pin9=PA15 +Mcu.PinsNb=16 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32G491KEUx @@ -64,6 +68,8 @@ PA11.Mode=Device PA11.Signal=USB_DM PA12.Mode=Device PA12.Signal=USB_DP +PA14.Signal=S_TIM8_CH2 +PA15.Signal=S_TIM8_CH1 PA4.GPIOParameters=GPIO_Speed,GPIO_PuPd PA4.GPIO_PuPd=GPIO_PULLUP PA4.GPIO_Speed=GPIO_SPEED_FREQ_HIGH @@ -163,6 +169,10 @@ SH.S_TIM3_CH1.0=TIM3_CH1,Encoder_Interface SH.S_TIM3_CH1.ConfNb=1 SH.S_TIM3_CH2.0=TIM3_CH2,Encoder_Interface SH.S_TIM3_CH2.ConfNb=1 +SH.S_TIM8_CH1.0=TIM8_CH1,PWM Generation1 CH1 +SH.S_TIM8_CH1.ConfNb=1 +SH.S_TIM8_CH2.0=TIM8_CH2,PWM Generation2 CH2 +SH.S_TIM8_CH2.ConfNb=1 TIM1.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE TIM1.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 TIM1.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 @@ -173,6 +183,11 @@ TIM2.IPParameters=PeriodNoDither,EncoderMode TIM2.PeriodNoDither=65535 TIM3.EncoderMode=TIM_ENCODERMODE_TI12 TIM3.IPParameters=EncoderMode +TIM8.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE +TIM8.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 +TIM8.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 +TIM8.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,PeriodNoDither,AutoReloadPreload +TIM8.PeriodNoDither=630 USB_DEVICE.CLASS_NAME_FS=CDC USB_DEVICE.IPParameters=VirtualMode,VirtualModeFS,CLASS_NAME_FS USB_DEVICE.VirtualMode=Cdc @@ -183,6 +198,8 @@ 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_TIM8_VS_ClockSourceINT.Mode=Internal +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