From 6a7f2c273700373bb40662f27e016ee5cad66751 Mon Sep 17 00:00:00 2001 From: kbracher Date: Tue, 27 May 2025 22:48:39 +0200 Subject: [PATCH] enable SPI RX autosusp might prevent overruns? --- .../Lib/ADBMS6830B_Driver/Inc/ADBMS_Intern.h | 4 +- AMS_Master_Code/Core/Src/main.c | 1607 +++++++++-------- AMS_Master_Code/Core/Src/stm32h7xx_hal_msp.c | 178 +- AMS_Master_Code/Makefile | 2 +- AMS_Master_Code/Master_FT25.ioc | 866 ++++----- AMS_Master_Code/STM32H7A3XX_FLASH.ld | 418 ++--- 6 files changed, 1561 insertions(+), 1514 deletions(-) diff --git a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Inc/ADBMS_Intern.h b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Inc/ADBMS_Intern.h index a8b452e..72376eb 100644 --- a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Inc/ADBMS_Intern.h +++ b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Inc/ADBMS_Intern.h @@ -17,11 +17,11 @@ typedef enum { #define CRITICAL_SECTION_ENTER(counter) do { __disable_irq(); } while(0) #define CRITICAL_SECTION_EXIT(counter) ({do { if (primask_##counter) __enable_irq(); } while(0);}) -#define CRITICAL_SECTION() \ +#define CRITICAL_SECTION() /* \ CRITICAL_SECTION_VAR(__COUNTER__); \ asm volatile ("dmb"); \ CRITICAL_SECTION_ENTER(__COUNTER__); \ - for(int _cs_flag_##__COUNTER__ = 1; _cs_flag_##__COUNTER__; _cs_flag_##__COUNTER__ = 0, CRITICAL_SECTION_EXIT(__COUNTER__)) + for(int _cs_flag_##__COUNTER__ = 1; _cs_flag_##__COUNTER__; _cs_flag_##__COUNTER__ = 0, CRITICAL_SECTION_EXIT(__COUNTER__)) */ [[maybe_unused, gnu::always_inline]] static inline void mcuAdbmsCSLow() { diff --git a/AMS_Master_Code/Core/Src/main.c b/AMS_Master_Code/Core/Src/main.c index 831c7a0..4086d00 100644 --- a/AMS_Master_Code/Core/Src/main.c +++ b/AMS_Master_Code/Core/Src/main.c @@ -1,802 +1,805 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : main.c - * @brief : Main program body - ****************************************************************************** - * @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 "main.h" - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ -#include "battery.h" -#include "isotp.h" -#include "isotp_log_backend.h" -#define SWO_LOG_PREFIX "[MAIN] " -#include "swo_log.h" - -//copied from master23 -#include "can.h" -#include "imd_monitoring.h" -#include "shunt_monitoring.h" -#include "soc_estimation.h" -#include "ts_state_machine.h" -#include "status_led.h" - -#include "stm32h7xx_hal.h" -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN PTD */ - -/* USER CODE END PTD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN PD */ - -/* USER CODE END PD */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN PM */ - -/* USER CODE END PM */ - -/* Private variables ---------------------------------------------------------*/ -ADC_HandleTypeDef hadc1; -ADC_HandleTypeDef hadc2; - -FDCAN_HandleTypeDef hfdcan1; - -SPI_HandleTypeDef hspi1; -SPI_HandleTypeDef hspi2; - -TIM_HandleTypeDef htim15; - -/* USER CODE BEGIN PV */ - -int sdc_closed = 0; -int sdc_closed_nodelay = 0; -int ts_error; -int hv_active; -int neg_air_closed; -int pos_air_closed; -int precharge_closed; -int pre_and_air_open; // used to be:int precharge_opened = 0; now we read if PC is open from the pin -> high if open - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -void SystemClock_Config(void); -void PeriphCommonClock_Config(void); -static void MX_GPIO_Init(void); -static void MX_FDCAN1_Init(void); -static void MX_TIM15_Init(void); -static void MX_SPI1_Init(void); -static void MX_SPI2_Init(void); -static void MX_ADC1_Init(void); -static void MX_ADC2_Init(void); -/* USER CODE BEGIN PFP */ -void init_logging(void); -/* USER CODE END PFP */ - -/* Private user code ---------------------------------------------------------*/ -/* USER CODE BEGIN 0 */ - -#define MAIN_LOOP_PERIOD 50 -#define ISO_TP_UPDATE_PERIOD 1 - -static void loop_delay() { - static uint32_t last_loop = 0; - uint32_t dt = HAL_GetTick() - last_loop; - while (dt < MAIN_LOOP_PERIOD) { - HAL_Delay(ISO_TP_UPDATE_PERIOD); - isotp_update(); // make sure isotp messages are processed reasonably quickly - dt = HAL_GetTick() - last_loop; - } - last_loop = HAL_GetTick(); -} - -static void update_sdc() { - static int last[2] = {0, 0}; - sdc_closed_nodelay = HAL_GPIO_ReadPin(SDC_VOLTAGE_GPIO_Port, SDC_VOLTAGE_Pin) == GPIO_PIN_SET; - if (last[0] == last[1] && last[0] == sdc_closed_nodelay) { - sdc_closed = sdc_closed_nodelay; - } - last[0] = last[1]; - last[1] = sdc_closed_nodelay; -} - -static void update_tsal_signals() { - ts_error = HAL_GPIO_ReadPin(TS_ERROR_GPIO_Port, TS_ERROR_Pin) == GPIO_PIN_SET; - hv_active = HAL_GPIO_ReadPin(HV_ACTIVE_GPIO_Port, HV_ACTIVE_Pin) == GPIO_PIN_SET; - neg_air_closed = HAL_GPIO_ReadPin(NEG_AIR_CLOSED_GPIO_Port, - NEG_AIR_CLOSED_Pin) == GPIO_PIN_SET; - pos_air_closed = HAL_GPIO_ReadPin(POS_AIR_CLOSED_GPIO_Port, - POS_AIR_CLOSED_Pin) == GPIO_PIN_SET; - pre_and_air_open = HAL_GPIO_ReadPin(PRE_and_AIR__open_GPIO_Port, - PRE_and_AIR__open_Pin) == GPIO_PIN_SET; -} - -/* Initialize logging system */ -void init_logging(void) { - /* Register and initialize SWO backend */ - swo_log_backend_init(); - - isotp_log_backend_init(); - - /* Initialize all registered backends */ - log_init_all_backends(); - - /* Log a test message */ - log_info("Logging system initialized"); -} - -/* USER CODE END 0 */ - -/** - * @brief The application entry point. - * @retval int - */ -int main(void) -{ - - /* USER CODE BEGIN 1 */ - - /* USER CODE END 1 */ - - /* MCU Configuration--------------------------------------------------------*/ - - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ - HAL_Init(); - - /* USER CODE BEGIN Init */ - - /* USER CODE END Init */ - - /* Configure the system clock */ - SystemClock_Config(); - - /* Configure the peripherals common clocks */ - PeriphCommonClock_Config(); - - /* USER CODE BEGIN SysInit */ - - /* USER CODE END SysInit */ - - /* Initialize all configured peripherals */ - MX_GPIO_Init(); - MX_FDCAN1_Init(); - MX_TIM15_Init(); - MX_SPI1_Init(); - MX_SPI2_Init(); - MX_ADC1_Init(); - MX_ADC2_Init(); - /* USER CODE BEGIN 2 */ - init_logging(); - debug_clear_console(); - debug_log(LOG_LEVEL_INFO, "AMS_Master on %s (%s), compiled at %s", COMMIT_BRANCH, COMMIT_HASH, COMPILE_DATE); - debug_log(LOG_LEVEL_INFO, "Starting BMS..."); - auto ret = battery_init(&hspi1); - while (ret != HAL_OK) { //TODO: properly handle reapeated initialization failure - debug_log(LOG_LEVEL_ERROR, "Failed to initialize BMS!"); - HAL_Delay(100); - debug_log(LOG_LEVEL_INFO, "Retrying BMS initialization..."); - ret = battery_init(&hspi1); - } - - // init for master functions - can_init(&hfdcan1); - isotp_init(); - - // for testing. in the final code can log streaming will be enabled by can message - isotp_log_enable_streaming(LOG_LEVEL_INFO); - - shunt_init(); - ts_sm_init(); - soc_init(); - imd_init(&htim15); - HAL_GPIO_WritePin(AMS_NERROR_GPIO_Port, AMS_NERROR_Pin, GPIO_PIN_SET); - - /* USER CODE END 2 */ - - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ - int count = 0; - int error_count = 0; - while (1) - { - isotp_log_process(); - isotp_update(); - //left over from slave communication test, could be nicer and in an additional function !! - if (error_count > 25) { - debug_log(LOG_LEVEL_ERROR, "Too many errors, restarting BMS..."); - HAL_Delay(1000); - ret = battery_init(&hspi1); - while (ret != HAL_OK) { - debug_log(LOG_LEVEL_ERROR, "Failed to initialize BMS!"); - HAL_Delay(1000); - debug_log(LOG_LEVEL_INFO, "Retrying BMS initialization..."); - ret = battery_init(&hspi1); - } - error_count = 0; - } - - update_sdc(); - update_tsal_signals(); - - if (battery_update() != HAL_OK) { - error_count++; - } - if (count % 4 == 0) { - print_battery_info(); - print_master_status(); - } - shunt_check(); - ts_sm_update(); - soc_update(); - imd_update(); - can_send_status(); - can_send_details(); - isotp_update(); - - loop_delay(); - /* USER CODE END WHILE */ - - /* USER CODE BEGIN 3 */ - count++; - count &= 0b1111; // wrap around at 16 - } - /* USER CODE END 3 */ -} - -/** - * @brief System Clock Configuration - * @retval None - */ -void SystemClock_Config(void) -{ - RCC_OscInitTypeDef RCC_OscInitStruct = {0}; - RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; - - /*AXI clock gating */ - RCC->CKGAENR = 0xFFFFFFFF; - - /** Supply configuration update enable - */ - HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY); - - /** Configure the main internal regulator output voltage - */ - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3); - - while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {} - - /** Initializes the RCC Oscillators according to the specified parameters - * in the RCC_OscInitTypeDef structure. - */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; - RCC_OscInitStruct.HSEState = RCC_HSE_ON; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLM = 1; - RCC_OscInitStruct.PLL.PLLN = 8; - RCC_OscInitStruct.PLL.PLLP = 2; - RCC_OscInitStruct.PLL.PLLQ = 2; - RCC_OscInitStruct.PLL.PLLR = 2; - RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3; - RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE; - RCC_OscInitStruct.PLL.PLLFRACN = 0; - 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_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1; - RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1; - RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1; - RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1; - - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) - { - Error_Handler(); - } -} - -/** - * @brief Peripherals Common Clock Configuration - * @retval None - */ -void PeriphCommonClock_Config(void) -{ - RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; - - /** Initializes the peripherals clock - */ - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADC; - PeriphClkInitStruct.PLL3.PLL3M = 1; - PeriphClkInitStruct.PLL3.PLL3N = 8; - PeriphClkInitStruct.PLL3.PLL3P = 2; - PeriphClkInitStruct.PLL3.PLL3Q = 2; - PeriphClkInitStruct.PLL3.PLL3R = 3; - PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_3; - PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE; - PeriphClkInitStruct.PLL3.PLL3FRACN = 0; - PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLL3; - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) - { - Error_Handler(); - } -} - -/** - * @brief ADC1 Initialization Function - * @param None - * @retval None - */ -static void MX_ADC1_Init(void) -{ - - /* USER CODE BEGIN ADC1_Init 0 */ - - /* USER CODE END ADC1_Init 0 */ - - ADC_MultiModeTypeDef multimode = {0}; - ADC_ChannelConfTypeDef sConfig = {0}; - - /* USER CODE BEGIN ADC1_Init 1 */ - - /* USER CODE END ADC1_Init 1 */ - - /** Common config - */ - hadc1.Instance = ADC1; - hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2; - hadc1.Init.Resolution = ADC_RESOLUTION_16B; - hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; - hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; - hadc1.Init.LowPowerAutoWait = DISABLE; - hadc1.Init.ContinuousConvMode = DISABLE; - hadc1.Init.NbrOfConversion = 1; - hadc1.Init.DiscontinuousConvMode = DISABLE; - hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; - hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; - hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR; - hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; - hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE; - hadc1.Init.OversamplingMode = DISABLE; - 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) - { - Error_Handler(); - } - - /** Configure Regular Channel - */ - sConfig.Channel = ADC_CHANNEL_10; - sConfig.Rank = ADC_REGULAR_RANK_1; - sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; - sConfig.SingleDiff = ADC_SINGLE_ENDED; - sConfig.OffsetNumber = ADC_OFFSET_NONE; - sConfig.Offset = 0; - sConfig.OffsetSignedSaturation = DISABLE; - if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN ADC1_Init 2 */ - - /* USER CODE END ADC1_Init 2 */ - -} - -/** - * @brief ADC2 Initialization Function - * @param None - * @retval None - */ -static void MX_ADC2_Init(void) -{ - - /* USER CODE BEGIN ADC2_Init 0 */ - - /* USER CODE END ADC2_Init 0 */ - - ADC_ChannelConfTypeDef sConfig = {0}; - - /* USER CODE BEGIN ADC2_Init 1 */ - - /* USER CODE END ADC2_Init 1 */ - - /** Common config - */ - hadc2.Instance = ADC2; - hadc2.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2; - hadc2.Init.Resolution = ADC_RESOLUTION_16B; - hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE; - hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV; - hadc2.Init.LowPowerAutoWait = DISABLE; - hadc2.Init.ContinuousConvMode = DISABLE; - hadc2.Init.NbrOfConversion = 1; - hadc2.Init.DiscontinuousConvMode = DISABLE; - hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START; - hadc2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; - hadc2.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR; - hadc2.Init.Overrun = ADC_OVR_DATA_PRESERVED; - hadc2.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE; - hadc2.Init.OversamplingMode = DISABLE; - if (HAL_ADC_Init(&hadc2) != HAL_OK) - { - Error_Handler(); - } - - /** Configure Regular Channel - */ - sConfig.Channel = ADC_CHANNEL_10; - sConfig.Rank = ADC_REGULAR_RANK_1; - sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; - sConfig.SingleDiff = ADC_DIFFERENTIAL_ENDED; - sConfig.OffsetNumber = ADC_OFFSET_NONE; - sConfig.Offset = 0; - sConfig.OffsetSignedSaturation = DISABLE; - if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN ADC2_Init 2 */ - - /* USER CODE END ADC2_Init 2 */ - -} - -/** - * @brief FDCAN1 Initialization Function - * @param None - * @retval None - */ -static void MX_FDCAN1_Init(void) -{ - - /* USER CODE BEGIN FDCAN1_Init 0 */ - - /* USER CODE END FDCAN1_Init 0 */ - - /* USER CODE BEGIN FDCAN1_Init 1 */ - - /* USER CODE END FDCAN1_Init 1 */ - hfdcan1.Instance = FDCAN1; - hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC; - hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; - hfdcan1.Init.AutoRetransmission = DISABLE; - hfdcan1.Init.TransmitPause = DISABLE; - hfdcan1.Init.ProtocolException = DISABLE; - hfdcan1.Init.NominalPrescaler = 2; - hfdcan1.Init.NominalSyncJumpWidth = 1; - hfdcan1.Init.NominalTimeSeg1 = 23; - hfdcan1.Init.NominalTimeSeg2 = 8; - hfdcan1.Init.DataPrescaler = 1; - hfdcan1.Init.DataSyncJumpWidth = 1; - hfdcan1.Init.DataTimeSeg1 = 1; - hfdcan1.Init.DataTimeSeg2 = 1; - hfdcan1.Init.MessageRAMOffset = 0; - hfdcan1.Init.StdFiltersNbr = 32; - hfdcan1.Init.ExtFiltersNbr = 0; - hfdcan1.Init.RxFifo0ElmtsNbr = 16; - hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8; - hfdcan1.Init.RxFifo1ElmtsNbr = 0; - hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8; - hfdcan1.Init.RxBuffersNbr = 0; - hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_8; - hfdcan1.Init.TxEventsNbr = 0; - hfdcan1.Init.TxBuffersNbr = 0; - hfdcan1.Init.TxFifoQueueElmtsNbr = 32; - hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; - hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_8; - if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN FDCAN1_Init 2 */ - - /* USER CODE END FDCAN1_Init 2 */ - -} - -/** - * @brief SPI1 Initialization Function - * @param None - * @retval None - */ -static void MX_SPI1_Init(void) -{ - - /* USER CODE BEGIN SPI1_Init 0 */ - - /* USER CODE END SPI1_Init 0 */ - - /* USER CODE BEGIN SPI1_Init 1 */ - - /* USER CODE END SPI1_Init 1 */ - /* SPI1 parameter configuration*/ - hspi1.Instance = SPI1; - hspi1.Init.Mode = SPI_MODE_MASTER; - hspi1.Init.Direction = SPI_DIRECTION_2LINES; - hspi1.Init.DataSize = SPI_DATASIZE_8BIT; - hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; - hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT; - hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; - hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi1.Init.TIMode = SPI_TIMODE_DISABLE; - hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi1.Init.CRCPolynomial = 0x0; - hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; - hspi1.Init.NSSPolarity = SPI_NSS_POLARITY_LOW; - hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA; - hspi1.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; - hspi1.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; - hspi1.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE; - hspi1.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE; - hspi1.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE; - hspi1.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE; - hspi1.Init.IOSwap = SPI_IO_SWAP_DISABLE; - if (HAL_SPI_Init(&hspi1) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN SPI1_Init 2 */ - - /* USER CODE END SPI1_Init 2 */ - -} - -/** - * @brief SPI2 Initialization Function - * @param None - * @retval None - */ -static void MX_SPI2_Init(void) -{ - - /* USER CODE BEGIN SPI2_Init 0 */ - - /* USER CODE END SPI2_Init 0 */ - - /* USER CODE BEGIN SPI2_Init 1 */ - - /* USER CODE END SPI2_Init 1 */ - /* SPI2 parameter configuration*/ - hspi2.Instance = SPI2; - hspi2.Init.Mode = SPI_MODE_MASTER; - hspi2.Init.Direction = SPI_DIRECTION_2LINES; - hspi2.Init.DataSize = SPI_DATASIZE_4BIT; - hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; - hspi2.Init.NSS = SPI_NSS_HARD_INPUT; - hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; - hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi2.Init.TIMode = SPI_TIMODE_DISABLE; - hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi2.Init.CRCPolynomial = 0x0; - hspi2.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; - hspi2.Init.NSSPolarity = SPI_NSS_POLARITY_LOW; - hspi2.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA; - hspi2.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; - hspi2.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; - hspi2.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE; - hspi2.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE; - hspi2.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE; - hspi2.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE; - hspi2.Init.IOSwap = SPI_IO_SWAP_DISABLE; - if (HAL_SPI_Init(&hspi2) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN SPI2_Init 2 */ - - /* USER CODE END SPI2_Init 2 */ - -} - -/** - * @brief TIM15 Initialization Function - * @param None - * @retval None - */ -static void MX_TIM15_Init(void) -{ - - /* USER CODE BEGIN TIM15_Init 0 */ - - /* USER CODE END TIM15_Init 0 */ - - TIM_SlaveConfigTypeDef sSlaveConfig = {0}; - TIM_IC_InitTypeDef sConfigIC = {0}; - TIM_MasterConfigTypeDef sMasterConfig = {0}; - - /* USER CODE BEGIN TIM15_Init 1 */ - - /* USER CODE END TIM15_Init 1 */ - htim15.Instance = TIM15; - htim15.Init.Prescaler = 16000-1; - htim15.Init.CounterMode = TIM_COUNTERMODE_UP; - htim15.Init.Period = 65535; - htim15.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - htim15.Init.RepetitionCounter = 0; - htim15.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; - if (HAL_TIM_IC_Init(&htim15) != HAL_OK) - { - Error_Handler(); - } - sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET; - sSlaveConfig.InputTrigger = TIM_TS_TI1FP1; - sSlaveConfig.TriggerPolarity = TIM_INPUTCHANNELPOLARITY_RISING; - sSlaveConfig.TriggerPrescaler = TIM_ICPSC_DIV1; - sSlaveConfig.TriggerFilter = 0; - if (HAL_TIM_SlaveConfigSynchro(&htim15, &sSlaveConfig) != HAL_OK) - { - Error_Handler(); - } - sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; - sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; - sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; - sConfigIC.ICFilter = 0; - if (HAL_TIM_IC_ConfigChannel(&htim15, &sConfigIC, TIM_CHANNEL_1) != HAL_OK) - { - Error_Handler(); - } - sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING; - sConfigIC.ICSelection = TIM_ICSELECTION_INDIRECTTI; - if (HAL_TIM_IC_ConfigChannel(&htim15, &sConfigIC, TIM_CHANNEL_2) != HAL_OK) - { - Error_Handler(); - } - sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; - sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; - if (HAL_TIMEx_MasterConfigSynchronization(&htim15, &sMasterConfig) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN TIM15_Init 2 */ - - /* USER CODE END TIM15_Init 2 */ - -} - -/** - * @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 */ -/* USER CODE END MX_GPIO_Init_1 */ - - /* GPIO Ports Clock Enable */ - __HAL_RCC_GPIOH_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOC, STATUS_LED_B_Pin|MSTR1_Pin|MSTR2_Pin|POS_AIR_CTRL_Pin - |NEG_AIR_CTRL_Pin, GPIO_PIN_RESET); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOB, IMD_POWER_Pin|STATUS_LED_R_Pin, GPIO_PIN_RESET); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOA, PRECHARGE_CTRL_Pin|AMS_NERROR_Pin|STATUS_LED_G_Pin, GPIO_PIN_RESET); - - /*Configure GPIO pins : STATUS_LED_B_Pin MSTR1_Pin MSTR2_Pin POS_AIR_CTRL_Pin - NEG_AIR_CTRL_Pin */ - GPIO_InitStruct.Pin = STATUS_LED_B_Pin|MSTR1_Pin|MSTR2_Pin|POS_AIR_CTRL_Pin - |NEG_AIR_CTRL_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - /*Configure GPIO pins : TS_ERROR_Pin HV_ACTIVE_Pin IMD_OK_Pin NEG_AIR_CLOSED_Pin - POS_AIR_CLOSED_Pin INTR1_Pin WAKE1_Pin */ - GPIO_InitStruct.Pin = TS_ERROR_Pin|HV_ACTIVE_Pin|IMD_OK_Pin|NEG_AIR_CLOSED_Pin - |POS_AIR_CLOSED_Pin|INTR1_Pin|WAKE1_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /*Configure GPIO pins : PRE_and_AIR__open_Pin SDC_VOLTAGE_Pin IMD_ERROR_LED_Pin AMS_ERROR_LED_Pin - INTR2_Pin WAKE2_Pin */ - GPIO_InitStruct.Pin = PRE_and_AIR__open_Pin|SDC_VOLTAGE_Pin|IMD_ERROR_LED_Pin|AMS_ERROR_LED_Pin - |INTR2_Pin|WAKE2_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /*Configure GPIO pins : IMD_POWER_Pin STATUS_LED_R_Pin */ - GPIO_InitStruct.Pin = IMD_POWER_Pin|STATUS_LED_R_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /*Configure GPIO pin : TSAL_GREEN_Pin */ - GPIO_InitStruct.Pin = TSAL_GREEN_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(TSAL_GREEN_GPIO_Port, &GPIO_InitStruct); - - /*Configure GPIO pins : PRECHARGE_CTRL_Pin AMS_NERROR_Pin STATUS_LED_G_Pin */ - GPIO_InitStruct.Pin = PRECHARGE_CTRL_Pin|AMS_NERROR_Pin|STATUS_LED_G_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - -/* USER CODE BEGIN MX_GPIO_Init_2 */ -/* USER CODE END MX_GPIO_Init_2 */ -} - -/* USER CODE BEGIN 4 */ - -/* USER CODE END 4 */ - -/** - * @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(); - while (1) - { - } - /* USER CODE END Error_Handler_Debug */ -} - -#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) -{ - /* 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, line) */ - /* USER CODE END 6 */ -} -#endif /* USE_FULL_ASSERT */ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @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 "main.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +#include "battery.h" +#include "isotp.h" +#include "isotp_log_backend.h" +#define SWO_LOG_PREFIX "[MAIN] " +#include "swo_log.h" + +//copied from master23 +#include "can.h" +#include "imd_monitoring.h" +#include "shunt_monitoring.h" +#include "soc_estimation.h" +#include "ts_state_machine.h" +#include "status_led.h" + +#include "stm32h7xx_hal.h" +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +ADC_HandleTypeDef hadc1; +ADC_HandleTypeDef hadc2; + +FDCAN_HandleTypeDef hfdcan1; + +SPI_HandleTypeDef hspi1; +SPI_HandleTypeDef hspi2; + +TIM_HandleTypeDef htim15; + +/* USER CODE BEGIN PV */ + +int sdc_closed = 0; +int sdc_closed_nodelay = 0; +int ts_error; +int hv_active; +int neg_air_closed; +int pos_air_closed; +int precharge_closed; +int pre_and_air_open; // used to be:int precharge_opened = 0; now we read if PC is open from the pin -> high if open + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +void PeriphCommonClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_FDCAN1_Init(void); +static void MX_TIM15_Init(void); +static void MX_SPI1_Init(void); +static void MX_SPI2_Init(void); +static void MX_ADC1_Init(void); +static void MX_ADC2_Init(void); +/* USER CODE BEGIN PFP */ +void init_logging(void); +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +#define MAIN_LOOP_PERIOD 50 +#define ISO_TP_UPDATE_PERIOD 1 + +static void loop_delay() { + static uint32_t last_loop = 0; + uint32_t dt = HAL_GetTick() - last_loop; + while (dt < MAIN_LOOP_PERIOD) { + HAL_Delay(ISO_TP_UPDATE_PERIOD); + isotp_update(); // make sure isotp messages are processed reasonably quickly + dt = HAL_GetTick() - last_loop; + } + last_loop = HAL_GetTick(); +} + +static void update_sdc() { + static int last[2] = {0, 0}; + sdc_closed_nodelay = HAL_GPIO_ReadPin(SDC_VOLTAGE_GPIO_Port, SDC_VOLTAGE_Pin) == GPIO_PIN_SET; + if (last[0] == last[1] && last[0] == sdc_closed_nodelay) { + sdc_closed = sdc_closed_nodelay; + } + last[0] = last[1]; + last[1] = sdc_closed_nodelay; +} + +static void update_tsal_signals() { + ts_error = HAL_GPIO_ReadPin(TS_ERROR_GPIO_Port, TS_ERROR_Pin) == GPIO_PIN_SET; + hv_active = HAL_GPIO_ReadPin(HV_ACTIVE_GPIO_Port, HV_ACTIVE_Pin) == GPIO_PIN_SET; + neg_air_closed = HAL_GPIO_ReadPin(NEG_AIR_CLOSED_GPIO_Port, + NEG_AIR_CLOSED_Pin) == GPIO_PIN_SET; + pos_air_closed = HAL_GPIO_ReadPin(POS_AIR_CLOSED_GPIO_Port, + POS_AIR_CLOSED_Pin) == GPIO_PIN_SET; + pre_and_air_open = HAL_GPIO_ReadPin(PRE_and_AIR__open_GPIO_Port, + PRE_and_AIR__open_Pin) == GPIO_PIN_SET; +} + +/* Initialize logging system */ +void init_logging(void) { + /* Register and initialize SWO backend */ + swo_log_backend_init(); + + isotp_log_backend_init(); + + /* Initialize all registered backends */ + log_init_all_backends(); + + /* Log a test message */ + log_info("Logging system initialized"); +} + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* Configure the peripherals common clocks */ + PeriphCommonClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_FDCAN1_Init(); + MX_TIM15_Init(); + MX_SPI1_Init(); + MX_SPI2_Init(); + MX_ADC1_Init(); + MX_ADC2_Init(); + /* USER CODE BEGIN 2 */ + init_logging(); + debug_clear_console(); + debug_log(LOG_LEVEL_INFO, "AMS_Master on %s (%s), compiled at %s", COMMIT_BRANCH, COMMIT_HASH, COMPILE_DATE); + debug_log(LOG_LEVEL_INFO, "Starting BMS..."); + auto ret = battery_init(&hspi1); + while (ret != HAL_OK) { //TODO: properly handle reapeated initialization failure + debug_log(LOG_LEVEL_ERROR, "Failed to initialize BMS!"); + HAL_Delay(100); + debug_log(LOG_LEVEL_INFO, "Retrying BMS initialization..."); + ret = battery_init(&hspi1); + } + + // init for master functions + can_init(&hfdcan1); + isotp_init(); + + // for testing. in the final code can log streaming will be enabled by can message + isotp_log_enable_streaming(LOG_LEVEL_INFO); + + shunt_init(); + ts_sm_init(); + soc_init(); + imd_init(&htim15); + HAL_GPIO_WritePin(AMS_NERROR_GPIO_Port, AMS_NERROR_Pin, GPIO_PIN_SET); + + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + int count = 0; + int error_count = 0; + while (1) + { + isotp_log_process(); + isotp_update(); + //left over from slave communication test, could be nicer and in an additional function !! + if (error_count > 25) { + debug_log(LOG_LEVEL_ERROR, "Too many errors, restarting BMS..."); + HAL_Delay(1000); + ret = battery_init(&hspi1); + while (ret != HAL_OK) { + debug_log(LOG_LEVEL_ERROR, "Failed to initialize BMS!"); + HAL_Delay(1000); + debug_log(LOG_LEVEL_INFO, "Retrying BMS initialization..."); + ret = battery_init(&hspi1); + } + error_count = 0; + } + + update_sdc(); + update_tsal_signals(); + + if (battery_update() != HAL_OK) { + error_count++; + } + if (count % 4 == 0) { + print_battery_info(); + print_master_status(); + } + shunt_check(); + ts_sm_update(); + soc_update(); + imd_update(); + can_send_status(); + can_send_details(); + isotp_update(); + + loop_delay(); + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + count++; + count &= 0b1111; // wrap around at 16 + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + /*AXI clock gating */ + RCC->CKGAENR = 0xFFFFFFFF; + + /** Supply configuration update enable + */ + HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY); + + /** Configure the main internal regulator output voltage + */ + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3); + + while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {} + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 1; + RCC_OscInitStruct.PLL.PLLN = 8; + RCC_OscInitStruct.PLL.PLLP = 2; + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; + RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3; + RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE; + RCC_OscInitStruct.PLL.PLLFRACN = 0; + 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_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1; + RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief Peripherals Common Clock Configuration + * @retval None + */ +void PeriphCommonClock_Config(void) +{ + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + + /** Initializes the peripherals clock + */ + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADC; + PeriphClkInitStruct.PLL3.PLL3M = 1; + PeriphClkInitStruct.PLL3.PLL3N = 8; + PeriphClkInitStruct.PLL3.PLL3P = 2; + PeriphClkInitStruct.PLL3.PLL3Q = 2; + PeriphClkInitStruct.PLL3.PLL3R = 3; + PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_3; + PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE; + PeriphClkInitStruct.PLL3.PLL3FRACN = 0; + PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLL3; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief ADC1 Initialization Function + * @param None + * @retval None + */ +static void MX_ADC1_Init(void) +{ + + /* USER CODE BEGIN ADC1_Init 0 */ + + /* USER CODE END ADC1_Init 0 */ + + ADC_MultiModeTypeDef multimode = {0}; + ADC_ChannelConfTypeDef sConfig = {0}; + + /* USER CODE BEGIN ADC1_Init 1 */ + + /* USER CODE END ADC1_Init 1 */ + + /** Common config + */ + hadc1.Instance = ADC1; + hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2; + hadc1.Init.Resolution = ADC_RESOLUTION_16B; + hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; + hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; + hadc1.Init.LowPowerAutoWait = DISABLE; + hadc1.Init.ContinuousConvMode = DISABLE; + hadc1.Init.NbrOfConversion = 1; + hadc1.Init.DiscontinuousConvMode = DISABLE; + hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; + hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; + hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR; + hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; + hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE; + hadc1.Init.OversamplingMode = DISABLE; + 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) + { + Error_Handler(); + } + + /** Configure Regular Channel + */ + sConfig.Channel = ADC_CHANNEL_10; + sConfig.Rank = ADC_REGULAR_RANK_1; + sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; + sConfig.SingleDiff = ADC_SINGLE_ENDED; + sConfig.OffsetNumber = ADC_OFFSET_NONE; + sConfig.Offset = 0; + sConfig.OffsetSignedSaturation = DISABLE; + if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN ADC1_Init 2 */ + + /* USER CODE END ADC1_Init 2 */ + +} + +/** + * @brief ADC2 Initialization Function + * @param None + * @retval None + */ +static void MX_ADC2_Init(void) +{ + + /* USER CODE BEGIN ADC2_Init 0 */ + + /* USER CODE END ADC2_Init 0 */ + + ADC_ChannelConfTypeDef sConfig = {0}; + + /* USER CODE BEGIN ADC2_Init 1 */ + + /* USER CODE END ADC2_Init 1 */ + + /** Common config + */ + hadc2.Instance = ADC2; + hadc2.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2; + hadc2.Init.Resolution = ADC_RESOLUTION_16B; + hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE; + hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV; + hadc2.Init.LowPowerAutoWait = DISABLE; + hadc2.Init.ContinuousConvMode = DISABLE; + hadc2.Init.NbrOfConversion = 1; + hadc2.Init.DiscontinuousConvMode = DISABLE; + hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START; + hadc2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; + hadc2.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR; + hadc2.Init.Overrun = ADC_OVR_DATA_PRESERVED; + hadc2.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE; + hadc2.Init.OversamplingMode = DISABLE; + if (HAL_ADC_Init(&hadc2) != HAL_OK) + { + Error_Handler(); + } + + /** Configure Regular Channel + */ + sConfig.Channel = ADC_CHANNEL_10; + sConfig.Rank = ADC_REGULAR_RANK_1; + sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; + sConfig.SingleDiff = ADC_DIFFERENTIAL_ENDED; + sConfig.OffsetNumber = ADC_OFFSET_NONE; + sConfig.Offset = 0; + sConfig.OffsetSignedSaturation = DISABLE; + if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN ADC2_Init 2 */ + + /* USER CODE END ADC2_Init 2 */ + +} + +/** + * @brief FDCAN1 Initialization Function + * @param None + * @retval None + */ +static void MX_FDCAN1_Init(void) +{ + + /* USER CODE BEGIN FDCAN1_Init 0 */ + + /* USER CODE END FDCAN1_Init 0 */ + + /* USER CODE BEGIN FDCAN1_Init 1 */ + + /* USER CODE END FDCAN1_Init 1 */ + hfdcan1.Instance = FDCAN1; + hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC; + hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; + hfdcan1.Init.AutoRetransmission = DISABLE; + hfdcan1.Init.TransmitPause = DISABLE; + hfdcan1.Init.ProtocolException = DISABLE; + hfdcan1.Init.NominalPrescaler = 2; + hfdcan1.Init.NominalSyncJumpWidth = 1; + hfdcan1.Init.NominalTimeSeg1 = 23; + hfdcan1.Init.NominalTimeSeg2 = 8; + hfdcan1.Init.DataPrescaler = 1; + hfdcan1.Init.DataSyncJumpWidth = 1; + hfdcan1.Init.DataTimeSeg1 = 1; + hfdcan1.Init.DataTimeSeg2 = 1; + hfdcan1.Init.MessageRAMOffset = 0; + hfdcan1.Init.StdFiltersNbr = 32; + hfdcan1.Init.ExtFiltersNbr = 0; + hfdcan1.Init.RxFifo0ElmtsNbr = 16; + hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8; + hfdcan1.Init.RxFifo1ElmtsNbr = 0; + hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8; + hfdcan1.Init.RxBuffersNbr = 0; + hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_8; + hfdcan1.Init.TxEventsNbr = 0; + hfdcan1.Init.TxBuffersNbr = 0; + hfdcan1.Init.TxFifoQueueElmtsNbr = 32; + hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; + hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_8; + if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN FDCAN1_Init 2 */ + + /* USER CODE END FDCAN1_Init 2 */ + +} + +/** + * @brief SPI1 Initialization Function + * @param None + * @retval None + */ +static void MX_SPI1_Init(void) +{ + + /* USER CODE BEGIN SPI1_Init 0 */ + + /* USER CODE END SPI1_Init 0 */ + + /* USER CODE BEGIN SPI1_Init 1 */ + + /* USER CODE END SPI1_Init 1 */ + /* SPI1 parameter configuration*/ + hspi1.Instance = SPI1; + hspi1.Init.Mode = SPI_MODE_MASTER; + hspi1.Init.Direction = SPI_DIRECTION_2LINES; + hspi1.Init.DataSize = SPI_DATASIZE_8BIT; + hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi1.Init.CRCPolynomial = 0x0; + hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + hspi1.Init.NSSPolarity = SPI_NSS_POLARITY_LOW; + hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA; + hspi1.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; + hspi1.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; + hspi1.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE; + hspi1.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE; + hspi1.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_ENABLE; + hspi1.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE; + hspi1.Init.IOSwap = SPI_IO_SWAP_DISABLE; + if (HAL_SPI_Init(&hspi1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI1_Init 2 */ + + /* USER CODE END SPI1_Init 2 */ + +} + +/** + * @brief SPI2 Initialization Function + * @param None + * @retval None + */ +static void MX_SPI2_Init(void) +{ + + /* USER CODE BEGIN SPI2_Init 0 */ + + /* USER CODE END SPI2_Init 0 */ + + /* USER CODE BEGIN SPI2_Init 1 */ + + /* USER CODE END SPI2_Init 1 */ + /* SPI2 parameter configuration*/ + hspi2.Instance = SPI2; + hspi2.Init.Mode = SPI_MODE_MASTER; + hspi2.Init.Direction = SPI_DIRECTION_2LINES; + hspi2.Init.DataSize = SPI_DATASIZE_4BIT; + hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi2.Init.NSS = SPI_NSS_HARD_INPUT; + hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi2.Init.TIMode = SPI_TIMODE_DISABLE; + hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi2.Init.CRCPolynomial = 0x0; + hspi2.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + hspi2.Init.NSSPolarity = SPI_NSS_POLARITY_LOW; + hspi2.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA; + hspi2.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; + hspi2.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; + hspi2.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE; + hspi2.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE; + hspi2.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_ENABLE; + hspi2.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE; + hspi2.Init.IOSwap = SPI_IO_SWAP_DISABLE; + if (HAL_SPI_Init(&hspi2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI2_Init 2 */ + + /* USER CODE END SPI2_Init 2 */ + +} + +/** + * @brief TIM15 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM15_Init(void) +{ + + /* USER CODE BEGIN TIM15_Init 0 */ + + /* USER CODE END TIM15_Init 0 */ + + TIM_SlaveConfigTypeDef sSlaveConfig = {0}; + TIM_IC_InitTypeDef sConfigIC = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + /* USER CODE BEGIN TIM15_Init 1 */ + + /* USER CODE END TIM15_Init 1 */ + htim15.Instance = TIM15; + htim15.Init.Prescaler = 16000-1; + htim15.Init.CounterMode = TIM_COUNTERMODE_UP; + htim15.Init.Period = 65535; + htim15.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim15.Init.RepetitionCounter = 0; + htim15.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_IC_Init(&htim15) != HAL_OK) + { + Error_Handler(); + } + sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET; + sSlaveConfig.InputTrigger = TIM_TS_TI1FP1; + sSlaveConfig.TriggerPolarity = TIM_INPUTCHANNELPOLARITY_RISING; + sSlaveConfig.TriggerPrescaler = TIM_ICPSC_DIV1; + sSlaveConfig.TriggerFilter = 0; + if (HAL_TIM_SlaveConfigSynchro(&htim15, &sSlaveConfig) != HAL_OK) + { + Error_Handler(); + } + sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; + sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; + sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; + sConfigIC.ICFilter = 0; + if (HAL_TIM_IC_ConfigChannel(&htim15, &sConfigIC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING; + sConfigIC.ICSelection = TIM_ICSELECTION_INDIRECTTI; + if (HAL_TIM_IC_ConfigChannel(&htim15, &sConfigIC, TIM_CHANNEL_2) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim15, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM15_Init 2 */ + + /* USER CODE END TIM15_Init 2 */ + +} + +/** + * @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 */ + /* USER CODE END MX_GPIO_Init_1 */ + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOC, STATUS_LED_B_Pin|MSTR1_Pin|MSTR2_Pin|POS_AIR_CTRL_Pin + |NEG_AIR_CTRL_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOB, IMD_POWER_Pin|STATUS_LED_R_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOA, PRECHARGE_CTRL_Pin|AMS_NERROR_Pin|STATUS_LED_G_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pins : STATUS_LED_B_Pin MSTR1_Pin MSTR2_Pin POS_AIR_CTRL_Pin + NEG_AIR_CTRL_Pin */ + GPIO_InitStruct.Pin = STATUS_LED_B_Pin|MSTR1_Pin|MSTR2_Pin|POS_AIR_CTRL_Pin + |NEG_AIR_CTRL_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /*Configure GPIO pins : TS_ERROR_Pin HV_ACTIVE_Pin IMD_OK_Pin NEG_AIR_CLOSED_Pin + POS_AIR_CLOSED_Pin INTR1_Pin WAKE1_Pin */ + GPIO_InitStruct.Pin = TS_ERROR_Pin|HV_ACTIVE_Pin|IMD_OK_Pin|NEG_AIR_CLOSED_Pin + |POS_AIR_CLOSED_Pin|INTR1_Pin|WAKE1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /*Configure GPIO pins : PRE_and_AIR__open_Pin SDC_VOLTAGE_Pin IMD_ERROR_LED_Pin AMS_ERROR_LED_Pin + INTR2_Pin WAKE2_Pin */ + GPIO_InitStruct.Pin = PRE_and_AIR__open_Pin|SDC_VOLTAGE_Pin|IMD_ERROR_LED_Pin|AMS_ERROR_LED_Pin + |INTR2_Pin|WAKE2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /*Configure GPIO pins : IMD_POWER_Pin STATUS_LED_R_Pin */ + GPIO_InitStruct.Pin = IMD_POWER_Pin|STATUS_LED_R_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /*Configure GPIO pin : TSAL_GREEN_Pin */ + GPIO_InitStruct.Pin = TSAL_GREEN_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(TSAL_GREEN_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pins : PRECHARGE_CTRL_Pin AMS_NERROR_Pin STATUS_LED_G_Pin */ + GPIO_InitStruct.Pin = PRECHARGE_CTRL_Pin|AMS_NERROR_Pin|STATUS_LED_G_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /*AnalogSwitch Config */ + HAL_SYSCFG_AnalogSwitchConfig(SYSCFG_SWITCH_PC2, SYSCFG_SWITCH_PC2_CLOSE); + + /* USER CODE BEGIN MX_GPIO_Init_2 */ + /* USER CODE END MX_GPIO_Init_2 */ +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @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(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#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) +{ + /* 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, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/AMS_Master_Code/Core/Src/stm32h7xx_hal_msp.c b/AMS_Master_Code/Core/Src/stm32h7xx_hal_msp.c index bce8ad7..188a1e9 100644 --- a/AMS_Master_Code/Core/Src/stm32h7xx_hal_msp.c +++ b/AMS_Master_Code/Core/Src/stm32h7xx_hal_msp.c @@ -79,19 +79,19 @@ void HAL_MspInit(void) static uint32_t HAL_RCC_ADC12_CLK_ENABLED=0; /** -* @brief ADC MSP Initialization -* This function configures the hardware resources used in this example -* @param hadc: ADC handle pointer -* @retval None -*/ + * @brief ADC MSP Initialization + * This function configures the hardware resources used in this example + * @param hadc: ADC handle pointer + * @retval None + */ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(hadc->Instance==ADC1) { - /* USER CODE BEGIN ADC1_MspInit 0 */ + /* USER CODE BEGIN ADC1_MspInit 0 */ - /* USER CODE END ADC1_MspInit 0 */ + /* USER CODE END ADC1_MspInit 0 */ /* Peripheral clock enable */ HAL_RCC_ADC12_CLK_ENABLED++; if(HAL_RCC_ADC12_CLK_ENABLED==1){ @@ -107,15 +107,15 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(LV_I_measure_GPIO_Port, &GPIO_InitStruct); - /* USER CODE BEGIN ADC1_MspInit 1 */ + /* USER CODE BEGIN ADC1_MspInit 1 */ - /* USER CODE END ADC1_MspInit 1 */ + /* USER CODE END ADC1_MspInit 1 */ } else if(hadc->Instance==ADC2) { - /* USER CODE BEGIN ADC2_MspInit 0 */ + /* USER CODE BEGIN ADC2_MspInit 0 */ - /* USER CODE END ADC2_MspInit 0 */ + /* USER CODE END ADC2_MspInit 0 */ /* Peripheral clock enable */ HAL_RCC_ADC12_CLK_ENABLED++; if(HAL_RCC_ADC12_CLK_ENABLED==1){ @@ -133,26 +133,26 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - /* USER CODE BEGIN ADC2_MspInit 1 */ + /* USER CODE BEGIN ADC2_MspInit 1 */ - /* USER CODE END ADC2_MspInit 1 */ + /* USER CODE END ADC2_MspInit 1 */ } } /** -* @brief ADC MSP De-Initialization -* This function freeze the hardware resources used in this example -* @param hadc: ADC handle pointer -* @retval None -*/ + * @brief ADC MSP De-Initialization + * This function freeze the hardware resources used in this example + * @param hadc: ADC handle pointer + * @retval None + */ void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc) { if(hadc->Instance==ADC1) { - /* USER CODE BEGIN ADC1_MspDeInit 0 */ + /* USER CODE BEGIN ADC1_MspDeInit 0 */ - /* USER CODE END ADC1_MspDeInit 0 */ + /* USER CODE END ADC1_MspDeInit 0 */ /* Peripheral clock disable */ HAL_RCC_ADC12_CLK_ENABLED--; if(HAL_RCC_ADC12_CLK_ENABLED==0){ @@ -164,15 +164,15 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc) */ HAL_GPIO_DeInit(LV_I_measure_GPIO_Port, LV_I_measure_Pin); - /* USER CODE BEGIN ADC1_MspDeInit 1 */ + /* USER CODE BEGIN ADC1_MspDeInit 1 */ - /* USER CODE END ADC1_MspDeInit 1 */ + /* USER CODE END ADC1_MspDeInit 1 */ } else if(hadc->Instance==ADC2) { - /* USER CODE BEGIN ADC2_MspDeInit 0 */ + /* USER CODE BEGIN ADC2_MspDeInit 0 */ - /* USER CODE END ADC2_MspDeInit 0 */ + /* USER CODE END ADC2_MspDeInit 0 */ /* Peripheral clock disable */ HAL_RCC_ADC12_CLK_ENABLED--; if(HAL_RCC_ADC12_CLK_ENABLED==0){ @@ -186,28 +186,28 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc) */ HAL_GPIO_DeInit(GPIOC, LV_I_measure_Pin|TEMP_TSDCDC_Pin); - /* USER CODE BEGIN ADC2_MspDeInit 1 */ + /* USER CODE BEGIN ADC2_MspDeInit 1 */ - /* USER CODE END ADC2_MspDeInit 1 */ + /* USER CODE END ADC2_MspDeInit 1 */ } } /** -* @brief FDCAN MSP Initialization -* This function configures the hardware resources used in this example -* @param hfdcan: FDCAN handle pointer -* @retval None -*/ + * @brief FDCAN MSP Initialization + * This function configures the hardware resources used in this example + * @param hfdcan: FDCAN handle pointer + * @retval None + */ void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* hfdcan) { GPIO_InitTypeDef GPIO_InitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; if(hfdcan->Instance==FDCAN1) { - /* USER CODE BEGIN FDCAN1_MspInit 0 */ + /* USER CODE BEGIN FDCAN1_MspInit 0 */ - /* USER CODE END FDCAN1_MspInit 0 */ + /* USER CODE END FDCAN1_MspInit 0 */ /** Initializes the peripherals clock */ @@ -219,7 +219,7 @@ void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* hfdcan) PeriphClkInitStruct.PLL2.PLL2R = 2; PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_3; PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE; - PeriphClkInitStruct.PLL2.PLL2FRACN = 0.0; + PeriphClkInitStruct.PLL2.PLL2FRACN = 0; PeriphClkInitStruct.FdcanClockSelection = RCC_FDCANCLKSOURCE_PLL2; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { @@ -244,27 +244,27 @@ void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* hfdcan) /* FDCAN1 interrupt Init */ HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn); - /* USER CODE BEGIN FDCAN1_MspInit 1 */ + /* USER CODE BEGIN FDCAN1_MspInit 1 */ - /* USER CODE END FDCAN1_MspInit 1 */ + /* USER CODE END FDCAN1_MspInit 1 */ } } /** -* @brief FDCAN MSP De-Initialization -* This function freeze the hardware resources used in this example -* @param hfdcan: FDCAN handle pointer -* @retval None -*/ + * @brief FDCAN MSP De-Initialization + * This function freeze the hardware resources used in this example + * @param hfdcan: FDCAN handle pointer + * @retval None + */ void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* hfdcan) { if(hfdcan->Instance==FDCAN1) { - /* USER CODE BEGIN FDCAN1_MspDeInit 0 */ + /* USER CODE BEGIN FDCAN1_MspDeInit 0 */ - /* USER CODE END FDCAN1_MspDeInit 0 */ + /* USER CODE END FDCAN1_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_FDCAN_CLK_DISABLE(); @@ -276,28 +276,28 @@ void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* hfdcan) /* FDCAN1 interrupt DeInit */ HAL_NVIC_DisableIRQ(FDCAN1_IT0_IRQn); - /* USER CODE BEGIN FDCAN1_MspDeInit 1 */ + /* USER CODE BEGIN FDCAN1_MspDeInit 1 */ - /* USER CODE END FDCAN1_MspDeInit 1 */ + /* USER CODE END FDCAN1_MspDeInit 1 */ } } /** -* @brief SPI MSP Initialization -* This function configures the hardware resources used in this example -* @param hspi: SPI handle pointer -* @retval None -*/ + * @brief SPI MSP Initialization + * This function configures the hardware resources used in this example + * @param hspi: SPI handle pointer + * @retval None + */ void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) { GPIO_InitTypeDef GPIO_InitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; if(hspi->Instance==SPI1) { - /* USER CODE BEGIN SPI1_MspInit 0 */ + /* USER CODE BEGIN SPI1_MspInit 0 */ - /* USER CODE END SPI1_MspInit 0 */ + /* USER CODE END SPI1_MspInit 0 */ /** Initializes the peripherals clock */ @@ -333,15 +333,15 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - /* USER CODE BEGIN SPI1_MspInit 1 */ + /* USER CODE BEGIN SPI1_MspInit 1 */ - /* USER CODE END SPI1_MspInit 1 */ + /* USER CODE END SPI1_MspInit 1 */ } else if(hspi->Instance==SPI2) { - /* USER CODE BEGIN SPI2_MspInit 0 */ + /* USER CODE BEGIN SPI2_MspInit 0 */ - /* USER CODE END SPI2_MspInit 0 */ + /* USER CODE END SPI2_MspInit 0 */ /** Initializes the peripherals clock */ @@ -385,26 +385,26 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - /* USER CODE BEGIN SPI2_MspInit 1 */ + /* USER CODE BEGIN SPI2_MspInit 1 */ - /* USER CODE END SPI2_MspInit 1 */ + /* USER CODE END SPI2_MspInit 1 */ } } /** -* @brief SPI MSP De-Initialization -* This function freeze the hardware resources used in this example -* @param hspi: SPI handle pointer -* @retval None -*/ + * @brief SPI MSP De-Initialization + * This function freeze the hardware resources used in this example + * @param hspi: SPI handle pointer + * @retval None + */ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) { if(hspi->Instance==SPI1) { - /* USER CODE BEGIN SPI1_MspDeInit 0 */ + /* USER CODE BEGIN SPI1_MspDeInit 0 */ - /* USER CODE END SPI1_MspDeInit 0 */ + /* USER CODE END SPI1_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_SPI1_CLK_DISABLE(); @@ -418,15 +418,15 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) HAL_GPIO_DeInit(GPIOB, GPIO_PIN_4|GPIO_PIN_5); - /* USER CODE BEGIN SPI1_MspDeInit 1 */ + /* USER CODE BEGIN SPI1_MspDeInit 1 */ - /* USER CODE END SPI1_MspDeInit 1 */ + /* USER CODE END SPI1_MspDeInit 1 */ } else if(hspi->Instance==SPI2) { - /* USER CODE BEGIN SPI2_MspDeInit 0 */ + /* USER CODE BEGIN SPI2_MspDeInit 0 */ - /* USER CODE END SPI2_MspDeInit 0 */ + /* USER CODE END SPI2_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_SPI2_CLK_DISABLE(); @@ -442,27 +442,27 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) HAL_GPIO_DeInit(GPIOA, GPIO_PIN_12); - /* USER CODE BEGIN SPI2_MspDeInit 1 */ + /* USER CODE BEGIN SPI2_MspDeInit 1 */ - /* USER CODE END SPI2_MspDeInit 1 */ + /* USER CODE END SPI2_MspDeInit 1 */ } } /** -* @brief TIM_IC MSP Initialization -* This function configures the hardware resources used in this example -* @param htim_ic: TIM_IC handle pointer -* @retval None -*/ + * @brief TIM_IC MSP Initialization + * This function configures the hardware resources used in this example + * @param htim_ic: TIM_IC handle pointer + * @retval None + */ void HAL_TIM_IC_MspInit(TIM_HandleTypeDef* htim_ic) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(htim_ic->Instance==TIM15) { - /* USER CODE BEGIN TIM15_MspInit 0 */ + /* USER CODE BEGIN TIM15_MspInit 0 */ - /* USER CODE END TIM15_MspInit 0 */ + /* USER CODE END TIM15_MspInit 0 */ /* Peripheral clock enable */ __HAL_RCC_TIM15_CLK_ENABLE(); @@ -477,27 +477,27 @@ void HAL_TIM_IC_MspInit(TIM_HandleTypeDef* htim_ic) GPIO_InitStruct.Alternate = GPIO_AF4_TIM15; HAL_GPIO_Init(IMD_M_GPIO_Port, &GPIO_InitStruct); - /* USER CODE BEGIN TIM15_MspInit 1 */ + /* USER CODE BEGIN TIM15_MspInit 1 */ - /* USER CODE END TIM15_MspInit 1 */ + /* USER CODE END TIM15_MspInit 1 */ } } /** -* @brief TIM_IC MSP De-Initialization -* This function freeze the hardware resources used in this example -* @param htim_ic: TIM_IC handle pointer -* @retval None -*/ + * @brief TIM_IC MSP De-Initialization + * This function freeze the hardware resources used in this example + * @param htim_ic: TIM_IC handle pointer + * @retval None + */ void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef* htim_ic) { if(htim_ic->Instance==TIM15) { - /* USER CODE BEGIN TIM15_MspDeInit 0 */ + /* USER CODE BEGIN TIM15_MspDeInit 0 */ - /* USER CODE END TIM15_MspDeInit 0 */ + /* USER CODE END TIM15_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM15_CLK_DISABLE(); @@ -506,9 +506,9 @@ void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef* htim_ic) */ HAL_GPIO_DeInit(IMD_M_GPIO_Port, IMD_M_Pin); - /* USER CODE BEGIN TIM15_MspDeInit 1 */ + /* USER CODE BEGIN TIM15_MspDeInit 1 */ - /* USER CODE END TIM15_MspDeInit 1 */ + /* USER CODE END TIM15_MspDeInit 1 */ } } diff --git a/AMS_Master_Code/Makefile b/AMS_Master_Code/Makefile index b543949..0a69013 100644 --- a/AMS_Master_Code/Makefile +++ b/AMS_Master_Code/Makefile @@ -1,5 +1,5 @@ ########################################################################################################################## -# File automatically-generated by tool: [projectgenerator] version: [4.6.0-B36] date: [Sat Apr 26 19:50:03 CEST 2025] +# File automatically-generated by tool: [projectgenerator] version: [4.6.0.1-B1] date: [Tue May 27 01:52:23 CEST 2025] ########################################################################################################################## # ------------------------------------------------ diff --git a/AMS_Master_Code/Master_FT25.ioc b/AMS_Master_Code/Master_FT25.ioc index 9e85e48..5b96d72 100644 --- a/AMS_Master_Code/Master_FT25.ioc +++ b/AMS_Master_Code/Master_FT25.ioc @@ -1,411 +1,455 @@ -#MicroXplorer Configuration settings - do not modify -ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_10 -ADC1.ClockPrescaler=ADC_CLOCK_ASYNC_DIV2 -ADC1.IPParameters=Rank-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,OffsetNumber-0\#ChannelRegularConversion,OffsetSignedSaturation-0\#ChannelRegularConversion,NbrOfConversionFlag,master,ClockPrescaler -ADC1.NbrOfConversionFlag=1 -ADC1.OffsetNumber-0\#ChannelRegularConversion=ADC_OFFSET_NONE -ADC1.OffsetSignedSaturation-0\#ChannelRegularConversion=DISABLE -ADC1.Rank-0\#ChannelRegularConversion=1 -ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_1CYCLE_5 -ADC1.master=1 -ADC2.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_10 -ADC2.ClockPrescaler=ADC_CLOCK_ASYNC_DIV2 -ADC2.IPParameters=Rank-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,OffsetNumber-0\#ChannelRegularConversion,OffsetSignedSaturation-0\#ChannelRegularConversion,NbrOfConversionFlag,SingleDiff-0\#ChannelRegularConversion,ClockPrescaler -ADC2.NbrOfConversionFlag=1 -ADC2.OffsetNumber-0\#ChannelRegularConversion=ADC_OFFSET_NONE -ADC2.OffsetSignedSaturation-0\#ChannelRegularConversion=DISABLE -ADC2.Rank-0\#ChannelRegularConversion=1 -ADC2.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_1CYCLE_5 -ADC2.SingleDiff-0\#ChannelRegularConversion=ADC_DIFFERENTIAL_ENDED -CAD.formats=[] -CAD.pinconfig=Dual -CAD.provider= -FDCAN1.CalculateBaudRateNominal=500000 -FDCAN1.CalculateTimeBitNominal=2000 -FDCAN1.CalculateTimeQuantumNominal=62.5 -FDCAN1.IPParameters=CalculateTimeQuantumNominal,CalculateTimeBitNominal,CalculateBaudRateNominal,StdFiltersNbr,NominalPrescaler,NominalTimeSeg1,NominalTimeSeg2,RxFifo0ElmtsNbr,TxFifoQueueElmtsNbr -FDCAN1.NominalPrescaler=2 -FDCAN1.NominalTimeSeg1=23 -FDCAN1.NominalTimeSeg2=8 -FDCAN1.RxFifo0ElmtsNbr=16 -FDCAN1.StdFiltersNbr=32 -FDCAN1.TxFifoQueueElmtsNbr=32 -File.Version=6 -GPIO.groupedBy=Group By Peripherals -KeepUserPlacement=false -Mcu.CPN=STM32H7A3RIT6 -Mcu.Family=STM32H7 -Mcu.IP0=ADC1 -Mcu.IP1=ADC2 -Mcu.IP10=TIM15 -Mcu.IP2=CORTEX_M7 -Mcu.IP3=DEBUG -Mcu.IP4=FDCAN1 -Mcu.IP5=NVIC -Mcu.IP6=RCC -Mcu.IP7=SPI1 -Mcu.IP8=SPI2 -Mcu.IP9=SYS -Mcu.IPNb=11 -Mcu.Name=STM32H7A3R(G-I)Tx -Mcu.Package=LQFP64 -Mcu.Pin0=PH0-OSC_IN -Mcu.Pin1=PH1-OSC_OUT -Mcu.Pin10=PA4 -Mcu.Pin11=PA5 -Mcu.Pin12=PA6 -Mcu.Pin13=PA7 -Mcu.Pin14=PC4 -Mcu.Pin15=PC5 -Mcu.Pin16=PB0 -Mcu.Pin17=PB1 -Mcu.Pin18=PB2 -Mcu.Pin19=PB10 -Mcu.Pin2=PC0 -Mcu.Pin20=PB12 -Mcu.Pin21=PB13 -Mcu.Pin22=PB14 -Mcu.Pin23=PB15 -Mcu.Pin24=PC6 -Mcu.Pin25=PC7 -Mcu.Pin26=PC9 -Mcu.Pin27=PA8 -Mcu.Pin28=PA9 -Mcu.Pin29=PA10 -Mcu.Pin3=PC1 -Mcu.Pin30=PA11 -Mcu.Pin31=PA12 -Mcu.Pin32=PA13 -Mcu.Pin33=PA14 -Mcu.Pin34=PA15 -Mcu.Pin35=PB3 -Mcu.Pin36=PB4 -Mcu.Pin37=PB5 -Mcu.Pin38=PB6 -Mcu.Pin39=PB7 -Mcu.Pin4=PC2 -Mcu.Pin40=PB8 -Mcu.Pin41=PB9 -Mcu.Pin42=VP_SYS_VS_Systick -Mcu.Pin5=PC3 -Mcu.Pin6=PA0 -Mcu.Pin7=PA1 -Mcu.Pin8=PA2 -Mcu.Pin9=PA3 -Mcu.PinsNb=43 -Mcu.ThirdPartyNb=0 -Mcu.UserConstants= -Mcu.UserName=STM32H7A3RITx -MxCube.Version=6.13.0 -MxDb.Version=DB.6.0.130 -NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -NVIC.FDCAN1_IT0_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true -NVIC.ForceEnableDMAVector=true -NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 -NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false -NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -PA0.GPIOParameters=GPIO_Label -PA0.GPIO_Label=TS_ERROR -PA0.Locked=true -PA0.Signal=GPIO_Input -PA1.GPIOParameters=GPIO_Label -PA1.GPIO_Label=HV_ACTIVE -PA1.Locked=true -PA1.Signal=GPIO_Input -PA10.GPIOParameters=GPIO_Label -PA10.GPIO_Label=WAKE1 -PA10.Locked=true -PA10.Signal=GPIO_Input -PA11.GPIOParameters=GPIO_Label -PA11.GPIO_Label=AMS_NERROR -PA11.Locked=true -PA11.Signal=GPIO_Output -PA12.Locked=true -PA12.Mode=Full_Duplex_Master -PA12.Signal=SPI2_SCK -PA13.Locked=true -PA13.Mode=Trace_Asynchronous_SW -PA13.Signal=DEBUG_JTMS-SWDIO -PA14.Locked=true -PA14.Mode=Trace_Asynchronous_SW -PA14.Signal=DEBUG_JTCK-SWCLK -PA15.GPIOParameters=GPIO_Label -PA15.GPIO_Label=STATUS_LED_G -PA15.Locked=true -PA15.Signal=GPIO_Output -PA2.GPIOParameters=GPIO_Label -PA2.GPIO_Label=IMD_M -PA2.Locked=true -PA2.Signal=S_TIM15_CH1 -PA3.GPIOParameters=GPIO_Label -PA3.GPIO_Label=IMD_OK -PA3.Locked=true -PA3.Signal=GPIO_Input -PA4.GPIOParameters=GPIO_Label -PA4.GPIO_Label=AMS_CS -PA4.Locked=true -PA4.Mode=NSS_Signal_Hard_Output -PA4.Signal=SPI1_NSS -PA5.Locked=true -PA5.Mode=Full_Duplex_Master -PA5.Signal=SPI1_SCK -PA6.GPIOParameters=GPIO_Label -PA6.GPIO_Label=NEG_AIR_CLOSED -PA6.Locked=true -PA6.Signal=GPIO_Input -PA7.GPIOParameters=GPIO_Label -PA7.GPIO_Label=POS_AIR_CLOSED -PA7.Locked=true -PA7.Signal=GPIO_Input -PA8.GPIOParameters=GPIO_Label -PA8.GPIO_Label=PRECHARGE_CTRL -PA8.Locked=true -PA8.Signal=GPIO_Output -PA9.GPIOParameters=GPIO_Label -PA9.GPIO_Label=INTR1 -PA9.Locked=true -PA9.Signal=GPIO_Input -PB0.GPIOParameters=GPIO_Label -PB0.GPIO_Label=PRE_and_AIR+_open -PB0.Locked=true -PB0.Signal=GPIO_Input -PB1.GPIOParameters=GPIO_Label -PB1.GPIO_Label=SDC_VOLTAGE -PB1.Locked=true -PB1.Signal=GPIO_Input -PB10.GPIOParameters=GPIO_Label -PB10.GPIO_Label=IMD_ERROR_LED -PB10.Locked=true -PB10.Signal=GPIO_Input -PB12.Locked=true -PB12.Mode=NSS_Signal_Hard_Input -PB12.Signal=SPI2_NSS -PB13.GPIOParameters=GPIO_Label -PB13.GPIO_Label=AMS_ERROR_LED -PB13.Locked=true -PB13.Signal=GPIO_Input -PB14.Mode=Full_Duplex_Master -PB14.Signal=SPI2_MISO -PB15.GPIOParameters=GPIO_Label -PB15.GPIO_Label=STATUS_LED_R -PB15.Locked=true -PB15.Signal=GPIO_Output -PB2.GPIOParameters=GPIO_Label -PB2.GPIO_Label=IMD_POWER -PB2.Locked=true -PB2.Signal=GPIO_Output -PB3.Locked=true -PB3.Mode=Trace_Asynchronous_SW -PB3.Signal=DEBUG_JTDO-SWO -PB4.Locked=true -PB4.Mode=Full_Duplex_Master -PB4.Signal=SPI1_MISO -PB5.Locked=true -PB5.Mode=Full_Duplex_Master -PB5.Signal=SPI1_MOSI -PB6.GPIOParameters=GPIO_Label -PB6.GPIO_Label=INTR2 -PB6.Locked=true -PB6.Signal=GPIO_Input -PB7.GPIOParameters=GPIO_Label -PB7.GPIO_Label=WAKE2 -PB7.Locked=true -PB7.Signal=GPIO_Input -PB8.Locked=true -PB8.Mode=FDCAN_Activate -PB8.Signal=FDCAN1_RX -PB9.Locked=true -PB9.Mode=FDCAN_Activate -PB9.Signal=FDCAN1_TX -PC0.GPIOParameters=GPIO_Label -PC0.GPIO_Label=LV_I_measure -PC0.Locked=true -PC0.Signal=ADCx_INP10 -PC1.GPIOParameters=GPIO_Label -PC1.GPIO_Label=TEMP_TSDCDC -PC1.Locked=true -PC1.Signal=SharedAnalog_PC1 -PC2.GPIOParameters=GPIO_Label -PC2.GPIO_Label=STATUS_LED_B -PC2.Locked=true -PC2.Signal=GPIO_Output -PC3.Locked=true -PC3.Mode=Full_Duplex_Master -PC3.Signal=SPI2_MOSI -PC4.GPIOParameters=GPIO_Label -PC4.GPIO_Label=MSTR1 -PC4.Locked=true -PC4.Signal=GPIO_Output -PC5.GPIOParameters=GPIO_Label -PC5.GPIO_Label=MSTR2 -PC5.Locked=true -PC5.Signal=GPIO_Output -PC6.GPIOParameters=GPIO_Label -PC6.GPIO_Label=POS_AIR_CTRL -PC6.Locked=true -PC6.Signal=GPIO_Output -PC7.GPIOParameters=GPIO_Label -PC7.GPIO_Label=NEG_AIR_CTRL -PC7.Locked=true -PC7.Signal=GPIO_Output -PC9.GPIOParameters=GPIO_Label -PC9.GPIO_Label=TSAL_GREEN -PC9.Locked=true -PC9.Signal=GPIO_Input -PH0-OSC_IN.Locked=true -PH0-OSC_IN.Mode=HSE-External-Oscillator -PH0-OSC_IN.Signal=RCC_OSC_IN -PH1-OSC_OUT.Locked=true -PH1-OSC_OUT.Mode=HSE-External-Oscillator -PH1-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=STM32H7A3RITx -ProjectManager.FirmwarePackage=STM32Cube FW_H7 V1.12.1 -ProjectManager.FreePins=false -ProjectManager.HalAssertFull=false -ProjectManager.HeapSize=0x200 -ProjectManager.KeepUserCode=true -ProjectManager.LastFirmware=true -ProjectManager.LibraryCopy=1 -ProjectManager.MainLocation=Core/Src -ProjectManager.NoMain=false -ProjectManager.PreviousToolchain= -ProjectManager.ProjectBuild=false -ProjectManager.ProjectFileName=Master_FT25.ioc -ProjectManager.ProjectName=Master_FT25 -ProjectManager.ProjectStructure= -ProjectManager.RegisterCallBack= -ProjectManager.StackSize=0x400 -ProjectManager.TargetToolchain=Makefile -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_FDCAN1_Init-FDCAN1-false-HAL-true,4-MX_TIM15_Init-TIM15-false-HAL-true,5-MX_SPI1_Init-SPI1-false-HAL-true,6-MX_SPI2_Init-SPI2-false-HAL-true,7-MX_ADC1_Init-ADC1-false-HAL-true,8-MX_ADC2_Init-ADC2-false-HAL-true,0-MX_CORTEX_M7_Init-CORTEX_M7-false-HAL-true -RCC.ADCCLockSelection=RCC_ADCCLKSOURCE_PLL3 -RCC.ADCFreq_Value=42666666.666666664 -RCC.AHB12Freq_Value=64000000 -RCC.AHB4Freq_Value=64000000 -RCC.APB1Freq_Value=64000000 -RCC.APB2Freq_Value=64000000 -RCC.APB3Freq_Value=64000000 -RCC.APB4Freq_Value=64000000 -RCC.AXIClockFreq_Value=64000000 -RCC.CDCPREFreq_Value=64000000 -RCC.CECFreq_Value=32000 -RCC.CKPERFreq_Value=64000000 -RCC.CortexFreq_Value=64000000 -RCC.CpuClockFreq_Value=64000000 -RCC.DAC1Freq_Value=32000 -RCC.DAC2Freq_Value=32000 -RCC.DFSDM2ACLkFreq_Value=64000000 -RCC.DFSDM2Freq_Value=64000000 -RCC.DFSDMACLkFreq_Value=64000000 -RCC.DFSDMFreq_Value=64000000 -RCC.DIVM1=1 -RCC.DIVM2=1 -RCC.DIVM3=1 -RCC.DIVN1=8 -RCC.DIVN2=8 -RCC.DIVN3=8 -RCC.DIVP1Freq_Value=64000000 -RCC.DIVP2Freq_Value=64000000 -RCC.DIVP3Freq_Value=64000000 -RCC.DIVQ1Freq_Value=64000000 -RCC.DIVQ2=4 -RCC.DIVQ2Freq_Value=32000000 -RCC.DIVQ3Freq_Value=64000000 -RCC.DIVR1Freq_Value=64000000 -RCC.DIVR2Freq_Value=64000000 -RCC.DIVR3=3 -RCC.DIVR3Freq_Value=42666666.666666664 -RCC.FDCANCLockSelection=RCC_FDCANCLKSOURCE_PLL2 -RCC.FDCANFreq_Value=32000000 -RCC.FMCFreq_Value=64000000 -RCC.FamilyName=M -RCC.HCLK3ClockFreq_Value=64000000 -RCC.HCLKFreq_Value=64000000 -RCC.HSE_VALUE=16000000 -RCC.I2C123CLockSelection=RCC_I2C123CLKSOURCE_CSI -RCC.I2C123Freq_Value=4000000 -RCC.I2C4Freq_Value=64000000 -RCC.IPParameters=ADCCLockSelection,ADCFreq_Value,AHB12Freq_Value,AHB4Freq_Value,APB1Freq_Value,APB2Freq_Value,APB3Freq_Value,APB4Freq_Value,AXIClockFreq_Value,CDCPREFreq_Value,CECFreq_Value,CKPERFreq_Value,CortexFreq_Value,CpuClockFreq_Value,DAC1Freq_Value,DAC2Freq_Value,DFSDM2ACLkFreq_Value,DFSDM2Freq_Value,DFSDMACLkFreq_Value,DFSDMFreq_Value,DIVM1,DIVM2,DIVM3,DIVN1,DIVN2,DIVN3,DIVP1Freq_Value,DIVP2Freq_Value,DIVP3Freq_Value,DIVQ1Freq_Value,DIVQ2,DIVQ2Freq_Value,DIVQ3Freq_Value,DIVR1Freq_Value,DIVR2Freq_Value,DIVR3,DIVR3Freq_Value,FDCANCLockSelection,FDCANFreq_Value,FMCFreq_Value,FamilyName,HCLK3ClockFreq_Value,HCLKFreq_Value,HSE_VALUE,I2C123CLockSelection,I2C123Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPTIM345Freq_Value,LPUART1Freq_Value,LTDCFreq_Value,MCO1PinFreq_Value,MCO2PinFreq_Value,PLL2FRACN,PLL3FRACN,PLLFRACN,PLLSourceVirtual,QSPIFreq_Value,RNGFreq_Value,RTCFreq_Value,SAI1Freq_Value,SAI2AFreq_Value,SAI2BFreq_Value,SDMMCFreq_Value,SPDIFRXFreq_Value,SPI123Freq_Value,SPI45Freq_Value,SPI6Freq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,Tim1OutputFreq_Value,Tim2OutputFreq_Value,TraceFreq_Value,USART16Freq_Value,USART234578Freq_Value,USBFreq_Value,VCO1OutputFreq_Value,VCO2OutputFreq_Value,VCO3OutputFreq_Value,VCOInput1Freq_Value,VCOInput2Freq_Value,VCOInput3Freq_Value -RCC.LPTIM1Freq_Value=64000000 -RCC.LPTIM2Freq_Value=64000000 -RCC.LPTIM345Freq_Value=64000000 -RCC.LPUART1Freq_Value=64000000 -RCC.LTDCFreq_Value=42666666.666666664 -RCC.MCO1PinFreq_Value=64000000 -RCC.MCO2PinFreq_Value=64000000 -RCC.PLL2FRACN=0 -RCC.PLL3FRACN=0 -RCC.PLLFRACN=0 -RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE -RCC.QSPIFreq_Value=64000000 -RCC.RNGFreq_Value=48000000 -RCC.RTCFreq_Value=32000 -RCC.SAI1Freq_Value=64000000 -RCC.SAI2AFreq_Value=64000000 -RCC.SAI2BFreq_Value=64000000 -RCC.SDMMCFreq_Value=64000000 -RCC.SPDIFRXFreq_Value=64000000 -RCC.SPI123Freq_Value=64000000 -RCC.SPI45Freq_Value=64000000 -RCC.SPI6Freq_Value=64000000 -RCC.SWPMI1Freq_Value=64000000 -RCC.SYSCLKFreq_VALUE=64000000 -RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK -RCC.Tim1OutputFreq_Value=64000000 -RCC.Tim2OutputFreq_Value=64000000 -RCC.TraceFreq_Value=64000000 -RCC.USART16Freq_Value=64000000 -RCC.USART234578Freq_Value=64000000 -RCC.USBFreq_Value=64000000 -RCC.VCO1OutputFreq_Value=128000000 -RCC.VCO2OutputFreq_Value=128000000 -RCC.VCO3OutputFreq_Value=128000000 -RCC.VCOInput1Freq_Value=16000000 -RCC.VCOInput2Freq_Value=16000000 -RCC.VCOInput3Freq_Value=16000000 -SH.ADCx_INP10.0=ADC1_INP10,IN10-Single-Ended -SH.ADCx_INP10.1=ADC2_INP10,IN10-Differential -SH.ADCx_INP10.ConfNb=2 -SH.S_TIM15_CH1.0=TIM15_CH1,PWM_Input_1 -SH.S_TIM15_CH1.ConfNb=1 -SH.SharedAnalog_PC1.0=ADC2_INP11 -SH.SharedAnalog_PC1.1=ADC2_INN10,IN10-Differential -SH.SharedAnalog_PC1.ConfNb=2 -SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_128 -SPI1.CalculateBaudRate=500.0 KBits/s -SPI1.DataSize=SPI_DATASIZE_8BIT -SPI1.Direction=SPI_DIRECTION_2LINES -SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,VirtualNSS,BaudRatePrescaler,DataSize -SPI1.Mode=SPI_MODE_MASTER -SPI1.VirtualNSS=VM_NSSHARD -SPI1.VirtualType=VM_MASTER -SPI2.CalculateBaudRate=32.0 MBits/s -SPI2.Direction=SPI_DIRECTION_2LINES -SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,VirtualNSS -SPI2.Mode=SPI_MODE_MASTER -SPI2.VirtualNSS=VM_NSSHARD -SPI2.VirtualType=VM_MASTER -TIM15.IPParameters=Prescaler -TIM15.Prescaler=16000-1 -VP_SYS_VS_Systick.Mode=SysTick -VP_SYS_VS_Systick.Signal=SYS_VS_Systick -board=custom +#MicroXplorer Configuration settings - do not modify +ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_10 +ADC1.ClockPrescaler=ADC_CLOCK_ASYNC_DIV2 +ADC1.IPParameters=Rank-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,OffsetNumber-0\#ChannelRegularConversion,OffsetSignedSaturation-0\#ChannelRegularConversion,NbrOfConversionFlag,master,ClockPrescaler +ADC1.NbrOfConversionFlag=1 +ADC1.OffsetNumber-0\#ChannelRegularConversion=ADC_OFFSET_NONE +ADC1.OffsetSignedSaturation-0\#ChannelRegularConversion=DISABLE +ADC1.Rank-0\#ChannelRegularConversion=1 +ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_1CYCLE_5 +ADC1.master=1 +ADC2.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_10 +ADC2.ClockPrescaler=ADC_CLOCK_ASYNC_DIV2 +ADC2.IPParameters=Rank-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,OffsetNumber-0\#ChannelRegularConversion,OffsetSignedSaturation-0\#ChannelRegularConversion,NbrOfConversionFlag,SingleDiff-0\#ChannelRegularConversion,ClockPrescaler +ADC2.NbrOfConversionFlag=1 +ADC2.OffsetNumber-0\#ChannelRegularConversion=ADC_OFFSET_NONE +ADC2.OffsetSignedSaturation-0\#ChannelRegularConversion=DISABLE +ADC2.Rank-0\#ChannelRegularConversion=1 +ADC2.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_1CYCLE_5 +ADC2.SingleDiff-0\#ChannelRegularConversion=ADC_DIFFERENTIAL_ENDED +CAD.formats=[] +CAD.pinconfig=Dual +CAD.provider= +FDCAN1.CalculateBaudRateNominal=500000 +FDCAN1.CalculateTimeBitNominal=2000 +FDCAN1.CalculateTimeQuantumNominal=62.5 +FDCAN1.IPParameters=CalculateTimeQuantumNominal,CalculateTimeBitNominal,CalculateBaudRateNominal,StdFiltersNbr,NominalPrescaler,NominalTimeSeg1,NominalTimeSeg2,RxFifo0ElmtsNbr,TxFifoQueueElmtsNbr +FDCAN1.NominalPrescaler=2 +FDCAN1.NominalTimeSeg1=23 +FDCAN1.NominalTimeSeg2=8 +FDCAN1.RxFifo0ElmtsNbr=16 +FDCAN1.StdFiltersNbr=32 +FDCAN1.TxFifoQueueElmtsNbr=32 +File.Version=6 +GPIO.groupedBy=Group By Peripherals +KeepUserPlacement=false +MMTAppReg1.MEMORYMAP.AppRegionName=DTCMRAM +MMTAppReg1.MEMORYMAP.ContextName=Cortex-M7NS +MMTAppReg1.MEMORYMAP.CoreName=Arm Cortex-M7 +MMTAppReg1.MEMORYMAP.IPParameters=StartAddress,Size,CoreName,ContextName,Name +MMTAppReg1.MEMORYMAP.Name=DTCMRAM +MMTAppReg1.MEMORYMAP.Size=131072 +MMTAppReg1.MEMORYMAP.StartAddress=0x20000000 +MMTAppReg2.MEMORYMAP.AppRegionName=RAM +MMTAppReg2.MEMORYMAP.ContextName=Cortex-M7NS +MMTAppReg2.MEMORYMAP.CoreName=Arm Cortex-M7 +MMTAppReg2.MEMORYMAP.DefaultDataRegion=true +MMTAppReg2.MEMORYMAP.IPParameters=StartAddress,Size,CoreName,ContextName,Name,DefaultDataRegion +MMTAppReg2.MEMORYMAP.Name=RAM +MMTAppReg2.MEMORYMAP.Size=1048576 +MMTAppReg2.MEMORYMAP.StartAddress=0x24000000 +MMTAppReg3.MEMORYMAP.AppRegionName=ITCMRAM +MMTAppReg3.MEMORYMAP.Cacheability=WTRA +MMTAppReg3.MEMORYMAP.ContextName=Cortex-M7NS +MMTAppReg3.MEMORYMAP.CoreName=Arm Cortex-M7 +MMTAppReg3.MEMORYMAP.IPParameters=StartAddress,Size,CoreName,ContextName,Name,Cacheability +MMTAppReg3.MEMORYMAP.Name=ITCMRAM +MMTAppReg3.MEMORYMAP.Size=65536 +MMTAppReg3.MEMORYMAP.StartAddress=0x00000000 +MMTAppReg4.MEMORYMAP.AP=RO_priv_only +MMTAppReg4.MEMORYMAP.AppRegionName=FLASH +MMTAppReg4.MEMORYMAP.Cacheability=WTRA +MMTAppReg4.MEMORYMAP.ContextName=Cortex-M7NS +MMTAppReg4.MEMORYMAP.CoreName=Arm Cortex-M7 +MMTAppReg4.MEMORYMAP.DefaultCodeRegion=true +MMTAppReg4.MEMORYMAP.IPParameters=StartAddress,Size,CoreName,MemType,ContextName,Name,AP,Cacheability,DefaultCodeRegion,ISRRegion,RootBootRegion +MMTAppReg4.MEMORYMAP.ISRRegion=true +MMTAppReg4.MEMORYMAP.MemType=ROM +MMTAppReg4.MEMORYMAP.Name=FLASH +MMTAppReg4.MEMORYMAP.RootBootRegion=true +MMTAppReg4.MEMORYMAP.Size=2097152 +MMTAppReg4.MEMORYMAP.StartAddress=0x08000000 +MMTAppRegionsCount=4 +MMTConfigApplied=false +Mcu.CPN=STM32H7A3RIT6 +Mcu.Family=STM32H7 +Mcu.IP0=ADC1 +Mcu.IP1=ADC2 +Mcu.IP10=SYS +Mcu.IP11=TIM15 +Mcu.IP2=CORTEX_M7 +Mcu.IP3=DEBUG +Mcu.IP4=FDCAN1 +Mcu.IP5=MEMORYMAP +Mcu.IP6=NVIC +Mcu.IP7=RCC +Mcu.IP8=SPI1 +Mcu.IP9=SPI2 +Mcu.IPNb=12 +Mcu.Name=STM32H7A3R(G-I)Tx +Mcu.Package=LQFP64 +Mcu.Pin0=PH0-OSC_IN +Mcu.Pin1=PH1-OSC_OUT +Mcu.Pin10=PA4 +Mcu.Pin11=PA5 +Mcu.Pin12=PA6 +Mcu.Pin13=PA7 +Mcu.Pin14=PC4 +Mcu.Pin15=PC5 +Mcu.Pin16=PB0 +Mcu.Pin17=PB1 +Mcu.Pin18=PB2 +Mcu.Pin19=PB10 +Mcu.Pin2=PC0 +Mcu.Pin20=PB12 +Mcu.Pin21=PB13 +Mcu.Pin22=PB14 +Mcu.Pin23=PB15 +Mcu.Pin24=PC6 +Mcu.Pin25=PC7 +Mcu.Pin26=PC9 +Mcu.Pin27=PA8 +Mcu.Pin28=PA9 +Mcu.Pin29=PA10 +Mcu.Pin3=PC1 +Mcu.Pin30=PA11 +Mcu.Pin31=PA12 +Mcu.Pin32=PA13 +Mcu.Pin33=PA14 +Mcu.Pin34=PA15 +Mcu.Pin35=PB3 +Mcu.Pin36=PB4 +Mcu.Pin37=PB5 +Mcu.Pin38=PB6 +Mcu.Pin39=PB7 +Mcu.Pin4=PC2 +Mcu.Pin40=PB8 +Mcu.Pin41=PB9 +Mcu.Pin42=VP_SYS_VS_Systick +Mcu.Pin43=VP_MEMORYMAP_VS_MEMORYMAP +Mcu.Pin5=PC3 +Mcu.Pin6=PA0 +Mcu.Pin7=PA1 +Mcu.Pin8=PA2 +Mcu.Pin9=PA3 +Mcu.PinsNb=44 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32H7A3RITx +MxCube.Version=6.14.1 +MxDb.Version=DB.6.0.141 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.FDCAN1_IT0_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +PA0.GPIOParameters=GPIO_Label +PA0.GPIO_Label=TS_ERROR +PA0.Locked=true +PA0.Signal=GPIO_Input +PA1.GPIOParameters=GPIO_Label +PA1.GPIO_Label=HV_ACTIVE +PA1.Locked=true +PA1.Signal=GPIO_Input +PA10.GPIOParameters=GPIO_Label +PA10.GPIO_Label=WAKE1 +PA10.Locked=true +PA10.Signal=GPIO_Input +PA11.GPIOParameters=GPIO_Label +PA11.GPIO_Label=AMS_NERROR +PA11.Locked=true +PA11.Signal=GPIO_Output +PA12.Locked=true +PA12.Mode=Full_Duplex_Master +PA12.Signal=SPI2_SCK +PA13.Locked=true +PA13.Mode=Trace_Asynchronous_SW +PA13.Signal=DEBUG_JTMS-SWDIO +PA14.Locked=true +PA14.Mode=Trace_Asynchronous_SW +PA14.Signal=DEBUG_JTCK-SWCLK +PA15.GPIOParameters=GPIO_Label +PA15.GPIO_Label=STATUS_LED_G +PA15.Locked=true +PA15.Signal=GPIO_Output +PA2.GPIOParameters=GPIO_Label +PA2.GPIO_Label=IMD_M +PA2.Locked=true +PA2.Signal=S_TIM15_CH1 +PA3.GPIOParameters=GPIO_Label +PA3.GPIO_Label=IMD_OK +PA3.Locked=true +PA3.Signal=GPIO_Input +PA4.GPIOParameters=GPIO_Label +PA4.GPIO_Label=AMS_CS +PA4.Locked=true +PA4.Mode=NSS_Signal_Hard_Output +PA4.Signal=SPI1_NSS +PA5.Locked=true +PA5.Mode=Full_Duplex_Master +PA5.Signal=SPI1_SCK +PA6.GPIOParameters=GPIO_Label +PA6.GPIO_Label=NEG_AIR_CLOSED +PA6.Locked=true +PA6.Signal=GPIO_Input +PA7.GPIOParameters=GPIO_Label +PA7.GPIO_Label=POS_AIR_CLOSED +PA7.Locked=true +PA7.Signal=GPIO_Input +PA8.GPIOParameters=GPIO_Label +PA8.GPIO_Label=PRECHARGE_CTRL +PA8.Locked=true +PA8.Signal=GPIO_Output +PA9.GPIOParameters=GPIO_Label +PA9.GPIO_Label=INTR1 +PA9.Locked=true +PA9.Signal=GPIO_Input +PB0.GPIOParameters=GPIO_Label +PB0.GPIO_Label=PRE_and_AIR+_open +PB0.Locked=true +PB0.Signal=GPIO_Input +PB1.GPIOParameters=GPIO_Label +PB1.GPIO_Label=SDC_VOLTAGE +PB1.Locked=true +PB1.Signal=GPIO_Input +PB10.GPIOParameters=GPIO_Label +PB10.GPIO_Label=IMD_ERROR_LED +PB10.Locked=true +PB10.Signal=GPIO_Input +PB12.Locked=true +PB12.Mode=NSS_Signal_Hard_Input +PB12.Signal=SPI2_NSS +PB13.GPIOParameters=GPIO_Label +PB13.GPIO_Label=AMS_ERROR_LED +PB13.Locked=true +PB13.Signal=GPIO_Input +PB14.Mode=Full_Duplex_Master +PB14.Signal=SPI2_MISO +PB15.GPIOParameters=GPIO_Label +PB15.GPIO_Label=STATUS_LED_R +PB15.Locked=true +PB15.Signal=GPIO_Output +PB2.GPIOParameters=GPIO_Label +PB2.GPIO_Label=IMD_POWER +PB2.Locked=true +PB2.Signal=GPIO_Output +PB3.Locked=true +PB3.Mode=Trace_Asynchronous_SW +PB3.Signal=DEBUG_JTDO-SWO +PB4.Locked=true +PB4.Mode=Full_Duplex_Master +PB4.Signal=SPI1_MISO +PB5.Locked=true +PB5.Mode=Full_Duplex_Master +PB5.Signal=SPI1_MOSI +PB6.GPIOParameters=GPIO_Label +PB6.GPIO_Label=INTR2 +PB6.Locked=true +PB6.Signal=GPIO_Input +PB7.GPIOParameters=GPIO_Label +PB7.GPIO_Label=WAKE2 +PB7.Locked=true +PB7.Signal=GPIO_Input +PB8.Locked=true +PB8.Mode=FDCAN_Activate +PB8.Signal=FDCAN1_RX +PB9.Locked=true +PB9.Mode=FDCAN_Activate +PB9.Signal=FDCAN1_TX +PC0.GPIOParameters=GPIO_Label +PC0.GPIO_Label=LV_I_measure +PC0.Locked=true +PC0.Signal=ADCx_INP10 +PC1.GPIOParameters=GPIO_Label +PC1.GPIO_Label=TEMP_TSDCDC +PC1.Locked=true +PC1.Signal=SharedAnalog_PC1 +PC2.GPIOParameters=GPIO_Label +PC2.GPIO_Label=STATUS_LED_B +PC2.Locked=true +PC2.Signal=GPIO_Output +PC3.Locked=true +PC3.Mode=Full_Duplex_Master +PC3.Signal=SPI2_MOSI +PC4.GPIOParameters=GPIO_Label +PC4.GPIO_Label=MSTR1 +PC4.Locked=true +PC4.Signal=GPIO_Output +PC5.GPIOParameters=GPIO_Label +PC5.GPIO_Label=MSTR2 +PC5.Locked=true +PC5.Signal=GPIO_Output +PC6.GPIOParameters=GPIO_Label +PC6.GPIO_Label=POS_AIR_CTRL +PC6.Locked=true +PC6.Signal=GPIO_Output +PC7.GPIOParameters=GPIO_Label +PC7.GPIO_Label=NEG_AIR_CTRL +PC7.Locked=true +PC7.Signal=GPIO_Output +PC9.GPIOParameters=GPIO_Label +PC9.GPIO_Label=TSAL_GREEN +PC9.Locked=true +PC9.Signal=GPIO_Input +PH0-OSC_IN.Locked=true +PH0-OSC_IN.Mode=HSE-External-Oscillator +PH0-OSC_IN.Signal=RCC_OSC_IN +PH1-OSC_OUT.Locked=true +PH1-OSC_OUT.Mode=HSE-External-Oscillator +PH1-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=STM32H7A3RITx +ProjectManager.FirmwarePackage=STM32Cube FW_H7 V1.12.1 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=1 +ProjectManager.MainLocation=Core/Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=Master_FT25.ioc +ProjectManager.ProjectName=Master_FT25 +ProjectManager.ProjectStructure= +ProjectManager.RegisterCallBack= +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=Makefile +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_FDCAN1_Init-FDCAN1-false-HAL-true,4-MX_TIM15_Init-TIM15-false-HAL-true,5-MX_SPI1_Init-SPI1-false-HAL-true,6-MX_SPI2_Init-SPI2-false-HAL-true,7-MX_ADC1_Init-ADC1-false-HAL-true,8-MX_ADC2_Init-ADC2-false-HAL-true,0-MX_CORTEX_M7_Init-CORTEX_M7-false-HAL-true +RCC.ADCCLockSelection=RCC_ADCCLKSOURCE_PLL3 +RCC.ADCFreq_Value=42666666.666666664 +RCC.AHB12Freq_Value=64000000 +RCC.AHB4Freq_Value=64000000 +RCC.APB1Freq_Value=64000000 +RCC.APB2Freq_Value=64000000 +RCC.APB3Freq_Value=64000000 +RCC.APB4Freq_Value=64000000 +RCC.AXIClockFreq_Value=64000000 +RCC.CDCPREFreq_Value=64000000 +RCC.CECFreq_Value=32000 +RCC.CKPERFreq_Value=64000000 +RCC.CortexFreq_Value=64000000 +RCC.CpuClockFreq_Value=64000000 +RCC.DAC1Freq_Value=32000 +RCC.DAC2Freq_Value=32000 +RCC.DFSDM2ACLkFreq_Value=64000000 +RCC.DFSDM2Freq_Value=64000000 +RCC.DFSDMACLkFreq_Value=64000000 +RCC.DFSDMFreq_Value=64000000 +RCC.DIVM1=1 +RCC.DIVM2=1 +RCC.DIVM3=1 +RCC.DIVN1=8 +RCC.DIVN2=8 +RCC.DIVN3=8 +RCC.DIVP1Freq_Value=64000000 +RCC.DIVP2Freq_Value=64000000 +RCC.DIVP3Freq_Value=64000000 +RCC.DIVQ1Freq_Value=64000000 +RCC.DIVQ2=4 +RCC.DIVQ2Freq_Value=32000000 +RCC.DIVQ3Freq_Value=64000000 +RCC.DIVR1Freq_Value=64000000 +RCC.DIVR2Freq_Value=64000000 +RCC.DIVR3=3 +RCC.DIVR3Freq_Value=42666666.666666664 +RCC.FDCANCLockSelection=RCC_FDCANCLKSOURCE_PLL2 +RCC.FDCANFreq_Value=32000000 +RCC.FMCFreq_Value=64000000 +RCC.FamilyName=M +RCC.HCLK3ClockFreq_Value=64000000 +RCC.HCLKFreq_Value=64000000 +RCC.HSE_VALUE=16000000 +RCC.I2C123CLockSelection=RCC_I2C123CLKSOURCE_CSI +RCC.I2C123Freq_Value=4000000 +RCC.I2C4Freq_Value=64000000 +RCC.IPParameters=ADCCLockSelection,ADCFreq_Value,AHB12Freq_Value,AHB4Freq_Value,APB1Freq_Value,APB2Freq_Value,APB3Freq_Value,APB4Freq_Value,AXIClockFreq_Value,CDCPREFreq_Value,CECFreq_Value,CKPERFreq_Value,CortexFreq_Value,CpuClockFreq_Value,DAC1Freq_Value,DAC2Freq_Value,DFSDM2ACLkFreq_Value,DFSDM2Freq_Value,DFSDMACLkFreq_Value,DFSDMFreq_Value,DIVM1,DIVM2,DIVM3,DIVN1,DIVN2,DIVN3,DIVP1Freq_Value,DIVP2Freq_Value,DIVP3Freq_Value,DIVQ1Freq_Value,DIVQ2,DIVQ2Freq_Value,DIVQ3Freq_Value,DIVR1Freq_Value,DIVR2Freq_Value,DIVR3,DIVR3Freq_Value,FDCANCLockSelection,FDCANFreq_Value,FMCFreq_Value,FamilyName,HCLK3ClockFreq_Value,HCLKFreq_Value,HSE_VALUE,I2C123CLockSelection,I2C123Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPTIM345Freq_Value,LPUART1Freq_Value,LTDCFreq_Value,MCO1PinFreq_Value,MCO2PinFreq_Value,PLL2FRACN,PLL3FRACN,PLLFRACN,PLLSourceVirtual,QSPIFreq_Value,RNGFreq_Value,RTCFreq_Value,SAI1Freq_Value,SAI2AFreq_Value,SAI2BFreq_Value,SDMMCFreq_Value,SPDIFRXFreq_Value,SPI123Freq_Value,SPI45Freq_Value,SPI6Freq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,Tim1OutputFreq_Value,Tim2OutputFreq_Value,TraceFreq_Value,USART16Freq_Value,USART234578Freq_Value,USBFreq_Value,VCO1OutputFreq_Value,VCO2OutputFreq_Value,VCO3OutputFreq_Value,VCOInput1Freq_Value,VCOInput2Freq_Value,VCOInput3Freq_Value +RCC.LPTIM1Freq_Value=64000000 +RCC.LPTIM2Freq_Value=64000000 +RCC.LPTIM345Freq_Value=64000000 +RCC.LPUART1Freq_Value=64000000 +RCC.LTDCFreq_Value=42666666.666666664 +RCC.MCO1PinFreq_Value=64000000 +RCC.MCO2PinFreq_Value=64000000 +RCC.PLL2FRACN=0 +RCC.PLL3FRACN=0 +RCC.PLLFRACN=0 +RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE +RCC.QSPIFreq_Value=64000000 +RCC.RNGFreq_Value=48000000 +RCC.RTCFreq_Value=32000 +RCC.SAI1Freq_Value=64000000 +RCC.SAI2AFreq_Value=64000000 +RCC.SAI2BFreq_Value=64000000 +RCC.SDMMCFreq_Value=64000000 +RCC.SPDIFRXFreq_Value=64000000 +RCC.SPI123Freq_Value=64000000 +RCC.SPI45Freq_Value=64000000 +RCC.SPI6Freq_Value=64000000 +RCC.SWPMI1Freq_Value=64000000 +RCC.SYSCLKFreq_VALUE=64000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.Tim1OutputFreq_Value=64000000 +RCC.Tim2OutputFreq_Value=64000000 +RCC.TraceFreq_Value=64000000 +RCC.USART16Freq_Value=64000000 +RCC.USART234578Freq_Value=64000000 +RCC.USBFreq_Value=64000000 +RCC.VCO1OutputFreq_Value=128000000 +RCC.VCO2OutputFreq_Value=128000000 +RCC.VCO3OutputFreq_Value=128000000 +RCC.VCOInput1Freq_Value=16000000 +RCC.VCOInput2Freq_Value=16000000 +RCC.VCOInput3Freq_Value=16000000 +SH.ADCx_INP10.0=ADC1_INP10,IN10-Single-Ended +SH.ADCx_INP10.1=ADC2_INP10,IN10-Differential +SH.ADCx_INP10.ConfNb=2 +SH.S_TIM15_CH1.0=TIM15_CH1,PWM_Input_1 +SH.S_TIM15_CH1.ConfNb=1 +SH.SharedAnalog_PC1.0=ADC2_INP11 +SH.SharedAnalog_PC1.1=ADC2_INN10,IN10-Differential +SH.SharedAnalog_PC1.ConfNb=2 +SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_128 +SPI1.CalculateBaudRate=500.0 KBits/s +SPI1.DataSize=SPI_DATASIZE_8BIT +SPI1.Direction=SPI_DIRECTION_2LINES +SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,VirtualNSS,BaudRatePrescaler,DataSize,MasterReceiverAutoSusp +SPI1.MasterReceiverAutoSusp=SPI_MASTER_RX_AUTOSUSP_ENABLE +SPI1.Mode=SPI_MODE_MASTER +SPI1.VirtualNSS=VM_NSSHARD +SPI1.VirtualType=VM_MASTER +SPI2.CalculateBaudRate=32.0 MBits/s +SPI2.Direction=SPI_DIRECTION_2LINES +SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,VirtualNSS,MasterReceiverAutoSusp +SPI2.MasterReceiverAutoSusp=SPI_MASTER_RX_AUTOSUSP_ENABLE +SPI2.Mode=SPI_MODE_MASTER +SPI2.VirtualNSS=VM_NSSHARD +SPI2.VirtualType=VM_MASTER +TIM15.IPParameters=Prescaler +TIM15.Prescaler=16000-1 +VP_MEMORYMAP_VS_MEMORYMAP.Mode=CurAppReg +VP_MEMORYMAP_VS_MEMORYMAP.Signal=MEMORYMAP_VS_MEMORYMAP +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +board=custom diff --git a/AMS_Master_Code/STM32H7A3XX_FLASH.ld b/AMS_Master_Code/STM32H7A3XX_FLASH.ld index f9cbd7e..2b39280 100644 --- a/AMS_Master_Code/STM32H7A3XX_FLASH.ld +++ b/AMS_Master_Code/STM32H7A3XX_FLASH.ld @@ -1,209 +1,209 @@ -/* -****************************************************************************** -** - -** File : LinkerScript.ld -** -** Author : STM32CubeMX -** -** Abstract : Linker script for STM32H7A3RITx series -** 2048Kbytes FLASH and 1216Kbytes RAM -** -** Set heap size, stack size and stack location according -** to application requirements. -** -** Set memory bank area and size if external memory is used. -** -** Target : STMicroelectronics STM32 -** -** Distribution: The file is distributed “as is,” without any warranty -** of any kind. -** -***************************************************************************** -** @attention -** -**

© COPYRIGHT(c) 2025 STMicroelectronics

-** -** Redistribution and use in source and binary forms, with or without modification, -** are permitted provided that the following conditions are met: -** 1. Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** 3. Neither the name of STMicroelectronics nor the names of its contributors -** may be used to endorse or promote products derived from this software -** without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -** -***************************************************************************** -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -/* Highest address of the user mode stack */ -_estack = ORIGIN(DTCMRAM) + LENGTH(DTCMRAM); /* end of RAM */ -/* Generate a link error if heap and stack don't fit into RAM */ -_Min_Heap_Size = 0x200; /* required amount of heap */ -_Min_Stack_Size = 0x400; /* required amount of stack */ - -/* Specify the memory areas */ -MEMORY -{ -DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K -RAM (xrw) : ORIGIN = 0x24000000, LENGTH = 1024K -ITCMRAM (xrw) : ORIGIN = 0x00000000, LENGTH = 64K -FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 2048K -} - -/* Define output sections */ -SECTIONS -{ - /* The startup code goes first into FLASH */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data goes into FLASH */ - .text : - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - /* Constant data goes into FLASH */ - .rodata : - { - . = ALIGN(4); - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - . = ALIGN(4); - } >FLASH - - .ARM.extab (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - *(.ARM.extab* .gnu.linkonce.armextab.*) - . = ALIGN(4); - } >FLASH - - .ARM (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - . = ALIGN(4); - } >FLASH - - .preinit_array (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - . = ALIGN(4); - } >FLASH - - .init_array (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - . = ALIGN(4); - } >FLASH - - .fini_array (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ - { - . = ALIGN(4); - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT(.fini_array.*))) - KEEP (*(.fini_array*)) - PROVIDE_HIDDEN (__fini_array_end = .); - . = ALIGN(4); - } >FLASH - - /* used by the startup to initialize data */ - _sidata = LOADADDR(.data); - - /* Initialized data sections goes into RAM, load LMA copy after code */ - .data : - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - *(.RamFunc) /* .RamFunc sections */ - *(.RamFunc*) /* .RamFunc* sections */ - - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - } >DTCMRAM AT> FLASH - - - /* Uninitialized data section */ - . = ALIGN(4); - .bss : - { - /* This is used by the startup in order to initialize the .bss secion */ - _sbss = .; /* define a global symbol at bss start */ - __bss_start__ = _sbss; - *(.bss) - *(.bss*) - *(COMMON) - - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = _ebss; - } >DTCMRAM - - /* User_heap_stack section, used to check that there is enough RAM left */ - ._user_heap_stack : - { - . = ALIGN(8); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Min_Heap_Size; - . = . + _Min_Stack_Size; - . = ALIGN(8); - } >DTCMRAM - - - - /* Remove information from the standard libraries */ - /DISCARD/ : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } - -} - - +/* +****************************************************************************** +** + +** File : LinkerScript.ld +** +** Author : STM32CubeMX +** +** Abstract : Linker script for STM32H7A3RITx series +** 2048Kbytes FLASH and 1216Kbytes RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2025 STMicroelectronics

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of STMicroelectronics nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = ORIGIN(DTCMRAM) + LENGTH(DTCMRAM); /* end of RAM */ +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0x200; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ +DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K +RAM (xrw) : ORIGIN = 0x24000000, LENGTH = 1024K +ITCMRAM (xrw) : ORIGIN = 0x00000000, LENGTH = 64K +FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 2048K +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into FLASH */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data goes into FLASH */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data goes into FLASH */ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ + { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >FLASH + + .ARM (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ + { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >FLASH + + .preinit_array (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >FLASH + + .init_array (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >FLASH + + .fini_array (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */ + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >FLASH + + /* used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + *(.RamFunc) /* .RamFunc sections */ + *(.RamFunc*) /* .RamFunc* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >DTCMRAM AT> FLASH + + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >DTCMRAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >DTCMRAM + + + + /* Remove information from the standard libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + +} + +