From 6269cf969ab0a2e037fa79837a681a22dbedeefa Mon Sep 17 00:00:00 2001 From: Steins7 Date: Wed, 13 Sep 2023 21:56:30 +0200 Subject: [PATCH] Add critical section functions for DMAs --- drivers/dma.c | 30 ++++++++++++++++++++++++++++++ drivers/dma.h | 4 ++++ 2 files changed, 34 insertions(+) diff --git a/drivers/dma.c b/drivers/dma.c index 1fef4c8..bd6a3a6 100644 --- a/drivers/dma.c +++ b/drivers/dma.c @@ -91,6 +91,21 @@ void dma_reset(enum DmaPeriph dma, enum DmaChannel channel) regs->CPAR = 0; } +void dma_exit_critical(enum DmaPeriph dma, enum DmaChannel channel) +{ + switch (dma) { + case DMA_PERIPH_1: + nvic_enable(NVIC_IRQ_DMA1_CHANNEL1 + channel); + break; + case DMA_PERIPH_2: + nvic_enable(NVIC_IRQ_DMA2_CHANNEL1 + channel); + break; + default: + return; + break; + } +} + void dma_enable(enum DmaPeriph dma, enum DmaChannel channel) { switch (dma) { @@ -112,6 +127,21 @@ void dma_enable(enum DmaPeriph dma, enum DmaChannel channel) } } +void dma_enter_critical(enum DmaPeriph dma, enum DmaChannel channel) +{ + switch (dma) { + case DMA_PERIPH_1: + nvic_disable(NVIC_IRQ_DMA1_CHANNEL1 + channel); + break; + case DMA_PERIPH_2: + nvic_disable(NVIC_IRQ_DMA2_CHANNEL1 + channel); + break; + default: + return; + break; + } +} + void dma_disable(enum DmaPeriph dma, enum DmaChannel channel) { switch (dma) { diff --git a/drivers/dma.h b/drivers/dma.h index b5a2159..893c14f 100644 --- a/drivers/dma.h +++ b/drivers/dma.h @@ -90,8 +90,12 @@ void dma_configure_mem2mem(enum DmaPeriph dma, enum DmaChannel channel, void dma_reset(enum DmaPeriph dma, enum DmaChannel channel); +void dma_exit_critical(enum DmaPeriph dma, enum DmaChannel channel); + void dma_enable(enum DmaPeriph dma, enum DmaChannel channel); +void dma_enter_critical(enum DmaPeriph dma, enum DmaChannel channel); + void dma_disable(enum DmaPeriph dma, enum DmaChannel channel); uint16_t dma_get_remaining(enum DmaPeriph dma, enum DmaChannel channe);