diff --git a/bms/App/api/eeprom/CMakeLists.txt b/bms/App/api/eeprom/CMakeLists.txt index 711cbaee..42884b23 100644 --- a/bms/App/api/eeprom/CMakeLists.txt +++ b/bms/App/api/eeprom/CMakeLists.txt @@ -3,5 +3,5 @@ add_library(eeprom STATIC) file(GLOB SRC_FILES "*.c") target_sources(eeprom PRIVATE ${SRC_FILES}) - -target_include_directories(eeprom PUBLIC .) +target_link_libraries(eeprom PUBLIC stm32_hal) +target_include_directories(eeprom PUBLIC .) \ No newline at end of file diff --git a/bms/App/api/eeprom/eeprom.c b/bms/App/api/eeprom/eeprom.c index e69de29b..a815a792 100644 --- a/bms/App/api/eeprom/eeprom.c +++ b/bms/App/api/eeprom/eeprom.c @@ -0,0 +1,135 @@ +#include "eeprom.h" + +#define EEPROM_ADDRESS 0x50 + +void setWriteProtect(int enable) { + if (enable) { + HAL_GPIO_WritePin(WriteProtect_EEPROM_GPIO_Port, WriteProtect_EEPROM_Pin, GPIO_PIN_SET); + } else { + HAL_GPIO_WritePin(WriteProtect_EEPROM_GPIO_Port, WriteProtect_EEPROM_Pin, GPIO_PIN_RESET); + } +} + +int eeprom_init() +{ + setWriteProtect(1); + return 0; +} + +int eeprom_ready() +{ + HAL_StatusTypeDef status = HAL_I2C_IsDeviceReady(&hi2c1, (EEPROM_ADDRESS << 1), 3, 1); + + if (status == HAL_OK) + { + return 1; + } + else if (status == HAL_BUSY || status == HAL_TIMEOUT) + { + return 0; + } + + return -1; +} + +int eeprom_wait_until_ready(uint32_t timeout_ms) +{ + uint32_t tickstart = HAL_GetTick(); + while ((HAL_GetTick() - tickstart) < timeout_ms) + { + int ready = eeprom_ready(); + if (ready == 1) return 0; + else if (ready == -1) return -1; + HAL_Delay(5); + } + return -1; +} + +int eeprom_write(uint16_t address, uint8_t *data, size_t size) +{ + if (size > 128) + return -1; + + setWriteProtect(0); + + HAL_StatusTypeDef status = HAL_I2C_Mem_Write( + &hi2c1, + (EEPROM_ADDRESS << 1), + address, + I2C_MEMADD_SIZE_16BIT, + data, + size, + 10); + + setWriteProtect(1); + + if (status != HAL_OK) + return -1; + + return 0; +} + +int eeprom_write_dma(uint16_t address, uint8_t *data, size_t size) { + if (hi2c1.State != HAL_I2C_STATE_READY) return -1; + + setWriteProtect(0); + + HAL_StatusTypeDef status = HAL_I2C_Mem_Write_DMA( + &hi2c1, + (EEPROM_ADDRESS << 1), + address, + I2C_MEMADD_SIZE_16BIT, + data, + size + ); + + if (status != HAL_OK) { + setWriteProtect(1); + return -1; + } + + return 0; +} + +void eeprom_TxCpltCallback() { + setWriteProtect(1); +} + +int eeprom_read(uint16_t address, uint8_t *buffer, size_t size) +{ + if (buffer == NULL || size == 0) + return -1; + + HAL_StatusTypeDef status = HAL_I2C_Mem_Read( + &hi2c1, + (EEPROM_ADDRESS << 1), + address, + I2C_MEMADD_SIZE_16BIT, + buffer, + size, + 10); + + if (status != HAL_OK) + return -1; + + return 0; +} + +int eeprom_read_dma(uint16_t address, uint8_t *buffer, size_t size) { + if (hi2c1.State != HAL_I2C_STATE_READY) return -1; + + HAL_StatusTypeDef status = HAL_I2C_Mem_Read_DMA( + &hi2c1, + (EEPROM_ADDRESS << 1), + address, + I2C_MEMADD_SIZE_16BIT, + buffer, + size + ); + + if (status != HAL_OK) { + return -1; + } + + return 0; +} \ No newline at end of file diff --git a/bms/App/api/eeprom/eeprom.h b/bms/App/api/eeprom/eeprom.h index e69de29b..2765be8b 100644 --- a/bms/App/api/eeprom/eeprom.h +++ b/bms/App/api/eeprom/eeprom.h @@ -0,0 +1,18 @@ +#pragma once +#include "stm32g4xx_hal.h" +#include "main.h" + +extern I2C_HandleTypeDef hi2c1; + +int eeprom_init(); + +int eeprom_ready(); +int eeprom_wait_until_ready(uint32_t timeout_ms); + +int eeprom_write(uint16_t address, uint8_t* data, size_t size); +int eeprom_read(uint16_t address, uint8_t* buffer, size_t size); + +int eeprom_write_dma(uint16_t address, uint8_t* data, size_t size); +int eeprom_read_dma(uint16_t address, uint8_t* buffer, size_t size); + +void eeprom_TxCpltCallback(); \ No newline at end of file diff --git a/bms/CMakeLists.txt b/bms/CMakeLists.txt index 7ecd8b46..507c9d2e 100644 --- a/bms/CMakeLists.txt +++ b/bms/CMakeLists.txt @@ -100,6 +100,7 @@ target_link_libraries(${PROJECT_NAME} adbms segment charger + eeprom program daemons threads diff --git a/bms/Core/Inc/main.h b/bms/Core/Inc/main.h index 40c75c0c..310e6dc8 100644 --- a/bms/Core/Inc/main.h +++ b/bms/Core/Inc/main.h @@ -76,6 +76,8 @@ void Error_Handler(void); #define T_SWDIO_GPIO_Port GPIOA #define T_SWCLK_Pin GPIO_PIN_14 #define T_SWCLK_GPIO_Port GPIOA +#define WriteProtect_EEPROM_Pin GPIO_PIN_11 +#define WriteProtect_EEPROM_GPIO_Port GPIOC /* USER CODE BEGIN Private defines */ diff --git a/bms/Core/Inc/stm32g4xx_it.h b/bms/Core/Inc/stm32g4xx_it.h index a895e59f..b1591c48 100644 --- a/bms/Core/Inc/stm32g4xx_it.h +++ b/bms/Core/Inc/stm32g4xx_it.h @@ -54,6 +54,8 @@ void UsageFault_Handler(void); void DebugMon_Handler(void); void DMA1_Channel1_IRQHandler(void); void DMA1_Channel2_IRQHandler(void); +void DMA1_Channel3_IRQHandler(void); +void DMA1_Channel4_IRQHandler(void); void FDCAN1_IT0_IRQHandler(void); void EXTI15_10_IRQHandler(void); void TIM5_IRQHandler(void); diff --git a/bms/Core/Src/main.c b/bms/Core/Src/main.c index 5f07e936..359a510e 100644 --- a/bms/Core/Src/main.c +++ b/bms/Core/Src/main.c @@ -29,6 +29,7 @@ #include "gui_can_job.h" #include "safety_monitor.h" #include "state.h" +#include "eeprom.h" #include /* USER CODE END Includes */ @@ -55,6 +56,8 @@ FDCAN_HandleTypeDef hfdcan1; FDCAN_HandleTypeDef hfdcan2; I2C_HandleTypeDef hi2c1; +DMA_HandleTypeDef hdma_i2c1_rx; +DMA_HandleTypeDef hdma_i2c1_tx; UART_HandleTypeDef hlpuart1; @@ -67,9 +70,10 @@ TIM_HandleTypeDef htim3; /* Definitions for defaultTask */ osThreadId_t defaultTaskHandle; const osThreadAttr_t defaultTask_attributes = { - .name = "defaultTask", - .priority = (osPriority_t)osPriorityNormal, - .stack_size = 128 * 4}; + .name = "defaultTask", + .priority = (osPriority_t) osPriorityNormal, + .stack_size = 128 * 4 +}; /* USER CODE BEGIN PV */ osThreadId_t spi_thread_pid; osMutexId_t spi_mutex_id; @@ -103,10 +107,11 @@ void defaultTaskFn(void *argument); /* USER CODE END 0 */ /** - * @brief The application entry point. - * @retval int - */ -int main(void) { + * @brief The application entry point. + * @retval int + */ +int main(void) +{ /* USER CODE BEGIN 1 */ @@ -114,8 +119,7 @@ int main(void) { /* MCU Configuration--------------------------------------------------------*/ - /* Reset of all peripherals, Initializes the Flash interface and the Systick. - */ + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ @@ -209,20 +213,21 @@ int main(void) { } /** - * @brief System Clock Configuration - * @retval None - */ -void SystemClock_Config(void) { + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Configure the main internal regulator output voltage - */ + */ HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1_BOOST); /** Initializes the RCC Oscillators according to the specified parameters - * in the RCC_OscInitTypeDef structure. - */ + * in the RCC_OscInitTypeDef structure. + */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; @@ -233,30 +238,33 @@ void SystemClock_Config(void) { RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV8; RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks - */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | - RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) { + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) + { Error_Handler(); } } /** - * @brief ADC1 Initialization Function - * @param None - * @retval None - */ -static void MX_ADC1_Init(void) { + * @brief ADC1 Initialization Function + * @param None + * @retval None + */ +static void MX_ADC1_Init(void) +{ /* USER CODE BEGIN ADC1_Init 0 */ @@ -270,7 +278,7 @@ static void MX_ADC1_Init(void) { /* USER CODE END ADC1_Init 1 */ /** Common config - */ + */ hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc1.Init.Resolution = ADC_RESOLUTION_12B; @@ -287,39 +295,44 @@ static void MX_ADC1_Init(void) { hadc1.Init.DMAContinuousRequests = DISABLE; hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; hadc1.Init.OversamplingMode = DISABLE; - if (HAL_ADC_Init(&hadc1) != HAL_OK) { + if (HAL_ADC_Init(&hadc1) != HAL_OK) + { Error_Handler(); } /** Configure the ADC multi-mode - */ + */ multimode.Mode = ADC_MODE_INDEPENDENT; - if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK) { + if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK) + { Error_Handler(); } /** Configure Regular Channel - */ + */ sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5; sConfig.SingleDiff = ADC_SINGLE_ENDED; sConfig.OffsetNumber = ADC_OFFSET_NONE; sConfig.Offset = 0; - if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { + if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) + { Error_Handler(); } /* USER CODE BEGIN ADC1_Init 2 */ /* USER CODE END ADC1_Init 2 */ + } /** - * @brief FDCAN1 Initialization Function - * @param None - * @retval None - */ -static void MX_FDCAN1_Init(void) { + * @brief FDCAN1 Initialization Function + * @param None + * @retval None + */ +static void MX_FDCAN1_Init(void) +{ /* USER CODE BEGIN FDCAN1_Init 0 */ @@ -346,20 +359,23 @@ static void MX_FDCAN1_Init(void) { hfdcan1.Init.StdFiltersNbr = 0; hfdcan1.Init.ExtFiltersNbr = 2; hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; - if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) { + if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) + { Error_Handler(); } /* USER CODE BEGIN FDCAN1_Init 2 */ /* USER CODE END FDCAN1_Init 2 */ + } /** - * @brief FDCAN2 Initialization Function - * @param None - * @retval None - */ -static void MX_FDCAN2_Init(void) { + * @brief FDCAN2 Initialization Function + * @param None + * @retval None + */ +static void MX_FDCAN2_Init(void) +{ /* USER CODE BEGIN FDCAN2_Init 0 */ @@ -386,20 +402,23 @@ static void MX_FDCAN2_Init(void) { hfdcan2.Init.StdFiltersNbr = 0; hfdcan2.Init.ExtFiltersNbr = 2; hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; - if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK) { + if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK) + { Error_Handler(); } /* USER CODE BEGIN FDCAN2_Init 2 */ /* USER CODE END FDCAN2_Init 2 */ + } /** - * @brief I2C1 Initialization Function - * @param None - * @retval None - */ -static void MX_I2C1_Init(void) { + * @brief I2C1 Initialization Function + * @param None + * @retval None + */ +static void MX_I2C1_Init(void) +{ /* USER CODE BEGIN I2C1_Init 0 */ @@ -417,32 +436,37 @@ static void MX_I2C1_Init(void) { hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; - if (HAL_I2C_Init(&hi2c1) != HAL_OK) { + if (HAL_I2C_Init(&hi2c1) != HAL_OK) + { Error_Handler(); } /** Configure Analogue filter - */ - if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) { + */ + if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) + { Error_Handler(); } /** Configure Digital filter - */ - if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) { + */ + if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) + { Error_Handler(); } /* USER CODE BEGIN I2C1_Init 2 */ /* USER CODE END I2C1_Init 2 */ + } /** - * @brief LPUART1 Initialization Function - * @param None - * @retval None - */ -static void MX_LPUART1_UART_Init(void) { + * @brief LPUART1 Initialization Function + * @param None + * @retval None + */ +static void MX_LPUART1_UART_Init(void) +{ /* USER CODE BEGIN LPUART1_Init 0 */ @@ -461,31 +485,35 @@ static void MX_LPUART1_UART_Init(void) { hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; hlpuart1.Init.ClockPrescaler = UART_PRESCALER_DIV1; hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; - if (HAL_UART_Init(&hlpuart1) != HAL_OK) { + if (HAL_UART_Init(&hlpuart1) != HAL_OK) + { Error_Handler(); } - if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != - HAL_OK) { + if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) + { Error_Handler(); } - if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != - HAL_OK) { + if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) + { Error_Handler(); } - if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK) { + if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK) + { Error_Handler(); } /* USER CODE BEGIN LPUART1_Init 2 */ /* USER CODE END LPUART1_Init 2 */ + } /** - * @brief SPI1 Initialization Function - * @param None - * @retval None - */ -static void MX_SPI1_Init(void) { + * @brief SPI1 Initialization Function + * @param None + * @retval None + */ +static void MX_SPI1_Init(void) +{ /* USER CODE BEGIN SPI1_Init 0 */ @@ -509,20 +537,23 @@ static void MX_SPI1_Init(void) { hspi1.Init.CRCPolynomial = 7; hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; - if (HAL_SPI_Init(&hspi1) != HAL_OK) { + if (HAL_SPI_Init(&hspi1) != HAL_OK) + { Error_Handler(); } /* USER CODE BEGIN SPI1_Init 2 */ /* USER CODE END SPI1_Init 2 */ + } /** - * @brief TIM3 Initialization Function - * @param None - * @retval None - */ -static void MX_TIM3_Init(void) { + * @brief TIM3 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM3_Init(void) +{ /* USER CODE BEGIN TIM3_Init 0 */ @@ -540,27 +571,32 @@ static void MX_TIM3_Init(void) { htim3.Init.Period = 65535; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; - if (HAL_TIM_Base_Init(&htim3) != HAL_OK) { + if (HAL_TIM_Base_Init(&htim3) != HAL_OK) + { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; - if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) { + if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) + { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; - if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) { + if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) + { Error_Handler(); } /* USER CODE BEGIN TIM3_Init 2 */ /* USER CODE END TIM3_Init 2 */ + } /** - * Enable DMA controller clock - */ -static void MX_DMA_Init(void) { + * Enable DMA controller clock + */ +static void MX_DMA_Init(void) +{ /* DMA controller clock enable */ __HAL_RCC_DMAMUX1_CLK_ENABLE(); @@ -573,14 +609,22 @@ static void MX_DMA_Init(void) { /* DMA1_Channel2_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 6, 0); HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn); + /* DMA1_Channel3_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn); + /* DMA1_Channel4_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn); + } /** - * @brief GPIO Initialization Function - * @param None - * @retval None - */ -static void MX_GPIO_Init(void) { + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ GPIO_InitTypeDef GPIO_InitStruct = {0}; /* USER CODE BEGIN MX_GPIO_Init_1 */ @@ -593,7 +637,7 @@ static void MX_GPIO_Init(void) { __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_SET); + HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7|WriteProtect_EEPROM_Pin, GPIO_PIN_SET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET); @@ -608,13 +652,13 @@ static void MX_GPIO_Init(void) { HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pins : PB10 PB3 PB4 */ - GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_3 | GPIO_PIN_4; + GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_3|GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - /*Configure GPIO pin : PC7 */ - GPIO_InitStruct.Pin = GPIO_PIN_7; + /*Configure GPIO pins : PC7 WriteProtect_EEPROM_Pin */ + GPIO_InitStruct.Pin = GPIO_PIN_7|WriteProtect_EEPROM_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; @@ -627,7 +671,7 @@ static void MX_GPIO_Init(void) { HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : PB5 PB6 */ - GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6; + GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; @@ -646,6 +690,11 @@ static void MX_GPIO_Init(void) { // void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { // HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5); // } +void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c) { + if (hi2c->Instance == I2C1) { + eeprom_TxCpltCallback(); + } +} /* USER CODE END 4 */ /* USER CODE BEGIN Header_defaultTaskFn */ @@ -665,18 +714,20 @@ void defaultTaskFn(void *argument) { } /** - * @brief Period elapsed callback in non blocking mode - * @note This function is called when TIM5 interrupt took place, inside - * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment - * a global variable "uwTick" used as application time base. - * @param htim : TIM handle - * @retval None - */ -void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { + * @brief Period elapsed callback in non blocking mode + * @note This function is called when TIM5 interrupt took place, inside + * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment + * a global variable "uwTick" used as application time base. + * @param htim : TIM handle + * @retval None + */ +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ /* USER CODE BEGIN Callback 0 */ /* USER CODE END Callback 0 */ - if (htim->Instance == TIM5) { + if (htim->Instance == TIM5) + { HAL_IncTick(); } /* USER CODE BEGIN Callback 1 */ @@ -685,10 +736,11 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { } /** - * @brief This function is executed in case of error occurrence. - * @retval None - */ -void Error_Handler(void) { + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); @@ -698,13 +750,14 @@ void Error_Handler(void) { } #ifdef USE_FULL_ASSERT /** - * @brief Reports the name of the source file and the source line number - * where the assert_param error has occurred. - * @param file: pointer to the source file name - * @param line: assert_param error line source number - * @retval None - */ -void assert_failed(uint8_t *file, uint32_t line) { + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, diff --git a/bms/Core/Src/stm32g4xx_hal_msp.c b/bms/Core/Src/stm32g4xx_hal_msp.c index b391a969..52b7cc29 100644 --- a/bms/Core/Src/stm32g4xx_hal_msp.c +++ b/bms/Core/Src/stm32g4xx_hal_msp.c @@ -22,6 +22,10 @@ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ +extern DMA_HandleTypeDef hdma_i2c1_rx; + +extern DMA_HandleTypeDef hdma_i2c1_tx; + extern DMA_HandleTypeDef hdma_spi1_rx; extern DMA_HandleTypeDef hdma_spi1_tx; @@ -335,12 +339,20 @@ void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) Error_Handler(); } + __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /**I2C1 GPIO Configuration - PB8-BOOT0 ------> I2C1_SCL + PA15 ------> I2C1_SCL PB9 ------> I2C1_SDA */ - GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; + GPIO_InitStruct.Pin = GPIO_PIN_15; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; @@ -349,6 +361,42 @@ void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) /* Peripheral clock enable */ __HAL_RCC_I2C1_CLK_ENABLE(); + + /* I2C1 DMA Init */ + /* I2C1_RX Init */ + hdma_i2c1_rx.Instance = DMA1_Channel3; + hdma_i2c1_rx.Init.Request = DMA_REQUEST_I2C1_RX; + hdma_i2c1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma_i2c1_rx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_i2c1_rx.Init.MemInc = DMA_MINC_ENABLE; + hdma_i2c1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_i2c1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_i2c1_rx.Init.Mode = DMA_NORMAL; + hdma_i2c1_rx.Init.Priority = DMA_PRIORITY_LOW; + if (HAL_DMA_Init(&hdma_i2c1_rx) != HAL_OK) + { + Error_Handler(); + } + + __HAL_LINKDMA(hi2c,hdmarx,hdma_i2c1_rx); + + /* I2C1_TX Init */ + hdma_i2c1_tx.Instance = DMA1_Channel4; + hdma_i2c1_tx.Init.Request = DMA_REQUEST_I2C1_TX; + hdma_i2c1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; + hdma_i2c1_tx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_i2c1_tx.Init.MemInc = DMA_MINC_ENABLE; + hdma_i2c1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_i2c1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_i2c1_tx.Init.Mode = DMA_NORMAL; + hdma_i2c1_tx.Init.Priority = DMA_PRIORITY_LOW; + if (HAL_DMA_Init(&hdma_i2c1_tx) != HAL_OK) + { + Error_Handler(); + } + + __HAL_LINKDMA(hi2c,hdmatx,hdma_i2c1_tx); + /* USER CODE BEGIN I2C1_MspInit 1 */ /* USER CODE END I2C1_MspInit 1 */ @@ -374,13 +422,16 @@ void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c) __HAL_RCC_I2C1_CLK_DISABLE(); /**I2C1 GPIO Configuration - PB8-BOOT0 ------> I2C1_SCL + PA15 ------> I2C1_SCL PB9 ------> I2C1_SDA */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_8); + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_15); HAL_GPIO_DeInit(GPIOB, GPIO_PIN_9); + /* I2C1 DMA DeInit */ + HAL_DMA_DeInit(hi2c->hdmarx); + HAL_DMA_DeInit(hi2c->hdmatx); /* USER CODE BEGIN I2C1_MspDeInit 1 */ /* USER CODE END I2C1_MspDeInit 1 */ diff --git a/bms/Core/Src/stm32g4xx_it.c b/bms/Core/Src/stm32g4xx_it.c index ea285156..1a10f91f 100644 --- a/bms/Core/Src/stm32g4xx_it.c +++ b/bms/Core/Src/stm32g4xx_it.c @@ -57,6 +57,8 @@ /* External variables --------------------------------------------------------*/ extern FDCAN_HandleTypeDef hfdcan1; extern FDCAN_HandleTypeDef hfdcan2; +extern DMA_HandleTypeDef hdma_i2c1_rx; +extern DMA_HandleTypeDef hdma_i2c1_tx; extern DMA_HandleTypeDef hdma_spi1_rx; extern DMA_HandleTypeDef hdma_spi1_tx; extern TIM_HandleTypeDef htim5; @@ -191,6 +193,34 @@ void DMA1_Channel2_IRQHandler(void) /* USER CODE END DMA1_Channel2_IRQn 1 */ } +/** + * @brief This function handles DMA1 channel3 global interrupt. + */ +void DMA1_Channel3_IRQHandler(void) +{ + /* USER CODE BEGIN DMA1_Channel3_IRQn 0 */ + + /* USER CODE END DMA1_Channel3_IRQn 0 */ + HAL_DMA_IRQHandler(&hdma_i2c1_rx); + /* USER CODE BEGIN DMA1_Channel3_IRQn 1 */ + + /* USER CODE END DMA1_Channel3_IRQn 1 */ +} + +/** + * @brief This function handles DMA1 channel4 global interrupt. + */ +void DMA1_Channel4_IRQHandler(void) +{ + /* USER CODE BEGIN DMA1_Channel4_IRQn 0 */ + + /* USER CODE END DMA1_Channel4_IRQn 0 */ + HAL_DMA_IRQHandler(&hdma_i2c1_tx); + /* USER CODE BEGIN DMA1_Channel4_IRQn 1 */ + + /* USER CODE END DMA1_Channel4_IRQn 1 */ +} + /** * @brief This function handles FDCAN1 interrupt 0. */ diff --git a/bms/bms.ioc b/bms/bms.ioc index 6cf3f977..b2664d30 100644 --- a/bms/bms.ioc +++ b/bms/bms.ioc @@ -1,357 +1,401 @@ -#MicroXplorer Configuration settings - do not modify -ADC1.Channel-2\#ChannelRegularConversion=ADC_CHANNEL_1 -ADC1.CommonPathInternal=null|null|null|null -ADC1.IPParameters=Rank-2\#ChannelRegularConversion,master,Channel-2\#ChannelRegularConversion,SamplingTime-2\#ChannelRegularConversion,OffsetNumber-2\#ChannelRegularConversion,NbrOfConversionFlag,CommonPathInternal -ADC1.NbrOfConversionFlag=1 -ADC1.OffsetNumber-2\#ChannelRegularConversion=ADC_OFFSET_NONE -ADC1.Rank-2\#ChannelRegularConversion=1 -ADC1.SamplingTime-2\#ChannelRegularConversion=ADC_SAMPLETIME_2CYCLES_5 -ADC1.master=1 -BSP_IP_NAME=NUCLEO-G474RE -CAD.formats= -CAD.pinconfig= -CAD.provider= -Dma.Request0=SPI1_RX -Dma.Request1=SPI1_TX -Dma.RequestsNb=2 -Dma.SPI1_RX.0.Direction=DMA_PERIPH_TO_MEMORY -Dma.SPI1_RX.0.EventEnable=DISABLE -Dma.SPI1_RX.0.Instance=DMA1_Channel1 -Dma.SPI1_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE -Dma.SPI1_RX.0.MemInc=DMA_MINC_ENABLE -Dma.SPI1_RX.0.Mode=DMA_NORMAL -Dma.SPI1_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE -Dma.SPI1_RX.0.PeriphInc=DMA_PINC_DISABLE -Dma.SPI1_RX.0.Polarity=HAL_DMAMUX_REQ_GEN_RISING -Dma.SPI1_RX.0.Priority=DMA_PRIORITY_MEDIUM -Dma.SPI1_RX.0.RequestNumber=1 -Dma.SPI1_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,SignalID,Polarity,RequestNumber,SyncSignalID,SyncPolarity,SyncEnable,EventEnable,SyncRequestNumber -Dma.SPI1_RX.0.SignalID=NONE -Dma.SPI1_RX.0.SyncEnable=DISABLE -Dma.SPI1_RX.0.SyncPolarity=HAL_DMAMUX_SYNC_NO_EVENT -Dma.SPI1_RX.0.SyncRequestNumber=1 -Dma.SPI1_RX.0.SyncSignalID=NONE -Dma.SPI1_TX.1.Direction=DMA_MEMORY_TO_PERIPH -Dma.SPI1_TX.1.EventEnable=DISABLE -Dma.SPI1_TX.1.Instance=DMA1_Channel2 -Dma.SPI1_TX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE -Dma.SPI1_TX.1.MemInc=DMA_MINC_ENABLE -Dma.SPI1_TX.1.Mode=DMA_NORMAL -Dma.SPI1_TX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE -Dma.SPI1_TX.1.PeriphInc=DMA_PINC_DISABLE -Dma.SPI1_TX.1.Polarity=HAL_DMAMUX_REQ_GEN_RISING -Dma.SPI1_TX.1.Priority=DMA_PRIORITY_LOW -Dma.SPI1_TX.1.RequestNumber=1 -Dma.SPI1_TX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,SignalID,Polarity,RequestNumber,SyncSignalID,SyncPolarity,SyncEnable,EventEnable,SyncRequestNumber -Dma.SPI1_TX.1.SignalID=NONE -Dma.SPI1_TX.1.SyncEnable=DISABLE -Dma.SPI1_TX.1.SyncPolarity=HAL_DMAMUX_SYNC_NO_EVENT -Dma.SPI1_TX.1.SyncRequestNumber=1 -Dma.SPI1_TX.1.SyncSignalID=NONE -FDCAN1.CalculateBaudRateNominal=500000 -FDCAN1.CalculateTimeBitNominal=2000 -FDCAN1.CalculateTimeQuantumNominal=200.0 -FDCAN1.ClockDivider=FDCAN_CLOCK_DIV4 -FDCAN1.DataPrescaler=8 -FDCAN1.DataSyncJumpWidth=4 -FDCAN1.DataTimeSeg1=4 -FDCAN1.DataTimeSeg2=5 -FDCAN1.ExtFiltersNbr=2 -FDCAN1.IPParameters=CalculateTimeQuantumNominal,CalculateTimeBitNominal,CalculateBaudRateNominal,NominalPrescaler,NominalSyncJumpWidth,DataTimeSeg1,DataTimeSeg2,ExtFiltersNbr,NominalTimeSeg1,NominalTimeSeg2,DataPrescaler,DataSyncJumpWidth,ClockDivider -FDCAN1.NominalPrescaler=8 -FDCAN1.NominalSyncJumpWidth=4 -FDCAN1.NominalTimeSeg1=4 -FDCAN1.NominalTimeSeg2=5 -FDCAN2.CalculateBaudRateNominal=1000000 -FDCAN2.CalculateTimeBitNominal=1000 -FDCAN2.CalculateTimeQuantumNominal=25.0 -FDCAN2.DataSyncJumpWidth=9 -FDCAN2.DataTimeSeg1=10 -FDCAN2.DataTimeSeg2=9 -FDCAN2.ExtFiltersNbr=2 -FDCAN2.FrameFormat=FDCAN_FRAME_FD_BRS -FDCAN2.IPParameters=CalculateTimeQuantumNominal,CalculateTimeBitNominal,CalculateBaudRateNominal,FrameFormat,NominalPrescaler,NominalSyncJumpWidth,NominalTimeSeg1,NominalTimeSeg2,DataSyncJumpWidth,DataTimeSeg1,DataTimeSeg2,ExtFiltersNbr -FDCAN2.NominalPrescaler=4 -FDCAN2.NominalSyncJumpWidth=6 -FDCAN2.NominalTimeSeg1=33 -FDCAN2.NominalTimeSeg2=6 -FREERTOS.FootprintOK=true -FREERTOS.HEAP_NUMBER=4 -FREERTOS.IPParameters=Tasks01,HEAP_NUMBER,configUSE_MALLOC_FAILED_HOOK,configCHECK_FOR_STACK_OVERFLOW,configGENERATE_RUN_TIME_STATS,configUSE_STATS_FORMATTING_FUNCTIONS,configENABLE_FPU,FootprintOK -FREERTOS.Tasks01=defaultTask,24,128,defaultTaskFn,Default,NULL,Dynamic,NULL,NULL -FREERTOS.configCHECK_FOR_STACK_OVERFLOW=2 -FREERTOS.configENABLE_FPU=1 -FREERTOS.configGENERATE_RUN_TIME_STATS=0 -FREERTOS.configUSE_MALLOC_FAILED_HOOK=1 -FREERTOS.configUSE_STATS_FORMATTING_FUNCTIONS=1 -File.Version=6 -GPIO.groupedBy=Group By Peripherals -I2C1.CustomTiming=Disabled -I2C1.DualAddressMode=I2C_DUALADDRESS_DISABLE -I2C1.I2C_Speed_Mode=I2C_Standard -I2C1.IPParameters=Timing,CustomTiming,I2C_Speed_Mode,DualAddressMode -I2C1.Timing=0x30D29DE4 -KeepUserPlacement=false -LPUART1.BaudRate=115200 -LPUART1.IPParameters=BaudRate -Mcu.CPN=STM32G474RET6 -Mcu.Family=STM32G4 -Mcu.IP0=ADC1 -Mcu.IP1=DMA -Mcu.IP10=SYS -Mcu.IP11=TIM3 -Mcu.IP12=NUCLEO-G474RE -Mcu.IP2=FDCAN1 -Mcu.IP3=FDCAN2 -Mcu.IP4=FREERTOS -Mcu.IP5=I2C1 -Mcu.IP6=LPUART1 -Mcu.IP7=NVIC -Mcu.IP8=RCC -Mcu.IP9=SPI1 -Mcu.IPNb=13 -Mcu.Name=STM32G474R(B-C-E)Tx -Mcu.Package=LQFP64 -Mcu.Pin0=PC13 -Mcu.Pin1=PC14-OSC32_IN -Mcu.Pin10=PA7 -Mcu.Pin11=PB10 -Mcu.Pin12=PB12 -Mcu.Pin13=PB13 -Mcu.Pin14=PC7 -Mcu.Pin15=PA10 -Mcu.Pin16=PA11 -Mcu.Pin17=PA12 -Mcu.Pin18=PA13 -Mcu.Pin19=PA14 -Mcu.Pin2=PC15-OSC32_OUT -Mcu.Pin20=PB3 -Mcu.Pin21=PB4 -Mcu.Pin22=PB5 -Mcu.Pin23=PB6 -Mcu.Pin24=PB8-BOOT0 -Mcu.Pin25=PB9 -Mcu.Pin26=VP_FREERTOS_VS_CMSIS_V2 -Mcu.Pin27=VP_SYS_VS_tim5 -Mcu.Pin28=VP_SYS_VS_DBSignals -Mcu.Pin29=VP_TIM3_VS_ClockSourceINT -Mcu.Pin3=PF0-OSC_IN -Mcu.Pin4=PF1-OSC_OUT -Mcu.Pin5=PA0 -Mcu.Pin6=PA2 -Mcu.Pin7=PA3 -Mcu.Pin8=PA5 -Mcu.Pin9=PA6 -Mcu.PinsNb=30 -Mcu.ThirdPartyNb=0 -Mcu.UserConstants= -Mcu.UserName=STM32G474RETx -MxCube.Version=6.17.0 -MxDb.Version=DB.6.0.170 -NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false -NVIC.DMA1_Channel1_IRQn=true\:6\:0\:true\:false\:true\:true\:false\:true\:true -NVIC.DMA1_Channel2_IRQn=true\:6\:0\:true\:false\:true\:true\:false\:true\:true -NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false -NVIC.EXTI15_10_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true -NVIC.FDCAN1_IT0_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true -NVIC.FDCAN2_IT0_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true -NVIC.ForceEnableDMAVector=true -NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false -NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false -NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false -NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:false\:false -NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 -NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false\:false -NVIC.SavedPendsvIrqHandlerGenerated=true -NVIC.SavedSvcallIrqHandlerGenerated=true -NVIC.SavedSystickIrqHandlerGenerated=true -NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:true\:false -NVIC.TIM5_IRQn=true\:15\:0\:false\:false\:true\:false\:false\:true\:true -NVIC.TimeBase=TIM5_IRQn -NVIC.TimeBaseIP=TIM5 -NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false -PA0.Mode=IN1-Single-Ended -PA0.Signal=ADC1_IN1 -PA10.Locked=true -PA10.Signal=GPIO_Input -PA11.Mode=FDCAN_Activate -PA11.Signal=FDCAN1_RX -PA12.Mode=FDCAN_Activate -PA12.Signal=FDCAN1_TX -PA13.GPIOParameters=GPIO_Label -PA13.GPIO_Label=T_SWDIO -PA13.Locked=true -PA13.Signal=SYS_JTMS-SWDIO -PA14.GPIOParameters=GPIO_Label -PA14.GPIO_Label=T_SWCLK -PA14.Locked=true -PA14.Signal=SYS_JTCK-SWCLK -PA2.GPIOParameters=GPIO_Label -PA2.GPIO_Label=LPUART1_TX [STLINKV3E_VCP_RX] -PA2.Locked=true -PA2.Mode=Asynchronous -PA2.Signal=LPUART1_TX -PA3.GPIOParameters=GPIO_Label -PA3.GPIO_Label=LPUART1_RX [STLINKV3E_VCP_TX] -PA3.Locked=true -PA3.Mode=Asynchronous -PA3.Signal=LPUART1_RX -PA5.Mode=Full_Duplex_Master -PA5.Signal=SPI1_SCK -PA6.Mode=Full_Duplex_Master -PA6.Signal=SPI1_MISO -PA7.Mode=Full_Duplex_Master -PA7.Signal=SPI1_MOSI -PB10.Locked=true -PB10.Signal=GPIO_Input -PB12.Mode=FDCAN_Activate -PB12.Signal=FDCAN2_RX -PB13.Mode=FDCAN_Activate -PB13.Signal=FDCAN2_TX -PB3.Locked=true -PB3.Signal=GPIO_Input -PB4.Locked=true -PB4.Signal=GPIO_Input -PB5.GPIOParameters=PinState -PB5.Locked=true -PB5.PinState=GPIO_PIN_SET -PB5.Signal=GPIO_Output -PB6.Locked=true -PB6.Signal=GPIO_Output -PB8-BOOT0.Locked=true -PB8-BOOT0.Mode=I2C -PB8-BOOT0.Signal=I2C1_SCL -PB9.Locked=true -PB9.Mode=I2C -PB9.Signal=I2C1_SDA -PC13.GPIOParameters=GPIO_Label -PC13.GPIO_Label=B1 [blue push button] -PC13.Locked=true -PC13.Signal=GPXTI13 -PC14-OSC32_IN.GPIOParameters=GPIO_Label -PC14-OSC32_IN.GPIO_Label=RCC_OSC32_IN -PC14-OSC32_IN.Locked=true -PC14-OSC32_IN.Signal=RCC_OSC32_IN -PC15-OSC32_OUT.GPIOParameters=GPIO_Label -PC15-OSC32_OUT.GPIO_Label=RCC_OSC32_OUT -PC15-OSC32_OUT.Locked=true -PC15-OSC32_OUT.Signal=RCC_OSC32_OUT -PC7.GPIOParameters=GPIO_Speed,PinState -PC7.GPIO_Speed=GPIO_SPEED_FREQ_LOW -PC7.Locked=true -PC7.PinState=GPIO_PIN_SET -PC7.Signal=GPIO_Output -PF0-OSC_IN.GPIOParameters=GPIO_Label -PF0-OSC_IN.GPIO_Label=RCC_OSC_IN -PF0-OSC_IN.Locked=true -PF0-OSC_IN.Signal=RCC_OSC_IN -PF1-OSC_OUT.GPIOParameters=GPIO_Label -PF1-OSC_OUT.GPIO_Label=RCC_OSC_OUT -PF1-OSC_OUT.Locked=true -PF1-OSC_OUT.Signal=RCC_OSC_OUT -PinOutPanel.RotationAngle=0 -ProjectManager.AskForMigrate=true -ProjectManager.BackupPrevious=false -ProjectManager.CompilerLinker=GCC -ProjectManager.CompilerOptimize=6 -ProjectManager.ComputerToolchain=false -ProjectManager.CoupleFile=false -ProjectManager.CustomerFirmwarePackage= -ProjectManager.DefaultFWLocation=true -ProjectManager.DeletePrevious=true -ProjectManager.DeviceId=STM32G474RETx -ProjectManager.FirmwarePackage=STM32Cube FW_G4 V1.6.2 -ProjectManager.FreePins=false -ProjectManager.FreePinsContext= -ProjectManager.HalAssertFull=false -ProjectManager.HeapSize=0x200 -ProjectManager.KeepUserCode=true -ProjectManager.LastFirmware=true -ProjectManager.LibraryCopy=1 -ProjectManager.MainLocation=Core/Src -ProjectManager.NoMain=false -ProjectManager.PreviousToolchain=STM32CubeIDE -ProjectManager.ProjectBuild=false -ProjectManager.ProjectFileName=bms.ioc -ProjectManager.ProjectName=bms -ProjectManager.ProjectStructure= -ProjectManager.RegisterCallBack= -ProjectManager.StackSize=0x400 -ProjectManager.TargetToolchain=CMake -ProjectManager.ToolChainLocation= -ProjectManager.UAScriptAfterPath= -ProjectManager.UAScriptBeforePath= -ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_ADC1_Init-ADC1-false-HAL-true,5-MX_I2C1_Init-I2C1-false-HAL-true,6-MX_LPUART1_UART_Init-LPUART1-false-HAL-true,7-MX_SPI1_Init-SPI1-false-HAL-true,8-MX_FDCAN1_Init-FDCAN1-false-HAL-true,9-MX_FDCAN2_Init-FDCAN2-false-HAL-true -RCC.ADC12Freq_Value=160000000 -RCC.ADC345Freq_Value=160000000 -RCC.AHBFreq_Value=160000000 -RCC.APB1Freq_Value=160000000 -RCC.APB1TimFreq_Value=160000000 -RCC.APB2Freq_Value=160000000 -RCC.APB2TimFreq_Value=160000000 -RCC.CRSFreq_Value=48000000 -RCC.CortexFreq_Value=160000000 -RCC.EXTERNAL_CLOCK_VALUE=12288000 -RCC.FCLKCortexFreq_Value=160000000 -RCC.FDCANFreq_Value=160000000 -RCC.FamilyName=M -RCC.HCLKFreq_Value=160000000 -RCC.HRTIM1Freq_Value=160000000 -RCC.HSE_VALUE=24000000 -RCC.HSI48_VALUE=48000000 -RCC.HSI_VALUE=16000000 -RCC.I2C1Freq_Value=160000000 -RCC.I2C2Freq_Value=160000000 -RCC.I2C3Freq_Value=160000000 -RCC.I2C4Freq_Value=160000000 -RCC.I2SFreq_Value=160000000 -RCC.IPParameters=ADC12Freq_Value,ADC345Freq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CRSFreq_Value,CortexFreq_Value,EXTERNAL_CLOCK_VALUE,FCLKCortexFreq_Value,FDCANFreq_Value,FamilyName,HCLKFreq_Value,HRTIM1Freq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2C4Freq_Value,I2SFreq_Value,LPTIM1Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSE_VALUE,LSI_VALUE,MCO1PinFreq_Value,PLLN,PLLPoutputFreq_Value,PLLQ,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PWRFreq_Value,QSPIFreq_Value,RNGFreq_Value,RTCClockSelection,RTCFreq_Value,SAI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value -RCC.LPTIM1Freq_Value=160000000 -RCC.LPUART1Freq_Value=160000000 -RCC.LSCOPinFreq_Value=32000 -RCC.LSE_VALUE=32768 -RCC.LSI_VALUE=32000 -RCC.MCO1PinFreq_Value=16000000 -RCC.PLLN=20 -RCC.PLLPoutputFreq_Value=160000000 -RCC.PLLQ=RCC_PLLQ_DIV8 -RCC.PLLQoutputFreq_Value=40000000 -RCC.PLLRCLKFreq_Value=160000000 -RCC.PWRFreq_Value=160000000 -RCC.QSPIFreq_Value=160000000 -RCC.RNGFreq_Value=40000000 -RCC.RTCClockSelection=RCC_RTCCLKSOURCE_LSE -RCC.RTCFreq_Value=32768 -RCC.SAI1Freq_Value=160000000 -RCC.SYSCLKFreq_VALUE=160000000 -RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK -RCC.UART4Freq_Value=160000000 -RCC.UART5Freq_Value=160000000 -RCC.USART1Freq_Value=160000000 -RCC.USART2Freq_Value=160000000 -RCC.USART3Freq_Value=160000000 -RCC.USBFreq_Value=40000000 -RCC.VCOInputFreq_Value=16000000 -RCC.VCOOutputFreq_Value=320000000 -SH.GPXTI13.0=GPIO_EXTI13 -SH.GPXTI13.ConfNb=1 -SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_128 -SPI1.CalculateBaudRate=1.25 MBits/s -SPI1.DataSize=SPI_DATASIZE_8BIT -SPI1.Direction=SPI_DIRECTION_2LINES -SPI1.IPParameters=VirtualType,Mode,Direction,BaudRatePrescaler,CalculateBaudRate,DataSize,NSSPMode -SPI1.Mode=SPI_MODE_MASTER -SPI1.NSSPMode=SPI_NSS_PULSE_ENABLE -SPI1.VirtualType=VM_MASTER -VP_FREERTOS_VS_CMSIS_V2.Mode=CMSIS_V2 -VP_FREERTOS_VS_CMSIS_V2.Signal=FREERTOS_VS_CMSIS_V2 -VP_SYS_VS_DBSignals.Mode=DisableDeadBatterySignals -VP_SYS_VS_DBSignals.Signal=SYS_VS_DBSignals -VP_SYS_VS_tim5.Mode=TIM5 -VP_SYS_VS_tim5.Signal=SYS_VS_tim5 -VP_TIM3_VS_ClockSourceINT.Mode=Internal -VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT -board=NUCLEO-G474RE -boardIOC=true -rtos.0.ip=FREERTOS +#MicroXplorer Configuration settings - do not modify +ADC1.Channel-2\#ChannelRegularConversion=ADC_CHANNEL_1 +ADC1.CommonPathInternal=null|null|null|null +ADC1.IPParameters=Rank-2\#ChannelRegularConversion,master,Channel-2\#ChannelRegularConversion,SamplingTime-2\#ChannelRegularConversion,OffsetNumber-2\#ChannelRegularConversion,NbrOfConversionFlag,CommonPathInternal +ADC1.NbrOfConversionFlag=1 +ADC1.OffsetNumber-2\#ChannelRegularConversion=ADC_OFFSET_NONE +ADC1.Rank-2\#ChannelRegularConversion=1 +ADC1.SamplingTime-2\#ChannelRegularConversion=ADC_SAMPLETIME_2CYCLES_5 +ADC1.master=1 +BSP_IP_NAME=NUCLEO-G474RE +CAD.formats= +CAD.pinconfig= +CAD.provider= +Dma.I2C1_RX.2.Direction=DMA_PERIPH_TO_MEMORY +Dma.I2C1_RX.2.EventEnable=DISABLE +Dma.I2C1_RX.2.Instance=DMA1_Channel3 +Dma.I2C1_RX.2.MemDataAlignment=DMA_MDATAALIGN_BYTE +Dma.I2C1_RX.2.MemInc=DMA_MINC_ENABLE +Dma.I2C1_RX.2.Mode=DMA_NORMAL +Dma.I2C1_RX.2.PeriphDataAlignment=DMA_PDATAALIGN_BYTE +Dma.I2C1_RX.2.PeriphInc=DMA_PINC_DISABLE +Dma.I2C1_RX.2.Polarity=HAL_DMAMUX_REQ_GEN_RISING +Dma.I2C1_RX.2.Priority=DMA_PRIORITY_LOW +Dma.I2C1_RX.2.RequestNumber=1 +Dma.I2C1_RX.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,SignalID,Polarity,RequestNumber,SyncSignalID,SyncPolarity,SyncEnable,EventEnable,SyncRequestNumber +Dma.I2C1_RX.2.SignalID=NONE +Dma.I2C1_RX.2.SyncEnable=DISABLE +Dma.I2C1_RX.2.SyncPolarity=HAL_DMAMUX_SYNC_NO_EVENT +Dma.I2C1_RX.2.SyncRequestNumber=1 +Dma.I2C1_RX.2.SyncSignalID=NONE +Dma.I2C1_TX.3.Direction=DMA_MEMORY_TO_PERIPH +Dma.I2C1_TX.3.EventEnable=DISABLE +Dma.I2C1_TX.3.Instance=DMA1_Channel4 +Dma.I2C1_TX.3.MemDataAlignment=DMA_MDATAALIGN_BYTE +Dma.I2C1_TX.3.MemInc=DMA_MINC_ENABLE +Dma.I2C1_TX.3.Mode=DMA_NORMAL +Dma.I2C1_TX.3.PeriphDataAlignment=DMA_PDATAALIGN_BYTE +Dma.I2C1_TX.3.PeriphInc=DMA_PINC_DISABLE +Dma.I2C1_TX.3.Polarity=HAL_DMAMUX_REQ_GEN_RISING +Dma.I2C1_TX.3.Priority=DMA_PRIORITY_LOW +Dma.I2C1_TX.3.RequestNumber=1 +Dma.I2C1_TX.3.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,SignalID,Polarity,RequestNumber,SyncSignalID,SyncPolarity,SyncEnable,EventEnable,SyncRequestNumber +Dma.I2C1_TX.3.SignalID=NONE +Dma.I2C1_TX.3.SyncEnable=DISABLE +Dma.I2C1_TX.3.SyncPolarity=HAL_DMAMUX_SYNC_NO_EVENT +Dma.I2C1_TX.3.SyncRequestNumber=1 +Dma.I2C1_TX.3.SyncSignalID=NONE +Dma.Request0=SPI1_RX +Dma.Request1=SPI1_TX +Dma.Request2=I2C1_RX +Dma.Request3=I2C1_TX +Dma.RequestsNb=4 +Dma.SPI1_RX.0.Direction=DMA_PERIPH_TO_MEMORY +Dma.SPI1_RX.0.EventEnable=DISABLE +Dma.SPI1_RX.0.Instance=DMA1_Channel1 +Dma.SPI1_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE +Dma.SPI1_RX.0.MemInc=DMA_MINC_ENABLE +Dma.SPI1_RX.0.Mode=DMA_NORMAL +Dma.SPI1_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE +Dma.SPI1_RX.0.PeriphInc=DMA_PINC_DISABLE +Dma.SPI1_RX.0.Polarity=HAL_DMAMUX_REQ_GEN_RISING +Dma.SPI1_RX.0.Priority=DMA_PRIORITY_MEDIUM +Dma.SPI1_RX.0.RequestNumber=1 +Dma.SPI1_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,SignalID,Polarity,RequestNumber,SyncSignalID,SyncPolarity,SyncEnable,EventEnable,SyncRequestNumber +Dma.SPI1_RX.0.SignalID=NONE +Dma.SPI1_RX.0.SyncEnable=DISABLE +Dma.SPI1_RX.0.SyncPolarity=HAL_DMAMUX_SYNC_NO_EVENT +Dma.SPI1_RX.0.SyncRequestNumber=1 +Dma.SPI1_RX.0.SyncSignalID=NONE +Dma.SPI1_TX.1.Direction=DMA_MEMORY_TO_PERIPH +Dma.SPI1_TX.1.EventEnable=DISABLE +Dma.SPI1_TX.1.Instance=DMA1_Channel2 +Dma.SPI1_TX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE +Dma.SPI1_TX.1.MemInc=DMA_MINC_ENABLE +Dma.SPI1_TX.1.Mode=DMA_NORMAL +Dma.SPI1_TX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE +Dma.SPI1_TX.1.PeriphInc=DMA_PINC_DISABLE +Dma.SPI1_TX.1.Polarity=HAL_DMAMUX_REQ_GEN_RISING +Dma.SPI1_TX.1.Priority=DMA_PRIORITY_LOW +Dma.SPI1_TX.1.RequestNumber=1 +Dma.SPI1_TX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,SignalID,Polarity,RequestNumber,SyncSignalID,SyncPolarity,SyncEnable,EventEnable,SyncRequestNumber +Dma.SPI1_TX.1.SignalID=NONE +Dma.SPI1_TX.1.SyncEnable=DISABLE +Dma.SPI1_TX.1.SyncPolarity=HAL_DMAMUX_SYNC_NO_EVENT +Dma.SPI1_TX.1.SyncRequestNumber=1 +Dma.SPI1_TX.1.SyncSignalID=NONE +FDCAN1.CalculateBaudRateNominal=500000 +FDCAN1.CalculateTimeBitNominal=2000 +FDCAN1.CalculateTimeQuantumNominal=200.0 +FDCAN1.ClockDivider=FDCAN_CLOCK_DIV4 +FDCAN1.DataPrescaler=8 +FDCAN1.DataSyncJumpWidth=4 +FDCAN1.DataTimeSeg1=4 +FDCAN1.DataTimeSeg2=5 +FDCAN1.ExtFiltersNbr=2 +FDCAN1.IPParameters=CalculateTimeQuantumNominal,CalculateTimeBitNominal,CalculateBaudRateNominal,NominalPrescaler,NominalSyncJumpWidth,DataTimeSeg1,DataTimeSeg2,ExtFiltersNbr,NominalTimeSeg1,NominalTimeSeg2,DataPrescaler,DataSyncJumpWidth,ClockDivider +FDCAN1.NominalPrescaler=8 +FDCAN1.NominalSyncJumpWidth=4 +FDCAN1.NominalTimeSeg1=4 +FDCAN1.NominalTimeSeg2=5 +FDCAN2.CalculateBaudRateNominal=1000000 +FDCAN2.CalculateTimeBitNominal=1000 +FDCAN2.CalculateTimeQuantumNominal=25.0 +FDCAN2.DataSyncJumpWidth=9 +FDCAN2.DataTimeSeg1=10 +FDCAN2.DataTimeSeg2=9 +FDCAN2.ExtFiltersNbr=2 +FDCAN2.FrameFormat=FDCAN_FRAME_FD_BRS +FDCAN2.IPParameters=CalculateTimeQuantumNominal,CalculateTimeBitNominal,CalculateBaudRateNominal,FrameFormat,NominalPrescaler,NominalSyncJumpWidth,NominalTimeSeg1,NominalTimeSeg2,DataSyncJumpWidth,DataTimeSeg1,DataTimeSeg2,ExtFiltersNbr +FDCAN2.NominalPrescaler=4 +FDCAN2.NominalSyncJumpWidth=6 +FDCAN2.NominalTimeSeg1=33 +FDCAN2.NominalTimeSeg2=6 +FREERTOS.FootprintOK=true +FREERTOS.HEAP_NUMBER=4 +FREERTOS.IPParameters=Tasks01,HEAP_NUMBER,configUSE_MALLOC_FAILED_HOOK,configCHECK_FOR_STACK_OVERFLOW,configGENERATE_RUN_TIME_STATS,configUSE_STATS_FORMATTING_FUNCTIONS,configENABLE_FPU,FootprintOK +FREERTOS.Tasks01=defaultTask,24,128,defaultTaskFn,Default,NULL,Dynamic,NULL,NULL +FREERTOS.configCHECK_FOR_STACK_OVERFLOW=2 +FREERTOS.configENABLE_FPU=1 +FREERTOS.configGENERATE_RUN_TIME_STATS=0 +FREERTOS.configUSE_MALLOC_FAILED_HOOK=1 +FREERTOS.configUSE_STATS_FORMATTING_FUNCTIONS=1 +File.Version=6 +GPIO.groupedBy=Group By Peripherals +I2C1.CustomTiming=Disabled +I2C1.DualAddressMode=I2C_DUALADDRESS_DISABLE +I2C1.I2C_Speed_Mode=I2C_Standard +I2C1.IPParameters=Timing,CustomTiming,I2C_Speed_Mode,DualAddressMode +I2C1.Timing=0x30D29DE4 +KeepUserPlacement=false +LPUART1.BaudRate=115200 +LPUART1.IPParameters=BaudRate +Mcu.CPN=STM32G474RET6 +Mcu.Family=STM32G4 +Mcu.IP0=ADC1 +Mcu.IP1=DMA +Mcu.IP10=SYS +Mcu.IP11=TIM3 +Mcu.IP12=NUCLEO-G474RE +Mcu.IP2=FDCAN1 +Mcu.IP3=FDCAN2 +Mcu.IP4=FREERTOS +Mcu.IP5=I2C1 +Mcu.IP6=LPUART1 +Mcu.IP7=NVIC +Mcu.IP8=RCC +Mcu.IP9=SPI1 +Mcu.IPNb=13 +Mcu.Name=STM32G474R(B-C-E)Tx +Mcu.Package=LQFP64 +Mcu.Pin0=PC13 +Mcu.Pin1=PC14-OSC32_IN +Mcu.Pin10=PA7 +Mcu.Pin11=PB10 +Mcu.Pin12=PB12 +Mcu.Pin13=PB13 +Mcu.Pin14=PC7 +Mcu.Pin15=PA10 +Mcu.Pin16=PA11 +Mcu.Pin17=PA12 +Mcu.Pin18=PA13 +Mcu.Pin19=PA14 +Mcu.Pin2=PC15-OSC32_OUT +Mcu.Pin20=PA15 +Mcu.Pin21=PC11 +Mcu.Pin22=PB3 +Mcu.Pin23=PB4 +Mcu.Pin24=PB5 +Mcu.Pin25=PB6 +Mcu.Pin26=PB9 +Mcu.Pin27=VP_FREERTOS_VS_CMSIS_V2 +Mcu.Pin28=VP_SYS_VS_tim5 +Mcu.Pin29=VP_SYS_VS_DBSignals +Mcu.Pin3=PF0-OSC_IN +Mcu.Pin30=VP_TIM3_VS_ClockSourceINT +Mcu.Pin4=PF1-OSC_OUT +Mcu.Pin5=PA0 +Mcu.Pin6=PA2 +Mcu.Pin7=PA3 +Mcu.Pin8=PA5 +Mcu.Pin9=PA6 +Mcu.PinsNb=31 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32G474RETx +MxCube.Version=6.17.0 +MxDb.Version=DB.6.0.170 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false +NVIC.DMA1_Channel1_IRQn=true\:6\:0\:true\:false\:true\:true\:false\:true\:true +NVIC.DMA1_Channel2_IRQn=true\:6\:0\:true\:false\:true\:true\:false\:true\:true +NVIC.DMA1_Channel3_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true +NVIC.DMA1_Channel4_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false +NVIC.EXTI15_10_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true +NVIC.FDCAN1_IT0_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true +NVIC.FDCAN2_IT0_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false +NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:false\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false\:false +NVIC.SavedPendsvIrqHandlerGenerated=true +NVIC.SavedSvcallIrqHandlerGenerated=true +NVIC.SavedSystickIrqHandlerGenerated=true +NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:true\:false +NVIC.TIM5_IRQn=true\:15\:0\:false\:false\:true\:false\:false\:true\:true +NVIC.TimeBase=TIM5_IRQn +NVIC.TimeBaseIP=TIM5 +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false +PA0.Mode=IN1-Single-Ended +PA0.Signal=ADC1_IN1 +PA10.Locked=true +PA10.Signal=GPIO_Input +PA11.Mode=FDCAN_Activate +PA11.Signal=FDCAN1_RX +PA12.Mode=FDCAN_Activate +PA12.Signal=FDCAN1_TX +PA13.GPIOParameters=GPIO_Label +PA13.GPIO_Label=T_SWDIO +PA13.Locked=true +PA13.Signal=SYS_JTMS-SWDIO +PA14.GPIOParameters=GPIO_Label +PA14.GPIO_Label=T_SWCLK +PA14.Locked=true +PA14.Signal=SYS_JTCK-SWCLK +PA15.Locked=true +PA15.Mode=I2C +PA15.Signal=I2C1_SCL +PA2.GPIOParameters=GPIO_Label +PA2.GPIO_Label=LPUART1_TX [STLINKV3E_VCP_RX] +PA2.Locked=true +PA2.Mode=Asynchronous +PA2.Signal=LPUART1_TX +PA3.GPIOParameters=GPIO_Label +PA3.GPIO_Label=LPUART1_RX [STLINKV3E_VCP_TX] +PA3.Locked=true +PA3.Mode=Asynchronous +PA3.Signal=LPUART1_RX +PA5.Mode=Full_Duplex_Master +PA5.Signal=SPI1_SCK +PA6.Mode=Full_Duplex_Master +PA6.Signal=SPI1_MISO +PA7.Mode=Full_Duplex_Master +PA7.Signal=SPI1_MOSI +PB10.Locked=true +PB10.Signal=GPIO_Input +PB12.Mode=FDCAN_Activate +PB12.Signal=FDCAN2_RX +PB13.Mode=FDCAN_Activate +PB13.Signal=FDCAN2_TX +PB3.Locked=true +PB3.Signal=GPIO_Input +PB4.Locked=true +PB4.Signal=GPIO_Input +PB5.GPIOParameters=PinState +PB5.Locked=true +PB5.PinState=GPIO_PIN_SET +PB5.Signal=GPIO_Output +PB6.Locked=true +PB6.Signal=GPIO_Output +PB9.Locked=true +PB9.Mode=I2C +PB9.Signal=I2C1_SDA +PC11.GPIOParameters=PinState,GPIO_Label +PC11.GPIO_Label=WriteProtect_EEPROM +PC11.Locked=true +PC11.PinState=GPIO_PIN_SET +PC11.Signal=GPIO_Output +PC13.GPIOParameters=GPIO_Label +PC13.GPIO_Label=B1 [blue push button] +PC13.Locked=true +PC13.Signal=GPXTI13 +PC14-OSC32_IN.GPIOParameters=GPIO_Label +PC14-OSC32_IN.GPIO_Label=RCC_OSC32_IN +PC14-OSC32_IN.Locked=true +PC14-OSC32_IN.Signal=RCC_OSC32_IN +PC15-OSC32_OUT.GPIOParameters=GPIO_Label +PC15-OSC32_OUT.GPIO_Label=RCC_OSC32_OUT +PC15-OSC32_OUT.Locked=true +PC15-OSC32_OUT.Signal=RCC_OSC32_OUT +PC7.GPIOParameters=GPIO_Speed,PinState +PC7.GPIO_Speed=GPIO_SPEED_FREQ_LOW +PC7.Locked=true +PC7.PinState=GPIO_PIN_SET +PC7.Signal=GPIO_Output +PF0-OSC_IN.GPIOParameters=GPIO_Label +PF0-OSC_IN.GPIO_Label=RCC_OSC_IN +PF0-OSC_IN.Locked=true +PF0-OSC_IN.Signal=RCC_OSC_IN +PF1-OSC_OUT.GPIOParameters=GPIO_Label +PF1-OSC_OUT.GPIO_Label=RCC_OSC_OUT +PF1-OSC_OUT.Locked=true +PF1-OSC_OUT.Signal=RCC_OSC_OUT +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerLinker=GCC +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32G474RETx +ProjectManager.FirmwarePackage=STM32Cube FW_G4 V1.6.2 +ProjectManager.FreePins=false +ProjectManager.FreePinsContext= +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=1 +ProjectManager.MainLocation=Core/Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain=STM32CubeIDE +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=bms.ioc +ProjectManager.ProjectName=bms +ProjectManager.ProjectStructure= +ProjectManager.RegisterCallBack= +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=CMake +ProjectManager.ToolChainLocation= +ProjectManager.UAScriptAfterPath= +ProjectManager.UAScriptBeforePath= +ProjectManager.UnderRoot=false +ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_ADC1_Init-ADC1-false-HAL-true,5-MX_I2C1_Init-I2C1-false-HAL-true,6-MX_LPUART1_UART_Init-LPUART1-false-HAL-true,7-MX_SPI1_Init-SPI1-false-HAL-true,8-MX_FDCAN1_Init-FDCAN1-false-HAL-true,9-MX_FDCAN2_Init-FDCAN2-false-HAL-true +RCC.ADC12Freq_Value=160000000 +RCC.ADC345Freq_Value=160000000 +RCC.AHBFreq_Value=160000000 +RCC.APB1Freq_Value=160000000 +RCC.APB1TimFreq_Value=160000000 +RCC.APB2Freq_Value=160000000 +RCC.APB2TimFreq_Value=160000000 +RCC.CRSFreq_Value=48000000 +RCC.CortexFreq_Value=160000000 +RCC.EXTERNAL_CLOCK_VALUE=12288000 +RCC.FCLKCortexFreq_Value=160000000 +RCC.FDCANFreq_Value=160000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=160000000 +RCC.HRTIM1Freq_Value=160000000 +RCC.HSE_VALUE=24000000 +RCC.HSI48_VALUE=48000000 +RCC.HSI_VALUE=16000000 +RCC.I2C1Freq_Value=160000000 +RCC.I2C2Freq_Value=160000000 +RCC.I2C3Freq_Value=160000000 +RCC.I2C4Freq_Value=160000000 +RCC.I2SFreq_Value=160000000 +RCC.IPParameters=ADC12Freq_Value,ADC345Freq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CRSFreq_Value,CortexFreq_Value,EXTERNAL_CLOCK_VALUE,FCLKCortexFreq_Value,FDCANFreq_Value,FamilyName,HCLKFreq_Value,HRTIM1Freq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2C4Freq_Value,I2SFreq_Value,LPTIM1Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSE_VALUE,LSI_VALUE,MCO1PinFreq_Value,PLLN,PLLPoutputFreq_Value,PLLQ,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PWRFreq_Value,QSPIFreq_Value,RNGFreq_Value,RTCClockSelection,RTCFreq_Value,SAI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value +RCC.LPTIM1Freq_Value=160000000 +RCC.LPUART1Freq_Value=160000000 +RCC.LSCOPinFreq_Value=32000 +RCC.LSE_VALUE=32768 +RCC.LSI_VALUE=32000 +RCC.MCO1PinFreq_Value=16000000 +RCC.PLLN=20 +RCC.PLLPoutputFreq_Value=160000000 +RCC.PLLQ=RCC_PLLQ_DIV8 +RCC.PLLQoutputFreq_Value=40000000 +RCC.PLLRCLKFreq_Value=160000000 +RCC.PWRFreq_Value=160000000 +RCC.QSPIFreq_Value=160000000 +RCC.RNGFreq_Value=40000000 +RCC.RTCClockSelection=RCC_RTCCLKSOURCE_LSE +RCC.RTCFreq_Value=32768 +RCC.SAI1Freq_Value=160000000 +RCC.SYSCLKFreq_VALUE=160000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.UART4Freq_Value=160000000 +RCC.UART5Freq_Value=160000000 +RCC.USART1Freq_Value=160000000 +RCC.USART2Freq_Value=160000000 +RCC.USART3Freq_Value=160000000 +RCC.USBFreq_Value=40000000 +RCC.VCOInputFreq_Value=16000000 +RCC.VCOOutputFreq_Value=320000000 +SH.GPXTI13.0=GPIO_EXTI13 +SH.GPXTI13.ConfNb=1 +SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_128 +SPI1.CalculateBaudRate=1.25 MBits/s +SPI1.DataSize=SPI_DATASIZE_8BIT +SPI1.Direction=SPI_DIRECTION_2LINES +SPI1.IPParameters=VirtualType,Mode,Direction,BaudRatePrescaler,CalculateBaudRate,DataSize,NSSPMode +SPI1.Mode=SPI_MODE_MASTER +SPI1.NSSPMode=SPI_NSS_PULSE_ENABLE +SPI1.VirtualType=VM_MASTER +VP_FREERTOS_VS_CMSIS_V2.Mode=CMSIS_V2 +VP_FREERTOS_VS_CMSIS_V2.Signal=FREERTOS_VS_CMSIS_V2 +VP_SYS_VS_DBSignals.Mode=DisableDeadBatterySignals +VP_SYS_VS_DBSignals.Signal=SYS_VS_DBSignals +VP_SYS_VS_tim5.Mode=TIM5 +VP_SYS_VS_tim5.Signal=SYS_VS_tim5 +VP_TIM3_VS_ClockSourceINT.Mode=Internal +VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT +board=NUCLEO-G474RE +boardIOC=true +rtos.0.ip=FREERTOS