diff --git a/src/main/drivers/transponder_ir.h b/src/main/drivers/transponder_ir.h index 0a5df8c880..fc403ebc42 100644 --- a/src/main/drivers/transponder_ir.h +++ b/src/main/drivers/transponder_ir.h @@ -80,7 +80,7 @@ uint8_t erlt[TRANSPONDER_DMA_BUFFER_SIZE_ERLT]; // 91-200 } transponderIrDMABuffer_t; -#elif defined(STM32F4) || defined(STM32F7) +#elif defined(STM32F4) || defined(STM32F7) || defined(STM32H7) typedef union transponderIrDMABuffer_s { uint32_t arcitimer[TRANSPONDER_DMA_BUFFER_SIZE_ARCITIMER]; // 620 @@ -96,7 +96,7 @@ typedef struct transponder_s { uint16_t bitToggleOne; uint32_t dma_buffer_size; - #if defined(STM32F3) || defined(STM32F4)|| defined(STM32F7) || defined(UNIT_TEST) + #if defined(STM32F3) || defined(STM32F4)|| defined(STM32F7) || defined(STM32H7) || defined(UNIT_TEST) transponderIrDMABuffer_t transponderIrDMABuffer; #endif diff --git a/src/main/drivers/transponder_ir_arcitimer.c b/src/main/drivers/transponder_ir_arcitimer.c index d4704858af..6e80e217e1 100644 --- a/src/main/drivers/transponder_ir_arcitimer.c +++ b/src/main/drivers/transponder_ir_arcitimer.c @@ -29,7 +29,7 @@ #include "drivers/transponder_ir.h" #include "drivers/transponder_ir_arcitimer.h" -#if defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(UNIT_TEST) +#if defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32H7) || defined(UNIT_TEST) extern const struct transponderVTable arcitimerTansponderVTable; static uint16_t dmaBufferOffset; diff --git a/src/main/drivers/transponder_ir_erlt.c b/src/main/drivers/transponder_ir_erlt.c index 769f5277c9..e226a69e9b 100644 --- a/src/main/drivers/transponder_ir_erlt.c +++ b/src/main/drivers/transponder_ir_erlt.c @@ -28,7 +28,7 @@ #include "drivers/transponder_ir.h" #include "drivers/transponder_ir_erlt.h" -#if defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(UNIT_TEST) +#if defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32H7) || defined(UNIT_TEST) static uint16_t dmaBufferOffset; extern const struct transponderVTable erltTansponderVTable; diff --git a/src/main/drivers/transponder_ir_ilap.c b/src/main/drivers/transponder_ir_ilap.c index 5152f173c9..0de93ee117 100644 --- a/src/main/drivers/transponder_ir_ilap.c +++ b/src/main/drivers/transponder_ir_ilap.c @@ -28,7 +28,7 @@ #include "drivers/transponder_ir.h" #include "drivers/transponder_ir_ilap.h" -#if defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(UNIT_TEST) +#if defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32H7) || defined(UNIT_TEST) static uint16_t dmaBufferOffset; extern const struct transponderVTable ilapTansponderVTable; diff --git a/src/main/drivers/transponder_ir_io_hal.c b/src/main/drivers/transponder_ir_io_hal.c index d04903834d..7940974049 100644 --- a/src/main/drivers/transponder_ir_io_hal.c +++ b/src/main/drivers/transponder_ir_io_hal.c @@ -48,11 +48,15 @@ static uint16_t timerChannel = 0; static uint8_t output; static uint8_t alternateFunction; -#if !defined(STM32F7) +#if !(defined(STM32F7) || defined(STM32H7)) #error "Transponder (via HAL) not supported on this MCU." #endif +#ifdef STM32H7 +DMA_RAM transponder_t transponder; +#else transponder_t transponder; +#endif bool transponderInitialised = false; static void TRANSPONDER_DMA_IRQHandler(dmaChannelDescriptor_t* descriptor) @@ -85,7 +89,11 @@ void transponderIrHardwareInit(ioTag_t ioTag, transponder_t *transponder) uint32_t dmaChannel = dmaSpec->channel; #else dmaStream_t *dmaRef = timerHardware->dmaRef; +#ifdef STM32H7 + uint32_t dmaChannel = timerHardware->dmaRequest; +#else uint32_t dmaChannel = timerHardware->dmaChannel; +#endif #endif if (dmaRef == NULL) { @@ -119,9 +127,14 @@ void transponderIrHardwareInit(ioTag_t ioTag, transponder_t *transponder) IOConfigGPIOAF(transponderIO, IO_CONFIG(GPIO_MODE_AF_PP, GPIO_SPEED_FREQ_VERY_HIGH, GPIO_PULLDOWN), timerHardware->alternateFunction); __DMA1_CLK_ENABLE(); + __DMA2_CLK_ENABLE(); /* Set the parameters to be configured */ +#ifdef STM32H7 + hdma_tim.Init.Request = dmaChannel; +#else hdma_tim.Init.Channel = dmaChannel; +#endif hdma_tim.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_tim.Init.PeriphInc = DMA_PINC_DISABLE; hdma_tim.Init.MemInc = DMA_MINC_ENABLE;