From 76a204338d83df365bb6a7e52ae83fd927e567a1 Mon Sep 17 00:00:00 2001 From: Boris Mladenov Beslimov Date: Sun, 8 Feb 2026 16:33:51 +0100 Subject: [PATCH 1/5] fix(HardFault): Fix incorrect usage of pointer --- Core/Src/stm32h7xx_it.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/Src/stm32h7xx_it.c b/Core/Src/stm32h7xx_it.c index 2a1d6d41..b37f6274 100644 --- a/Core/Src/stm32h7xx_it.c +++ b/Core/Src/stm32h7xx_it.c @@ -148,7 +148,7 @@ void hardfault_flash_write( copy_len = (len_hard_fault - offset) > 32 ? 32 : (len_hard_fault - offset); memcpy(block, (uint8_t*)data_hard_fault + offset, copy_len); - if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, addr_hard_fault + offset, (uint32_t*)block) != HAL_OK){ + if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, addr_hard_fault + offset, block) != HAL_OK){ __BKPT(0); } offset += 32; @@ -160,7 +160,7 @@ void hardfault_flash_write( copy_len = (len_metadata - offset) > 32 ? 32 : (len_metadata - offset); memcpy(block, (uint8_t*)data_metadata + offset, copy_len); - if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, addr_metadata + offset, (uint32_t*)block) != HAL_OK){ + if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, addr_metadata + offset, block) != HAL_OK){ __BKPT(0); } offset += 32; From c3f6879e75efeeed4d941308dc13b0745e880d04 Mon Sep 17 00:00:00 2001 From: Boris Mladenov Beslimov Date: Sun, 8 Feb 2026 16:39:47 +0100 Subject: [PATCH 2/5] feat(spi+dma): Remove spi and some dma things from runes, etc. --- Core/Src/Runes/Runes.cpp | 37 +---- Core/Src/stm32h7xx_hal_msp.c | 283 ----------------------------------- Core/Src/stm32h7xx_it.c | 135 +---------------- 3 files changed, 9 insertions(+), 446 deletions(-) diff --git a/Core/Src/Runes/Runes.cpp b/Core/Src/Runes/Runes.cpp index d43f1d8d..eb79b1f4 100644 --- a/Core/Src/Runes/Runes.cpp +++ b/Core/Src/Runes/Runes.cpp @@ -3,8 +3,6 @@ DMA_HandleTypeDef hdma_adc1; DMA_HandleTypeDef hdma_adc2; DMA_HandleTypeDef hdma_adc3; -DMA_HandleTypeDef hdma_spi3_rx; -DMA_HandleTypeDef hdma_spi3_tx; DMA_HandleTypeDef hdma_i2c2_rx; DMA_HandleTypeDef hdma_i2c2_tx; DMA_HandleTypeDef hdma_fmac_preload; @@ -33,7 +31,6 @@ extern TIM_HandleTypeDef htim24; UART_HandleTypeDef huart1; UART_HandleTypeDef huart2; UART_HandleTypeDef huart3; -SPI_HandleTypeDef hspi3; FDCAN_HandleTypeDef hfdcan1; FMAC_HandleTypeDef hfmac; @@ -63,29 +60,6 @@ unordered_map FDCAN::handle_to_fdcan = { #endif -/************************************************ - * Communication-SPI - ***********************************************/ -#ifdef HAL_SPI_MODULE_ENABLED - -SPI::Instance SPI::instance3 = { - .SCK = &PC10, - .MOSI = &PC12, - .MISO = &PC11, - .SS = &PD3, - .hspi = &hspi3, - .instance = SPI3, - .hdma_tx = DMA::Stream::DMA1Stream5, - .hdma_rx = DMA::Stream::DMA1Stream6, - .baud_rate_prescaler = SPI_BAUDRATEPRESCALER_256, - .mode = SPI_MODE_MASTER, - .use_DMA = false}; - -SPI::Peripheral SPI::spi3 = SPI::Peripheral::peripheral3; - -unordered_map SPI::available_spi = { - {SPI::spi3, &SPI::instance3}}; -#endif /************************************************ * Communication-UART ***********************************************/ @@ -221,13 +195,16 @@ vector channels1 = {}; vector channels2 = {}; vector channels3 = {}; +ST_LIB::DMA_Domain::Instance dma_adc1 = {hdma_adc1}; +ST_LIB::DMA_Domain::Instance dma_adc2 = {hdma_adc2}; +ST_LIB::DMA_Domain::Instance dma_adc3 = {hdma_adc3}; + ADC::InitData init_data1(ADC1, ADC_RESOLUTION_16B, ADC_EXTERNALTRIG_LPTIM1_OUT, - channels1, DMA::Stream::DMA1Stream0, "ADC 1"); + channels1, &dma_adc1, "ADC 1"); ADC::InitData init_data2(ADC2, ADC_RESOLUTION_16B, ADC_EXTERNALTRIG_LPTIM2_OUT, - channels2, DMA::Stream::DMA1Stream1, "ADC 2"); + channels2, &dma_adc2, "ADC 2"); ADC::InitData init_data3(ADC3, ADC_RESOLUTION_12B, ADC_EXTERNALTRIG_LPTIM3_OUT, - channels3, DMA::Stream::DMA1Stream2, "ADC 3"); - + channels3, &dma_adc3, "ADC 3"); ADC::Peripheral ADC::peripherals[3] = { ADC::Peripheral(&hadc1, lptim1, init_data1), ADC::Peripheral(&hadc2, lptim2, init_data2), diff --git a/Core/Src/stm32h7xx_hal_msp.c b/Core/Src/stm32h7xx_hal_msp.c index efca5492..6986705f 100644 --- a/Core/Src/stm32h7xx_hal_msp.c +++ b/Core/Src/stm32h7xx_hal_msp.c @@ -37,9 +37,6 @@ extern DMA_HandleTypeDef hdma_fmac_preload; extern DMA_HandleTypeDef hdma_fmac_read; extern DMA_HandleTypeDef hdma_fmac_write; -extern DMA_HandleTypeDef hdma_spi3_rx; - -extern DMA_HandleTypeDef hdma_spi3_tx; /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN TD */ @@ -967,286 +964,6 @@ void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc) } -/** -* @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==SPI3) - { - /* USER CODE BEGIN SPI3_MspInit 0 */ - - /* USER CODE END SPI3_MspInit 0 */ - - /** Initializes the peripherals clock - */ - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SPI3; - PeriphClkInitStruct.Spi123ClockSelection = RCC_SPI123CLKSOURCE_PLL; - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) - { - Error_Handler(); - } - - /* Peripheral clock enable */ - __HAL_RCC_SPI3_CLK_ENABLE(); - - __HAL_RCC_GPIOC_CLK_ENABLE(); - /**SPI3 GPIO Configuration - PC10 ------> SPI3_SCK - PC11 ------> SPI3_MISO - PC12 ------> SPI3_MOSI - */ - GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF6_SPI3; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - /* SPI3 DMA Init */ - /* SPI3_RX Init */ - hdma_spi3_rx.Instance = DMA1_Stream5; - hdma_spi3_rx.Init.Request = DMA_REQUEST_SPI3_RX; - hdma_spi3_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; - hdma_spi3_rx.Init.PeriphInc = DMA_PINC_DISABLE; - hdma_spi3_rx.Init.MemInc = DMA_MINC_ENABLE; - hdma_spi3_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; - hdma_spi3_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; - hdma_spi3_rx.Init.Mode = DMA_NORMAL; - hdma_spi3_rx.Init.Priority = DMA_PRIORITY_LOW; - hdma_spi3_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; - hdma_spi3_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; - if (HAL_DMA_Init(&hdma_spi3_rx) != HAL_OK) - { - Error_Handler(); - } - - __HAL_LINKDMA(hspi,hdmarx,hdma_spi3_rx); - - /* SPI3_TX Init */ - hdma_spi3_tx.Instance = DMA1_Stream6; - hdma_spi3_tx.Init.Request = DMA_REQUEST_SPI3_TX; - hdma_spi3_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; - hdma_spi3_tx.Init.PeriphInc = DMA_PINC_DISABLE; - hdma_spi3_tx.Init.MemInc = DMA_MINC_ENABLE; - hdma_spi3_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; - hdma_spi3_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; - hdma_spi3_tx.Init.Mode = DMA_NORMAL; - hdma_spi3_tx.Init.Priority = DMA_PRIORITY_LOW; - hdma_spi3_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; - hdma_spi3_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; - if (HAL_DMA_Init(&hdma_spi3_tx) != HAL_OK) - { - Error_Handler(); - } - - __HAL_LINKDMA(hspi,hdmatx,hdma_spi3_tx); - - /* SPI3 interrupt Init */ - HAL_NVIC_SetPriority(SPI3_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(SPI3_IRQn); - /* USER CODE BEGIN SPI3_MspInit 1 */ - /* USER CODE END SPI3_MspInit 1 */ - } - -} - -/** -* @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==SPI3) - { - /* USER CODE BEGIN SPI3_MspDeInit 0 */ - - /* USER CODE END SPI3_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_SPI3_CLK_DISABLE(); - - /**SPI3 GPIO Configuration - PC10 ------> SPI3_SCK - PC11 ------> SPI3_MISO - PC12 ------> SPI3_MOSI - */ - HAL_GPIO_DeInit(GPIOC, GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12); - - /* SPI3 DMA DeInit */ - HAL_DMA_DeInit(hspi->hdmarx); - HAL_DMA_DeInit(hspi->hdmatx); - - /* SPI3 interrupt DeInit */ - HAL_NVIC_DisableIRQ(SPI3_IRQn); - /* USER CODE BEGIN SPI3_MspDeInit 1 */ - - /* USER CODE END SPI3_MspDeInit 1 */ - } - -} - -/** -* @brief TIM_PWM MSP Initialization -* This function configures the hardware resources used in this example -* @param htim_pwm: TIM_PWM handle pointer -* @retval None -*/ -void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm) -{ - if(htim_pwm->Instance==TIM1) - { - /* USER CODE BEGIN TIM1_MspInit 0 */ - - /* USER CODE END TIM1_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_TIM1_CLK_ENABLE(); - /* USER CODE BEGIN TIM1_MspInit 1 */ - - /* USER CODE END TIM1_MspInit 1 */ - } - else if(htim_pwm->Instance==TIM3) - { - /* USER CODE BEGIN TIM3_MspInit 0 */ - - /* USER CODE END TIM3_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_TIM3_CLK_ENABLE(); - /* USER CODE BEGIN TIM3_MspInit 1 */ - - /* USER CODE END TIM3_MspInit 1 */ - } - else if(htim_pwm->Instance==TIM4) - { - /* USER CODE BEGIN TIM4_MspInit 0 */ - - /* USER CODE END TIM4_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_TIM4_CLK_ENABLE(); - /* USER CODE BEGIN TIM4_MspInit 1 */ - - /* USER CODE END TIM4_MspInit 1 */ - } - else if(htim_pwm->Instance==TIM12) - { - /* USER CODE BEGIN TIM12_MspInit 0 */ - - /* USER CODE END TIM12_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_TIM12_CLK_ENABLE(); - /* USER CODE BEGIN TIM12_MspInit 1 */ - - /* USER CODE END TIM12_MspInit 1 */ - } - else if(htim_pwm->Instance==TIM15) - { - /* USER CODE BEGIN TIM15_MspInit 0 */ - - /* USER CODE END TIM15_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_TIM15_CLK_ENABLE(); - /* USER CODE BEGIN TIM15_MspInit 1 */ - - /* USER CODE END TIM15_MspInit 1 */ - } - -} - -/** -* @brief TIM_Base MSP Initialization -* This function configures the hardware resources used in this example -* @param htim_base: TIM_Base handle pointer -* @retval None -*/ -void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) -{ - if(htim_base->Instance==TIM2) - { - /* USER CODE BEGIN TIM2_MspInit 0 */ - - /* USER CODE END TIM2_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_TIM2_CLK_ENABLE(); - /* TIM2 interrupt Init */ - HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(TIM2_IRQn); - /* USER CODE BEGIN TIM2_MspInit 1 */ - - /* USER CODE END TIM2_MspInit 1 */ - } - else if(htim_base->Instance==TIM5) - { - /* USER CODE BEGIN TIM5_MspInit 0 */ - - /* USER CODE END TIM5_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_TIM5_CLK_ENABLE(); - /* TIM5 interrupt Init */ - HAL_NVIC_SetPriority(TIM5_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(TIM5_IRQn); - /* USER CODE BEGIN TIM5_MspInit 1 */ - - /* USER CODE END TIM5_MspInit 1 */ - } - else if(htim_base->Instance==TIM7) - { - /* USER CODE BEGIN TIM7_MspInit 0 */ - - /* USER CODE END TIM7_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_TIM7_CLK_ENABLE(); - /* TIM7 interrupt Init */ - HAL_NVIC_SetPriority(TIM7_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(TIM7_IRQn); - /* USER CODE BEGIN TIM7_MspInit 1 */ - - /* USER CODE END TIM7_MspInit 1 */ - } - else if(htim_base->Instance==TIM16) - { - /* USER CODE BEGIN TIM16_MspInit 0 */ - - /* USER CODE END TIM16_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_TIM16_CLK_ENABLE(); - /* USER CODE BEGIN TIM16_MspInit 1 */ - - /* USER CODE END TIM16_MspInit 1 */ - } - else if(htim_base->Instance==TIM17) - { - /* USER CODE BEGIN TIM17_MspInit 0 */ - - /* USER CODE END TIM17_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_TIM17_CLK_ENABLE(); - /* USER CODE BEGIN TIM17_MspInit 1 */ - - /* USER CODE END TIM17_MspInit 1 */ - } - else if(htim_base->Instance==TIM24) - { - /* USER CODE BEGIN TIM24_MspInit 0 */ - - /* USER CODE END TIM24_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_TIM24_CLK_ENABLE(); - /* TIM24 interrupt Init */ - HAL_NVIC_SetPriority(TIM24_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(TIM24_IRQn); - /* USER CODE BEGIN TIM24_MspInit 1 */ - - /* USER CODE END TIM24_MspInit 1 */ - } - -} - /** * @brief TIM_Encoder MSP Initialization * This function configures the hardware resources used in this example diff --git a/Core/Src/stm32h7xx_it.c b/Core/Src/stm32h7xx_it.c index b37f6274..eca63f96 100644 --- a/Core/Src/stm32h7xx_it.c +++ b/Core/Src/stm32h7xx_it.c @@ -71,9 +71,6 @@ extern FMAC_HandleTypeDef hfmac; extern LPTIM_HandleTypeDef hlptim1; extern LPTIM_HandleTypeDef hlptim2; extern LPTIM_HandleTypeDef hlptim3; -extern DMA_HandleTypeDef hdma_spi3_rx; -extern DMA_HandleTypeDef hdma_spi3_tx; -extern SPI_HandleTypeDef hspi3; extern FDCAN_HandleTypeDef hfdcan1; /* Externs for calltrace @@ -148,7 +145,7 @@ void hardfault_flash_write( copy_len = (len_hard_fault - offset) > 32 ? 32 : (len_hard_fault - offset); memcpy(block, (uint8_t*)data_hard_fault + offset, copy_len); - if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, addr_hard_fault + offset, block) != HAL_OK){ + if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, addr_hard_fault + offset, (uintptr_t) block) != HAL_OK){ __BKPT(0); } offset += 32; @@ -160,7 +157,7 @@ void hardfault_flash_write( copy_len = (len_metadata - offset) > 32 ? 32 : (len_metadata - offset); memcpy(block, (uint8_t*)data_metadata + offset, copy_len); - if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, addr_metadata + offset, block) != HAL_OK){ + if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, addr_metadata + offset, (uintptr_t) block) != HAL_OK){ __BKPT(0); } offset += 32; @@ -438,139 +435,11 @@ void EXTI1_IRQHandler(void) /* USER CODE END EXTI1_IRQn 1 */ } -/** - * @brief This function handles DMA1 stream0 global interrupt. - */ -void DMA1_Stream0_IRQHandler(void) -{ - /* USER CODE BEGIN DMA1_Stream0_IRQn 0 */ - - /* USER CODE END DMA1_Stream0_IRQn 0 */ - HAL_DMA_IRQHandler(&hdma_adc1); - /* USER CODE BEGIN DMA1_Stream0_IRQn 1 */ - - /* USER CODE END DMA1_Stream0_IRQn 1 */ -} - -/** - * @brief This function handles DMA1 stream1 global interrupt. - */ -void DMA1_Stream1_IRQHandler(void) -{ - /* USER CODE BEGIN DMA1_Stream1_IRQn 0 */ - - /* USER CODE END DMA1_Stream1_IRQn 0 */ - HAL_DMA_IRQHandler(&hdma_adc2); - /* USER CODE BEGIN DMA1_Stream1_IRQn 1 */ - - /* USER CODE END DMA1_Stream1_IRQn 1 */ -} - -/** - * @brief This function handles DMA1 stream2 global interrupt. - */ -void DMA1_Stream2_IRQHandler(void) -{ - /* USER CODE BEGIN DMA1_Stream2_IRQn 0 */ - - /* USER CODE END DMA1_Stream2_IRQn 0 */ - HAL_DMA_IRQHandler(&hdma_adc3); - /* USER CODE BEGIN DMA1_Stream2_IRQn 1 */ - - /* USER CODE END DMA1_Stream2_IRQn 1 */ -} - -/** - * @brief This function handles DMA1 stream3 global interrupt. - */ -void DMA1_Stream3_IRQHandler(void) -{ - /* USER CODE BEGIN DMA1_Stream3_IRQn 0 */ - - /* USER CODE END DMA1_Stream3_IRQn 0 */ - HAL_DMA_IRQHandler(&hdma_i2c2_rx); - /* USER CODE BEGIN DMA1_Stream3_IRQn 1 */ - - /* USER CODE END DMA1_Stream3_IRQn 1 */ -} - -/** - * @brief This function handles DMA1 stream4 global interrupt. - */ -void DMA1_Stream4_IRQHandler(void) -{ - /* USER CODE BEGIN DMA1_Stream4_IRQn 0 */ - - /* USER CODE END DMA1_Stream4_IRQn 0 */ - HAL_DMA_IRQHandler(&hdma_i2c2_tx); - /* USER CODE BEGIN DMA1_Stream4_IRQn 1 */ - - /* USER CODE END DMA1_Stream4_IRQn 1 */ -} - -/** - * @brief This function handles DMA1 stream5 global interrupt. - */ -void DMA1_Stream5_IRQHandler(void) -{ - /* USER CODE BEGIN DMA1_Stream5_IRQn 0 */ - - /* USER CODE END DMA1_Stream5_IRQn 0 */ - HAL_DMA_IRQHandler(&hdma_spi3_rx); - /* USER CODE BEGIN DMA1_Stream5_IRQn 1 */ - - /* USER CODE END DMA1_Stream5_IRQn 1 */ -} - -/** - * @brief This function handles DMA1 stream6 global interrupt. - */ -void DMA1_Stream6_IRQHandler(void) -{ - /* USER CODE BEGIN DMA1_Stream6_IRQn 0 */ - - /* USER CODE END DMA1_Stream6_IRQn 0 */ - HAL_DMA_IRQHandler(&hdma_spi3_tx); - /* USER CODE BEGIN DMA1_Stream6_IRQn 1 */ - - /* USER CODE END DMA1_Stream6_IRQn 1 */ -} - - /** @brief DMA fmac configuration (hardcoded the handler, this normally is generated by the IDE) - */ -void DMA2_Stream0_IRQHandler(void) -{ - HAL_DMA_IRQHandler(&hdma_fmac_preload); -} - -void DMA2_Stream1_IRQHandler(void) -{ - HAL_DMA_IRQHandler(&hdma_fmac_write); -} - -void DMA2_Stream2_IRQHandler(void) -{ - HAL_DMA_IRQHandler(&hdma_fmac_read); -} - void FMAC_IRQHandler(void) { HAL_FMAC_IRQHandler(&hfmac); } -/** - * @brief This function handles SPI3 global interrupt. - */ -void SPI3_IRQHandler(void) -{ - /* USER CODE BEGIN SPI3_IRQn 0 */ - - /* USER CODE END SPI3_IRQn 0 */ - HAL_SPI_IRQHandler(&hspi3); - /* USER CODE BEGIN SPI3_IRQn 1 */ - - /* USER CODE END SPI3_IRQn 1 */ -} /** * @brief This function handles Ethernet global interrupt. From b4312d14e8cf1d7c6e6f7abce6a4aee8ec5c8a18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20S=C3=A1ez?= Date: Sat, 14 Feb 2026 12:39:50 +0100 Subject: [PATCH 3/5] fix(spi): declare SPI3 DMA handles in MSP --- Core/Src/stm32h7xx_hal_msp.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Core/Src/stm32h7xx_hal_msp.c b/Core/Src/stm32h7xx_hal_msp.c index 4c38dcf0..a45f4a0b 100644 --- a/Core/Src/stm32h7xx_hal_msp.c +++ b/Core/Src/stm32h7xx_hal_msp.c @@ -30,6 +30,8 @@ extern DMA_HandleTypeDef hdma_i2c2_tx; extern DMA_HandleTypeDef hdma_fmac_preload; extern DMA_HandleTypeDef hdma_fmac_read; extern DMA_HandleTypeDef hdma_fmac_write; +extern DMA_HandleTypeDef hdma_spi3_rx; +extern DMA_HandleTypeDef hdma_spi3_tx; /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN TD */ From 789fb943c997768c24472eece39038c10b4193ba Mon Sep 17 00:00:00 2001 From: Boris Mladenov Beslimov Date: Sun, 8 Feb 2026 16:33:51 +0100 Subject: [PATCH 4/5] fix(HardFault): Fix incorrect usage of pointer --- Core/Src/stm32h7xx_it.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/Core/Src/stm32h7xx_it.c b/Core/Src/stm32h7xx_it.c index 38c577a4..747854c2 100644 --- a/Core/Src/stm32h7xx_it.c +++ b/Core/Src/stm32h7xx_it.c @@ -148,11 +148,8 @@ void hardfault_flash_write( copy_len = (len_hard_fault - offset) > 32 ? 32 : (len_hard_fault - offset); memcpy(block, (uint8_t*)data_hard_fault + offset, copy_len); - if (HAL_FLASH_Program( - FLASH_TYPEPROGRAM_FLASHWORD, - addr_hard_fault + offset, - (uint32_t*)block - ) != HAL_OK) { + if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, addr_hard_fault + offset, block) != + HAL_OK) { __BKPT(0); } offset += 32; @@ -164,11 +161,8 @@ void hardfault_flash_write( copy_len = (len_metadata - offset) > 32 ? 32 : (len_metadata - offset); memcpy(block, (uint8_t*)data_metadata + offset, copy_len); - if (HAL_FLASH_Program( - FLASH_TYPEPROGRAM_FLASHWORD, - addr_metadata + offset, - (uint32_t*)block - ) != HAL_OK) { + if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, addr_metadata + offset, block) != + HAL_OK) { __BKPT(0); } offset += 32; From 18da723bc2b7285cc511a27d6b9305f7bdecc3bc Mon Sep 17 00:00:00 2001 From: Boris Mladenov Beslimov Date: Sat, 14 Feb 2026 12:54:04 +0100 Subject: [PATCH 5/5] feat(spi+dma): Remove spi and some dma things from runes, etc. --- Core/Src/Runes/Runes.cpp | 60 +++------------- Core/Src/stm32h7xx_hal_msp.c | 125 ++------------------------------- Core/Src/stm32h7xx_it.c | 129 +++-------------------------------- 3 files changed, 24 insertions(+), 290 deletions(-) diff --git a/Core/Src/Runes/Runes.cpp b/Core/Src/Runes/Runes.cpp index 2712d466..8cb788bf 100644 --- a/Core/Src/Runes/Runes.cpp +++ b/Core/Src/Runes/Runes.cpp @@ -3,8 +3,6 @@ DMA_HandleTypeDef hdma_adc1; DMA_HandleTypeDef hdma_adc2; DMA_HandleTypeDef hdma_adc3; -DMA_HandleTypeDef hdma_spi3_rx; -DMA_HandleTypeDef hdma_spi3_tx; DMA_HandleTypeDef hdma_i2c2_rx; DMA_HandleTypeDef hdma_i2c2_tx; DMA_HandleTypeDef hdma_fmac_preload; @@ -33,7 +31,6 @@ extern TIM_HandleTypeDef htim24; UART_HandleTypeDef huart1; UART_HandleTypeDef huart2; UART_HandleTypeDef huart3; -SPI_HandleTypeDef hspi3; FDCAN_HandleTypeDef hfdcan1; FMAC_HandleTypeDef hfmac; @@ -67,29 +64,6 @@ unordered_map FDCAN::handle_to_fdcan = { #endif -/************************************************ - * Communication-SPI - ***********************************************/ -#ifdef HAL_SPI_MODULE_ENABLED - -SPI::Instance SPI::instance3 = { - .SCK = &PC10, - .MOSI = &PC12, - .MISO = &PC11, - .SS = &PD3, - .hspi = &hspi3, - .instance = SPI3, - .hdma_tx = DMA::Stream::DMA1Stream5, - .hdma_rx = DMA::Stream::DMA1Stream6, - .baud_rate_prescaler = SPI_BAUDRATEPRESCALER_256, - .mode = SPI_MODE_MASTER, - .use_DMA = false -}; - -SPI::Peripheral SPI::spi3 = SPI::Peripheral::peripheral3; - -unordered_map SPI::available_spi = {{SPI::spi3, &SPI::instance3}}; -#endif /************************************************ * Communication-UART ***********************************************/ @@ -225,30 +199,16 @@ vector channels1 = {}; vector channels2 = {}; vector channels3 = {}; -ADC::InitData init_data1( - ADC1, - ADC_RESOLUTION_16B, - ADC_EXTERNALTRIG_LPTIM1_OUT, - channels1, - DMA::Stream::DMA1Stream0, - "ADC 1" -); -ADC::InitData init_data2( - ADC2, - ADC_RESOLUTION_16B, - ADC_EXTERNALTRIG_LPTIM2_OUT, - channels2, - DMA::Stream::DMA1Stream1, - "ADC 2" -); -ADC::InitData init_data3( - ADC3, - ADC_RESOLUTION_12B, - ADC_EXTERNALTRIG_LPTIM3_OUT, - channels3, - DMA::Stream::DMA1Stream2, - "ADC 3" -); +ST_LIB::DMA_Domain::Instance dma_adc1 = {hdma_adc1}; +ST_LIB::DMA_Domain::Instance dma_adc2 = {hdma_adc2}; +ST_LIB::DMA_Domain::Instance dma_adc3 = {hdma_adc3}; + +ADC::InitData init_data1(ADC1, ADC_RESOLUTION_16B, ADC_EXTERNALTRIG_LPTIM1_OUT, + channels1, &dma_adc1, "ADC 1"); +ADC::InitData init_data2(ADC2, ADC_RESOLUTION_16B, ADC_EXTERNALTRIG_LPTIM2_OUT, + channels2, &dma_adc2, "ADC 2"); +ADC::InitData init_data3(ADC3, ADC_RESOLUTION_12B, ADC_EXTERNALTRIG_LPTIM3_OUT, + channels3, &dma_adc3, "ADC 3"); ADC::Peripheral ADC::peripherals[3] = { ADC::Peripheral(&hadc1, lptim1, init_data1), diff --git a/Core/Src/stm32h7xx_hal_msp.c b/Core/Src/stm32h7xx_hal_msp.c index a45f4a0b..cef8bd4b 100644 --- a/Core/Src/stm32h7xx_hal_msp.c +++ b/Core/Src/stm32h7xx_hal_msp.c @@ -30,8 +30,6 @@ extern DMA_HandleTypeDef hdma_i2c2_tx; extern DMA_HandleTypeDef hdma_fmac_preload; extern DMA_HandleTypeDef hdma_fmac_read; extern DMA_HandleTypeDef hdma_fmac_write; -extern DMA_HandleTypeDef hdma_spi3_rx; -extern DMA_HandleTypeDef hdma_spi3_tx; /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN TD */ @@ -642,125 +640,10 @@ void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc) { } } -/** - * @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 == SPI3) { - /* USER CODE BEGIN SPI3_MspInit 0 */ - - /* USER CODE END SPI3_MspInit 0 */ - - /** Initializes the peripherals clock - */ - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SPI3; - PeriphClkInitStruct.Spi123ClockSelection = RCC_SPI123CLKSOURCE_PLL; - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { - Error_Handler(); - } - - /* Peripheral clock enable */ - __HAL_RCC_SPI3_CLK_ENABLE(); - - __HAL_RCC_GPIOC_CLK_ENABLE(); - /**SPI3 GPIO Configuration - PC10 ------> SPI3_SCK - PC11 ------> SPI3_MISO - PC12 ------> SPI3_MOSI - */ - GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF6_SPI3; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - /* SPI3 DMA Init */ - /* SPI3_RX Init */ - hdma_spi3_rx.Instance = DMA1_Stream5; - hdma_spi3_rx.Init.Request = DMA_REQUEST_SPI3_RX; - hdma_spi3_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; - hdma_spi3_rx.Init.PeriphInc = DMA_PINC_DISABLE; - hdma_spi3_rx.Init.MemInc = DMA_MINC_ENABLE; - hdma_spi3_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; - hdma_spi3_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; - hdma_spi3_rx.Init.Mode = DMA_NORMAL; - hdma_spi3_rx.Init.Priority = DMA_PRIORITY_LOW; - hdma_spi3_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; - hdma_spi3_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; - if (HAL_DMA_Init(&hdma_spi3_rx) != HAL_OK) { - Error_Handler(); - } - - __HAL_LINKDMA(hspi, hdmarx, hdma_spi3_rx); - - /* SPI3_TX Init */ - hdma_spi3_tx.Instance = DMA1_Stream6; - hdma_spi3_tx.Init.Request = DMA_REQUEST_SPI3_TX; - hdma_spi3_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; - hdma_spi3_tx.Init.PeriphInc = DMA_PINC_DISABLE; - hdma_spi3_tx.Init.MemInc = DMA_MINC_ENABLE; - hdma_spi3_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; - hdma_spi3_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; - hdma_spi3_tx.Init.Mode = DMA_NORMAL; - hdma_spi3_tx.Init.Priority = DMA_PRIORITY_LOW; - hdma_spi3_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; - hdma_spi3_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; - if (HAL_DMA_Init(&hdma_spi3_tx) != HAL_OK) { - Error_Handler(); - } - - __HAL_LINKDMA(hspi, hdmatx, hdma_spi3_tx); - - /* SPI3 interrupt Init */ - HAL_NVIC_SetPriority(SPI3_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(SPI3_IRQn); - /* USER CODE BEGIN SPI3_MspInit 1 */ - /* USER CODE END SPI3_MspInit 1 */ - } -} - -/** - * @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 == SPI3) { - /* USER CODE BEGIN SPI3_MspDeInit 0 */ - - /* USER CODE END SPI3_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_SPI3_CLK_DISABLE(); - - /**SPI3 GPIO Configuration - PC10 ------> SPI3_SCK - PC11 ------> SPI3_MISO - PC12 ------> SPI3_MOSI - */ - HAL_GPIO_DeInit(GPIOC, GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12); - - /* SPI3 DMA DeInit */ - HAL_DMA_DeInit(hspi->hdmarx); - HAL_DMA_DeInit(hspi->hdmatx); - - /* SPI3 interrupt DeInit */ - HAL_NVIC_DisableIRQ(SPI3_IRQn); - /* USER CODE BEGIN SPI3_MspDeInit 1 */ - - /* USER CODE END SPI3_MspDeInit 1 */ - } -} - -/** - * @brief TIM_PWM MSP Initialization - * This function configures the hardware resources used in this example +/** + * @brief TIM_PWM MSP Initialization + * This function configures the hardware resources used in + * this example * @param htim_pwm: TIM_PWM handle pointer * @retval None */ diff --git a/Core/Src/stm32h7xx_it.c b/Core/Src/stm32h7xx_it.c index 747854c2..3e6ae149 100644 --- a/Core/Src/stm32h7xx_it.c +++ b/Core/Src/stm32h7xx_it.c @@ -71,9 +71,6 @@ extern FMAC_HandleTypeDef hfmac; extern LPTIM_HandleTypeDef hlptim1; extern LPTIM_HandleTypeDef hlptim2; extern LPTIM_HandleTypeDef hlptim3; -extern DMA_HandleTypeDef hdma_spi3_rx; -extern DMA_HandleTypeDef hdma_spi3_tx; -extern SPI_HandleTypeDef hspi3; extern FDCAN_HandleTypeDef hfdcan1; /* Externs for calltrace @@ -148,8 +145,11 @@ void hardfault_flash_write( copy_len = (len_hard_fault - offset) > 32 ? 32 : (len_hard_fault - offset); memcpy(block, (uint8_t*)data_hard_fault + offset, copy_len); - if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, addr_hard_fault + offset, block) != - HAL_OK) { + if (HAL_FLASH_Program( + FLASH_TYPEPROGRAM_FLASHWORD, + addr_hard_fault + offset, + (uintptr_t)block + ) != HAL_OK) { __BKPT(0); } offset += 32; @@ -161,8 +161,11 @@ void hardfault_flash_write( copy_len = (len_metadata - offset) > 32 ? 32 : (len_metadata - offset); memcpy(block, (uint8_t*)data_metadata + offset, copy_len); - if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, addr_metadata + offset, block) != - HAL_OK) { + if (HAL_FLASH_Program( + FLASH_TYPEPROGRAM_FLASHWORD, + addr_metadata + offset, + (uintptr_t)block + ) != HAL_OK) { __BKPT(0); } offset += 32; @@ -430,120 +433,8 @@ void EXTI1_IRQHandler(void) { /* USER CODE END EXTI1_IRQn 1 */ } -/** - * @brief This function handles DMA1 stream0 global interrupt. - */ -void DMA1_Stream0_IRQHandler(void) { - /* USER CODE BEGIN DMA1_Stream0_IRQn 0 */ - - /* USER CODE END DMA1_Stream0_IRQn 0 */ - HAL_DMA_IRQHandler(&hdma_adc1); - /* USER CODE BEGIN DMA1_Stream0_IRQn 1 */ - - /* USER CODE END DMA1_Stream0_IRQn 1 */ -} - -/** - * @brief This function handles DMA1 stream1 global interrupt. - */ -void DMA1_Stream1_IRQHandler(void) { - /* USER CODE BEGIN DMA1_Stream1_IRQn 0 */ - - /* USER CODE END DMA1_Stream1_IRQn 0 */ - HAL_DMA_IRQHandler(&hdma_adc2); - /* USER CODE BEGIN DMA1_Stream1_IRQn 1 */ - - /* USER CODE END DMA1_Stream1_IRQn 1 */ -} - -/** - * @brief This function handles DMA1 stream2 global interrupt. - */ -void DMA1_Stream2_IRQHandler(void) { - /* USER CODE BEGIN DMA1_Stream2_IRQn 0 */ - - /* USER CODE END DMA1_Stream2_IRQn 0 */ - HAL_DMA_IRQHandler(&hdma_adc3); - /* USER CODE BEGIN DMA1_Stream2_IRQn 1 */ - - /* USER CODE END DMA1_Stream2_IRQn 1 */ -} - -/** - * @brief This function handles DMA1 stream3 global interrupt. - */ -void DMA1_Stream3_IRQHandler(void) { - /* USER CODE BEGIN DMA1_Stream3_IRQn 0 */ - - /* USER CODE END DMA1_Stream3_IRQn 0 */ - HAL_DMA_IRQHandler(&hdma_i2c2_rx); - /* USER CODE BEGIN DMA1_Stream3_IRQn 1 */ - - /* USER CODE END DMA1_Stream3_IRQn 1 */ -} - -/** - * @brief This function handles DMA1 stream4 global interrupt. - */ -void DMA1_Stream4_IRQHandler(void) { - /* USER CODE BEGIN DMA1_Stream4_IRQn 0 */ - - /* USER CODE END DMA1_Stream4_IRQn 0 */ - HAL_DMA_IRQHandler(&hdma_i2c2_tx); - /* USER CODE BEGIN DMA1_Stream4_IRQn 1 */ - - /* USER CODE END DMA1_Stream4_IRQn 1 */ -} - -/** - * @brief This function handles DMA1 stream5 global interrupt. - */ -void DMA1_Stream5_IRQHandler(void) { - /* USER CODE BEGIN DMA1_Stream5_IRQn 0 */ - - /* USER CODE END DMA1_Stream5_IRQn 0 */ - HAL_DMA_IRQHandler(&hdma_spi3_rx); - /* USER CODE BEGIN DMA1_Stream5_IRQn 1 */ - - /* USER CODE END DMA1_Stream5_IRQn 1 */ -} - -/** - * @brief This function handles DMA1 stream6 global interrupt. - */ -void DMA1_Stream6_IRQHandler(void) { - /* USER CODE BEGIN DMA1_Stream6_IRQn 0 */ - - /* USER CODE END DMA1_Stream6_IRQn 0 */ - HAL_DMA_IRQHandler(&hdma_spi3_tx); - /* USER CODE BEGIN DMA1_Stream6_IRQn 1 */ - - /* USER CODE END DMA1_Stream6_IRQn 1 */ -} - -/** @brief DMA fmac configuration (hardcoded the handler, this normally is generated by the IDE) - */ -void DMA2_Stream0_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma_fmac_preload); } - -void DMA2_Stream1_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma_fmac_write); } - -void DMA2_Stream2_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma_fmac_read); } - void FMAC_IRQHandler(void) { HAL_FMAC_IRQHandler(&hfmac); } -/** - * @brief This function handles SPI3 global interrupt. - */ -void SPI3_IRQHandler(void) { - /* USER CODE BEGIN SPI3_IRQn 0 */ - - /* USER CODE END SPI3_IRQn 0 */ - HAL_SPI_IRQHandler(&hspi3); - /* USER CODE BEGIN SPI3_IRQn 1 */ - - /* USER CODE END SPI3_IRQn 1 */ -} - /** * @brief This function handles Ethernet global interrupt. */