refactored irq code
This commit is contained in:
parent
78a66e1b67
commit
abe62d807a
@ -3,4 +3,5 @@ add_subdirectory(devicetest)
|
|||||||
|
|
||||||
target_sources(${TARGET_NAME} PRIVATE
|
target_sources(${TARGET_NAME} PRIVATE
|
||||||
interrupts.c
|
interrupts.c
|
||||||
|
dma_interrupts.c
|
||||||
)
|
)
|
||||||
|
84
stm32h7/dma_interrupts.c
Normal file
84
stm32h7/dma_interrupts.c
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
#include "dma_interrupts.h"
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
39
stm32h7/dma_interrupts.h
Normal file
39
stm32h7/dma_interrupts.h
Normal file
@ -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_ */
|
@ -1,35 +1,2 @@
|
|||||||
#include "interrupts.h"
|
#include "interrupts.h"
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
|
@ -13,9 +13,6 @@ extern void Default_Handler();
|
|||||||
typedef void (*user_handler_t) (void*);
|
typedef void (*user_handler_t) (void*);
|
||||||
typedef void* user_args_t;
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -2,11 +2,38 @@
|
|||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
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() {
|
void SPI2_IRQHandler() {
|
||||||
|
if(spi2_user_handler != NULL) {
|
||||||
|
spi2_user_handler(spi2_user_args);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Default_Handler();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,8 +1,27 @@
|
|||||||
#ifndef FSFW_HAL_STM32H7_INTERRUPTS_H_
|
#ifndef FSFW_HAL_STM32H7_SPI_INTERRUPTS_H_
|
||||||
#define FSFW_HAL_STM32H7_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_ */
|
||||||
|
@ -25,44 +25,30 @@ SPI_HandleTypeDef* getSpiHandle() {
|
|||||||
return spiHandle;
|
return spiHandle;
|
||||||
}
|
}
|
||||||
|
|
||||||
///**
|
/**
|
||||||
// * @brief This function handles DMA Rx interrupt request.
|
* @brief This function handles DMA Rx interrupt request.
|
||||||
// * @param None
|
* @param None
|
||||||
// * @retval None
|
* @retval None
|
||||||
// */
|
*/
|
||||||
//void SPIx_DMA_RX_IRQHandler(void)
|
void dma_rx_irq_handler(void* dma_handle) {
|
||||||
//{
|
HAL_DMA_IRQHandler((DMA_HandleTypeDef *) dma_handle);
|
||||||
// HAL_DMA_IRQHandler(spiHandle->hdmarx);
|
}
|
||||||
//}
|
|
||||||
//
|
/**
|
||||||
///**
|
* @brief This function handles DMA Rx interrupt request.
|
||||||
// * @brief This function handles DMA Tx interrupt request.
|
* @param None
|
||||||
// * @param None
|
* @retval None
|
||||||
// * @retval None
|
*/
|
||||||
// */
|
void dma_tx_irq_handler(void* dma_handle) {
|
||||||
//void SPIx_DMA_TX_IRQHandler(void)
|
HAL_DMA_IRQHandler((DMA_HandleTypeDef *) dma_handle);
|
||||||
//{
|
}
|
||||||
// HAL_DMA_IRQHandler(spiHandle->hdmatx);
|
|
||||||
//}
|
/**
|
||||||
//
|
* @brief This function handles SPIx interrupt request.
|
||||||
//void DMA2_Stream3_IRQHandler() {
|
* @param None
|
||||||
// SPIx_DMA_TX_IRQHandler();
|
* @retval None
|
||||||
//}
|
*/
|
||||||
//
|
void spi1_irq_handler(void* spi_handle)
|
||||||
//void DMA2_Stream2_IRQHandler() {
|
{
|
||||||
// SPIx_DMA_RX_IRQHandler();
|
HAL_SPI_IRQHandler((SPI_HandleTypeDef *) spi_handle);
|
||||||
//}
|
}
|
||||||
//
|
|
||||||
///**
|
|
||||||
// * @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();
|
|
||||||
//}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user