diff --git a/stm32h7/CMakeLists.txt b/stm32h7/CMakeLists.txt index e568b38..ed74b99 100644 --- a/stm32h7/CMakeLists.txt +++ b/stm32h7/CMakeLists.txt @@ -3,4 +3,5 @@ add_subdirectory(devicetest) target_sources(${TARGET_NAME} PRIVATE interrupts.c + dma_interrupts.c ) diff --git a/stm32h7/dma_interrupts.c b/stm32h7/dma_interrupts.c new file mode 100644 index 0000000..db51063 --- /dev/null +++ b/stm32h7/dma_interrupts.c @@ -0,0 +1,84 @@ +#include "dma_interrupts.h" + +#include +#include + +user_handler_t DMA_1_USER_HANDLERS[8]; +user_args_t DMA_1_USER_ARGS[8]; + +user_handler_t DMA_2_USER_HANDLERS[8]; +user_args_t DMA_2_USER_ARGS[8]; + +void assign_dma_user_handler(DMAIndexes dma_idx, DMAStreams stream_idx, + user_handler_t user_handler, user_args_t user_args) { + if(dma_idx == DMA_1) { + DMA_1_USER_HANDLERS[stream_idx] = user_handler; + DMA_1_USER_ARGS[stream_idx] = user_args; + } + else if(dma_idx == DMA_2) { + DMA_2_USER_HANDLERS[stream_idx] = user_handler; + DMA_2_USER_ARGS[stream_idx] = user_args; + } +} + +// The interrupt handlers in the format required for the IRQ vector table + +/* Do not change these function names! They need to be exactly equal to the name of the functions +defined in the startup_stm32h743xx.s files! */ + +#define GENERIC_DMA_IRQ_HANDLER(DMA_IDX, STREAM_IDX) \ + if(DMA_##DMA_IDX##_USER_HANDLERS[STREAM_IDX] != NULL) { \ + DMA_##DMA_IDX##_USER_HANDLERS[STREAM_IDX](DMA_##DMA_IDX##_USER_ARGS[STREAM_IDX]); \ + return; \ + } \ + Default_Handler() \ + +void DMA1_Stream0_IRQHandler() { + GENERIC_DMA_IRQ_HANDLER(1, 0); +} +void DMA1_Stream1_IRQHandler() { + GENERIC_DMA_IRQ_HANDLER(1, 1); +} +void DMA1_Stream2_IRQHandler() { + GENERIC_DMA_IRQ_HANDLER(1, 2); +} +void DMA1_Stream3_IRQHandler() { + GENERIC_DMA_IRQ_HANDLER(1, 3); +} +void DMA1_Stream4_IRQHandler() { + GENERIC_DMA_IRQ_HANDLER(1, 4); +} +void DMA1_Stream5_IRQHandler() { + GENERIC_DMA_IRQ_HANDLER(1, 5); +} +void DMA1_Stream6_IRQHandler() { + GENERIC_DMA_IRQ_HANDLER(1, 6); +} +void DMA1_Stream7_IRQHandler() { + GENERIC_DMA_IRQ_HANDLER(1, 7); +} + +void DMA2_Stream0_IRQHandler() { + GENERIC_DMA_IRQ_HANDLER(2, 0); +} +void DMA2_Stream1_IRQHandler() { + GENERIC_DMA_IRQ_HANDLER(2, 1); +} +void DMA2_Stream2_IRQHandler() { + GENERIC_DMA_IRQ_HANDLER(2, 2); +} +void DMA2_Stream3_IRQHandler() { + GENERIC_DMA_IRQ_HANDLER(2, 3); +} +void DMA2_Stream4_IRQHandler() { + GENERIC_DMA_IRQ_HANDLER(2, 4); +} +void DMA2_Stream5_IRQHandler() { + GENERIC_DMA_IRQ_HANDLER(2, 5); +} +void DMA2_Stream6_IRQHandler() { + GENERIC_DMA_IRQ_HANDLER(2, 6); +} +void DMA2_Stream7_IRQHandler() { + GENERIC_DMA_IRQ_HANDLER(2, 7); +} diff --git a/stm32h7/dma_interrupts.h b/stm32h7/dma_interrupts.h new file mode 100644 index 0000000..b28310f --- /dev/null +++ b/stm32h7/dma_interrupts.h @@ -0,0 +1,39 @@ +#ifndef FSFW_HAL_STM32H7_DMA_INTERRUPTS_H_ +#define FSFW_HAL_STM32H7_DMA_INTERRUPTS_H_ + +#include "interrupts.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + DMA_1 = 0, + DMA_2 = 1 +} DMAIndexes; + +typedef enum { + STREAM_0 = 0, + STREAM_1 = 1, + STREAM_2 = 2, + STREAM_3 = 3, + STREAM_4 = 4, + STREAM_5 = 5, + STREAM_6 = 6, + STREAM_7 = 7, +} DMAStreams; + +/** + * Assign user interrupt handlers for DMA streams, allowing to pass an + * arbitrary argument as well. Generally, this argument will be the related DMA handle. + * @param user_handler + * @param user_args + */ +void assign_dma_user_handler(DMAIndexes dma_idx, DMAStreams stream_idx, + user_handler_t user_handler, user_args_t user_args); + +#ifdef __cplusplus +} +#endif + +#endif /* FSFW_HAL_STM32H7_DMA_INTERRUPTS_H_ */ diff --git a/stm32h7/interrupts.c b/stm32h7/interrupts.c index 99e0272..4987edd 100644 --- a/stm32h7/interrupts.c +++ b/stm32h7/interrupts.c @@ -1,35 +1,2 @@ #include "interrupts.h" - #include - -void Default_Handler(); - -void (*dma2_stream3_user_handler) (void* args) = NULL; -void * dma2_stream3_user_args = NULL; - -void (*dma2_stream2_user_handler) (void* args) = NULL; -void * dma2_stream2_user_args = NULL; - -void assign_dma2_stream2_user_handler(user_handler_t user_handler, user_args_t user_args) { - dma2_stream2_user_handler = user_handler; - dma2_stream2_user_args = user_args; -} - -void assign_dma2_stream3_user_handler(user_handler_t user_handler, user_args_t user_args) { - dma2_stream3_user_handler = user_handler; - dma2_stream3_user_args = user_args; -} - -void DMA2_Stream3_IRQHandler() { - if(dma2_stream3_user_handler != NULL) { - dma2_stream3_user_handler(dma2_stream3_user_args); - } - Default_Handler(); -} - -void DMA2_Stream2_IRQHandler() { - if(dma2_stream2_user_handler != NULL) { - dma2_stream2_user_handler(dma2_stream2_user_args); - } - Default_Handler(); -} diff --git a/stm32h7/interrupts.h b/stm32h7/interrupts.h index de4ba81..00c8a79 100644 --- a/stm32h7/interrupts.h +++ b/stm32h7/interrupts.h @@ -13,9 +13,6 @@ extern void Default_Handler(); typedef void (*user_handler_t) (void*); typedef void* user_args_t; -void assign_dma2_stream2_user_handler(user_handler_t user_handler, user_args_t user_args); -void assign_dma2_stream3_user_handler(user_handler_t user_handler, user_args_t user_args); - #ifdef __cplusplus } #endif diff --git a/stm32h7/spi/interrupts.c b/stm32h7/spi/interrupts.c index bd28771..90e1047 100644 --- a/stm32h7/spi/interrupts.c +++ b/stm32h7/spi/interrupts.c @@ -2,11 +2,38 @@ #include -void SPI1_IRQHandler() { +void (*spi1_user_handler) (void* args) = NULL; +void * spi1_user_args = NULL; +void (*spi2_user_handler) (void* args) = NULL; +void * spi2_user_args = NULL; + +void assign_spi_user_handler(SpiBus spi_idx, user_handler_t user_handler, user_args_t user_args) { + if(spi_idx == SPI_1) { + spi1_user_handler = user_handler; + spi1_user_args = user_args; + } + else { + spi2_user_handler = user_handler; + spi2_user_args = user_args; + } +} + +/* Do not change these function names! They need to be exactly equal to the name of the functions +defined in the startup_stm32h743xx.s files! */ + +void SPI1_IRQHandler() { + if(spi1_user_handler != NULL) { + spi1_user_handler(spi1_user_args); + return; + } + Default_Handler(); } void SPI2_IRQHandler() { - + if(spi2_user_handler != NULL) { + spi2_user_handler(spi2_user_args); + return; + } + Default_Handler(); } - diff --git a/stm32h7/spi/interrupts.h b/stm32h7/spi/interrupts.h index 2c7734a..60d8fa0 100644 --- a/stm32h7/spi/interrupts.h +++ b/stm32h7/spi/interrupts.h @@ -1,8 +1,27 @@ -#ifndef FSFW_HAL_STM32H7_INTERRUPTS_H_ -#define FSFW_HAL_STM32H7_INTERRUPTS_H_ +#ifndef FSFW_HAL_STM32H7_SPI_INTERRUPTS_H_ +#define FSFW_HAL_STM32H7_SPI_INTERRUPTS_H_ +#include "../interrupts.h" +#ifdef __cplusplus +extern "C" { +#endif +typedef enum { + SPI_1, + SPI_2 +} SpiBus; +/** + * Assign a user interrupt handler for SPI bus 1, allowing to pass an arbitrary argument as well. + * Generally, this argument will be the related SPI handle. + * @param user_handler + * @param user_args + */ +void assign_spi_user_handler(SpiBus spiBus, user_handler_t user_handler, user_args_t user_args); -#endif /* FSFW_HAL_STM32H7_INTERRUPTS_H_ */ +#ifdef __cplusplus +} +#endif + +#endif /* FSFW_HAL_STM32H7_SPI_INTERRUPTS_H_ */ diff --git a/stm32h7/spi/spiCore.c b/stm32h7/spi/spiCore.c index 44aa1a4..1d81b5e 100644 --- a/stm32h7/spi/spiCore.c +++ b/stm32h7/spi/spiCore.c @@ -25,44 +25,30 @@ SPI_HandleTypeDef* getSpiHandle() { return spiHandle; } -///** -// * @brief This function handles DMA Rx interrupt request. -// * @param None -// * @retval None -// */ -//void SPIx_DMA_RX_IRQHandler(void) -//{ -// HAL_DMA_IRQHandler(spiHandle->hdmarx); -//} -// -///** -// * @brief This function handles DMA Tx interrupt request. -// * @param None -// * @retval None -// */ -//void SPIx_DMA_TX_IRQHandler(void) -//{ -// HAL_DMA_IRQHandler(spiHandle->hdmatx); -//} -// -//void DMA2_Stream3_IRQHandler() { -// SPIx_DMA_TX_IRQHandler(); -//} -// -//void DMA2_Stream2_IRQHandler() { -// SPIx_DMA_RX_IRQHandler(); -//} -// -///** -// * @brief This function handles SPIx interrupt request. -// * @param None -// * @retval None -// */ -//void SPIx_IRQHandler(void) -//{ -// HAL_SPI_IRQHandler(spiHandle); -//} -// -//void SPI1_IRQHandler(void) { -// SPIx_IRQHandler(); -//} +/** + * @brief This function handles DMA Rx interrupt request. + * @param None + * @retval None + */ +void dma_rx_irq_handler(void* dma_handle) { + HAL_DMA_IRQHandler((DMA_HandleTypeDef *) dma_handle); +} + +/** + * @brief This function handles DMA Rx interrupt request. + * @param None + * @retval None + */ +void dma_tx_irq_handler(void* dma_handle) { + HAL_DMA_IRQHandler((DMA_HandleTypeDef *) dma_handle); +} + +/** + * @brief This function handles SPIx interrupt request. + * @param None + * @retval None + */ +void spi1_irq_handler(void* spi_handle) +{ + HAL_SPI_IRQHandler((SPI_HandleTypeDef *) spi_handle); +}