diff --git a/cmake/boardcore.cmake b/cmake/boardcore.cmake index 8bd4c6b27c57ce4b0b7cc01993586353fc3368c4..85a9460af1df62a61416beecb3976a89e67037e0 100644 --- a/cmake/boardcore.cmake +++ b/cmake/boardcore.cmake @@ -57,6 +57,7 @@ set(BOARDCORE_SRC ${BOARDCORE_PATH}/src/shared/drivers/canbus/CanDriver/CanInterrupt.cpp ${BOARDCORE_PATH}/src/shared/drivers/canbus/CanProtocol/CanProtocol.cpp ${BOARDCORE_PATH}/src/shared/drivers/dma/DMA.cpp + ${BOARDCORE_PATH}/src/shared/drivers/dma/DMADefs.cpp ${BOARDCORE_PATH}/src/shared/drivers/interrupt/external_interrupts.cpp ${BOARDCORE_PATH}/src/shared/drivers/timer/PWM.cpp ${BOARDCORE_PATH}/src/shared/drivers/timer/CountedPWM.cpp diff --git a/src/shared/drivers/dma/DMA.cpp b/src/shared/drivers/dma/DMA.cpp index d654466d8b3cf8e63635626fedd7e96d7604e081..a38af66d3880dea77c9e1ac6606451bcca9242e1 100644 --- a/src/shared/drivers/dma/DMA.cpp +++ b/src/shared/drivers/dma/DMA.cpp @@ -1,5 +1,5 @@ -/* Copyright (c) 2023 Skyward Experimental Rocketry - * Author: Alberto Nidasio +/* Copyright (c) 2025 Skyward Experimental Rocketry + * Author: Alberto Nidasio, Fabrizio Monti * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/shared/drivers/dma/DMA.h b/src/shared/drivers/dma/DMA.h index c62fa1c6adfd7b8e2421bd930f940dffae836456..63ede2588ba6da57a4508bdf241c1267a8179757 100644 --- a/src/shared/drivers/dma/DMA.h +++ b/src/shared/drivers/dma/DMA.h @@ -1,5 +1,5 @@ -/* Copyright (c) 2023 Skyward Experimental Rocketry - * Author: Alberto Nidasio +/* Copyright (c) 2025 Skyward Experimental Rocketry + * Author: Alberto Nidasio, Fabrizio Monti * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/shared/drivers/dma/DMADefs.cpp b/src/shared/drivers/dma/DMADefs.cpp new file mode 100644 index 0000000000000000000000000000000000000000..176729890d0aa4f742c5c3063d63311bf97cd980 --- /dev/null +++ b/src/shared/drivers/dma/DMADefs.cpp @@ -0,0 +1,452 @@ +/* Copyright (c) 2025 Skyward Experimental Rocketry + * Author: Alberto Nidasio, Fabrizio Monti + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "DMADefs.h" + +namespace Boardcore +{ + +namespace DMADefs +{ + +const IRQn_Type irqNumberMapping[] = { + DMA1_Stream0_IRQn, DMA1_Stream1_IRQn, DMA1_Stream2_IRQn, DMA1_Stream3_IRQn, + DMA1_Stream4_IRQn, DMA1_Stream5_IRQn, DMA1_Stream6_IRQn, DMA1_Stream7_IRQn, + DMA2_Stream0_IRQn, DMA2_Stream1_IRQn, DMA2_Stream2_IRQn, DMA2_Stream3_IRQn, + DMA2_Stream4_IRQn, DMA2_Stream5_IRQn, DMA2_Stream6_IRQn, DMA2_Stream7_IRQn, +}; + +const std::multimap<Peripherals, std::pair<DMAStreamId, Channel>> + mapPeripherals = { + +#ifdef STM32F407xx + // MEM-TO-MEM (only dma2 can perform mem-to-mem copy) + {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str0, Channel::CHANNEL0}}, + {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str1, Channel::CHANNEL0}}, + {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str2, Channel::CHANNEL0}}, + // {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str3, + // Channel::CHANNEL0}}, // Stream currently not supported + {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str4, Channel::CHANNEL0}}, + {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str5, Channel::CHANNEL0}}, + {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str6, Channel::CHANNEL0}}, + {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str7, Channel::CHANNEL0}}, + + // SPI + {Peripherals::PE_SPI1_TX, {DMAStreamId::DMA2_Str5, Channel::CHANNEL3}}, + // {Peripherals::PE_SPI1_TX, {DMAStreamId::DMA2_Str3, + // Channel::CHANNEL3}}, // Stream currently not supported + {Peripherals::PE_SPI1_RX, {DMAStreamId::DMA2_Str2, Channel::CHANNEL3}}, + {Peripherals::PE_SPI1_RX, {DMAStreamId::DMA2_Str0, Channel::CHANNEL3}}, + + {Peripherals::PE_SPI2_TX, {DMAStreamId::DMA1_Str4, Channel::CHANNEL0}}, + // {Peripherals::PE_SPI2_RX, {DMAStreamId::DMA1_Str3, + // Channel::CHANNEL0}}, // Stream currently not supported + + {Peripherals::PE_SPI3_TX, {DMAStreamId::DMA1_Str5, Channel::CHANNEL0}}, + {Peripherals::PE_SPI3_TX, {DMAStreamId::DMA1_Str7, Channel::CHANNEL0}}, + {Peripherals::PE_SPI3_RX, {DMAStreamId::DMA1_Str0, Channel::CHANNEL0}}, + {Peripherals::PE_SPI3_RX, {DMAStreamId::DMA1_Str2, Channel::CHANNEL0}}, + + // UART & USART + {Peripherals::PE_USART1_TX, + {DMAStreamId::DMA2_Str7, Channel::CHANNEL4}}, + {Peripherals::PE_USART1_RX, + {DMAStreamId::DMA2_Str2, Channel::CHANNEL4}}, + {Peripherals::PE_USART1_RX, + {DMAStreamId::DMA2_Str5, Channel::CHANNEL4}}, + + {Peripherals::PE_USART2_TX, + {DMAStreamId::DMA1_Str6, Channel::CHANNEL4}}, + {Peripherals::PE_USART2_RX, + {DMAStreamId::DMA1_Str5, Channel::CHANNEL4}}, + + // {Peripherals::PE_USART3_TX, {DMAStreamId::DMA1_Str3, + // Channel::CHANNEL4}}, // Stream currently not supported + {Peripherals::PE_USART3_TX, + {DMAStreamId::DMA1_Str4, Channel::CHANNEL7}}, + // {Peripherals::PE_USART3_RX, {DMAStreamId::DMA1_Str1, + // Channel::CHANNEL4}}, // Stream currently not supported + + {Peripherals::PE_UART4_TX, {DMAStreamId::DMA1_Str4, Channel::CHANNEL4}}, + {Peripherals::PE_UART4_RX, {DMAStreamId::DMA1_Str2, Channel::CHANNEL4}}, + + {Peripherals::PE_UART5_TX, {DMAStreamId::DMA1_Str7, Channel::CHANNEL4}}, + {Peripherals::PE_UART5_RX, {DMAStreamId::DMA1_Str0, Channel::CHANNEL4}}, + + {Peripherals::PE_USART6_TX, + {DMAStreamId::DMA2_Str6, Channel::CHANNEL5}}, + {Peripherals::PE_USART6_TX, + {DMAStreamId::DMA2_Str7, Channel::CHANNEL5}}, + {Peripherals::PE_USART6_RX, + {DMAStreamId::DMA2_Str1, Channel::CHANNEL5}}, + {Peripherals::PE_USART6_RX, + {DMAStreamId::DMA2_Str2, Channel::CHANNEL5}}, + + // I2C + {Peripherals::PE_I2C1_TX, {DMAStreamId::DMA1_Str6, Channel::CHANNEL1}}, + {Peripherals::PE_I2C1_TX, {DMAStreamId::DMA1_Str7, Channel::CHANNEL1}}, + {Peripherals::PE_I2C1_RX, {DMAStreamId::DMA1_Str0, Channel::CHANNEL1}}, + {Peripherals::PE_I2C1_RX, {DMAStreamId::DMA1_Str5, Channel::CHANNEL1}}, + + {Peripherals::PE_I2C2_TX, {DMAStreamId::DMA1_Str7, Channel::CHANNEL7}}, + {Peripherals::PE_I2C2_RX, {DMAStreamId::DMA1_Str2, Channel::CHANNEL7}}, + // {Peripherals::PE_I2C2_RX, {DMAStreamId::DMA1_Str3, + // Channel::CHANNEL7}}, // Stream currently not supported + + {Peripherals::PE_I2C3_TX, {DMAStreamId::DMA1_Str4, Channel::CHANNEL3}}, + {Peripherals::PE_I2C3_RX, {DMAStreamId::DMA1_Str2, Channel::CHANNEL3}}, + + {Peripherals::PE_I2S2_EXT_TX, + {DMAStreamId::DMA1_Str4, Channel::CHANNEL2}}, + // {Peripherals::PE_I2S2_EXT_RX, {DMAStreamId::DMA1_Str3, + // Channel::CHANNEL3}}, // Stream currently not supported + + {Peripherals::PE_I2S3_EXT_TX, + {DMAStreamId::DMA1_Str5, Channel::CHANNEL2}}, + {Peripherals::PE_I2S3_EXT_RX, + {DMAStreamId::DMA1_Str2, Channel::CHANNEL2}}, + {Peripherals::PE_I2S3_EXT_RX, + {DMAStreamId::DMA1_Str0, Channel::CHANNEL3}}, + + // TIMERS + {Peripherals::PE_TIM1_UP, {DMAStreamId::DMA2_Str5, Channel::CHANNEL6}}, + {Peripherals::PE_TIM1_TRIG, + {DMAStreamId::DMA2_Str0, Channel::CHANNEL6}}, + {Peripherals::PE_TIM1_TRIG, + {DMAStreamId::DMA2_Str4, Channel::CHANNEL6}}, + {Peripherals::PE_TIM1_COM, {DMAStreamId::DMA2_Str4, Channel::CHANNEL6}}, + {Peripherals::PE_TIM1_CH1, {DMAStreamId::DMA2_Str6, Channel::CHANNEL0}}, + {Peripherals::PE_TIM1_CH1, {DMAStreamId::DMA2_Str1, Channel::CHANNEL6}}, + // {Peripherals::PE_TIM1_CH1, {DMAStreamId::DMA2_Str3, + // Channel::CHANNEL6}}, // Stream currently not supported + {Peripherals::PE_TIM1_CH2, {DMAStreamId::DMA2_Str6, Channel::CHANNEL0}}, + {Peripherals::PE_TIM1_CH2, {DMAStreamId::DMA2_Str2, Channel::CHANNEL6}}, + {Peripherals::PE_TIM1_CH3, {DMAStreamId::DMA2_Str6, Channel::CHANNEL0}}, + {Peripherals::PE_TIM1_CH3, {DMAStreamId::DMA2_Str6, Channel::CHANNEL6}}, + {Peripherals::PE_TIM1_CH4, {DMAStreamId::DMA2_Str4, Channel::CHANNEL6}}, + + // {Peripherals::PE_TIM2_UP, {DMAStreamId::DMA1_Str1, + // Channel::CHANNEL3}}, // Stream currently not supported + {Peripherals::PE_TIM2_UP, {DMAStreamId::DMA1_Str7, Channel::CHANNEL3}}, + {Peripherals::PE_TIM2_CH1, {DMAStreamId::DMA1_Str5, Channel::CHANNEL3}}, + {Peripherals::PE_TIM2_CH2, {DMAStreamId::DMA1_Str6, Channel::CHANNEL3}}, + // {Peripherals::PE_TIM2_CH3, {DMAStreamId::DMA1_Str1, + // Channel::CHANNEL3}}, // Stream currently not supported + {Peripherals::PE_TIM2_CH4, {DMAStreamId::DMA1_Str6, Channel::CHANNEL3}}, + {Peripherals::PE_TIM2_CH4, {DMAStreamId::DMA1_Str7, Channel::CHANNEL3}}, + + {Peripherals::PE_TIM3_UP, {DMAStreamId::DMA1_Str2, Channel::CHANNEL5}}, + {Peripherals::PE_TIM3_TRIG, + {DMAStreamId::DMA1_Str4, Channel::CHANNEL5}}, + {Peripherals::PE_TIM3_CH1, {DMAStreamId::DMA1_Str4, Channel::CHANNEL5}}, + {Peripherals::PE_TIM3_CH2, {DMAStreamId::DMA1_Str5, Channel::CHANNEL5}}, + {Peripherals::PE_TIM3_CH3, {DMAStreamId::DMA1_Str7, Channel::CHANNEL5}}, + {Peripherals::PE_TIM3_CH4, {DMAStreamId::DMA1_Str2, Channel::CHANNEL5}}, + + {Peripherals::PE_TIM4_UP, {DMAStreamId::DMA1_Str6, Channel::CHANNEL2}}, + {Peripherals::PE_TIM4_CH1, {DMAStreamId::DMA1_Str0, Channel::CHANNEL2}}, + // {Peripherals::PE_TIM4_CH2, {DMAStreamId::DMA1_Str3, + // Channel::CHANNEL2}}, // Stream currently not supported + {Peripherals::PE_TIM4_CH3, {DMAStreamId::DMA1_Str7, Channel::CHANNEL2}}, + + {Peripherals::PE_TIM5_UP, {DMAStreamId::DMA1_Str0, Channel::CHANNEL6}}, + {Peripherals::PE_TIM5_UP, {DMAStreamId::DMA1_Str6, Channel::CHANNEL6}}, + // {Peripherals::PE_TIM5_TRIG, {DMAStreamId::DMA1_Str1, + // Channel::CHANNEL6}}, // Stream currently not supported + // {Peripherals::PE_TIM5_TRIG, {DMAStreamId::DMA1_Str3, + // Channel::CHANNEL6}}, // Stream currently not supported + {Peripherals::PE_TIM5_CH1, {DMAStreamId::DMA1_Str2, Channel::CHANNEL6}}, + {Peripherals::PE_TIM5_CH2, {DMAStreamId::DMA1_Str4, Channel::CHANNEL6}}, + {Peripherals::PE_TIM5_CH3, {DMAStreamId::DMA1_Str0, Channel::CHANNEL6}}, + // {Peripherals::PE_TIM5_CH4, {DMAStreamId::DMA1_Str1, + // Channel::CHANNEL6}}, // Stream currently not supported + // {Peripherals::PE_TIM5_CH4, {DMAStreamId::DMA1_Str3, + // Channel::CHANNEL6}}, // Stream currently not supported + + // {Peripherals::PE_TIM6_UP, {DMAStreamId::DMA1_Str1, + // Channel::CHANNEL7}}, // Stream currently not supported + + {Peripherals::PE_TIM7_UP, {DMAStreamId::DMA1_Str2, Channel::CHANNEL1}}, + {Peripherals::PE_TIM7_UP, {DMAStreamId::DMA1_Str4, Channel::CHANNEL1}}, + + {Peripherals::PE_TIM8_UP, {DMAStreamId::DMA2_Str1, Channel::CHANNEL7}}, + {Peripherals::PE_TIM8_TRIG, + {DMAStreamId::DMA2_Str7, Channel::CHANNEL7}}, + {Peripherals::PE_TIM8_COM, {DMAStreamId::DMA2_Str7, Channel::CHANNEL7}}, + {Peripherals::PE_TIM8_CH1, {DMAStreamId::DMA2_Str2, Channel::CHANNEL0}}, + {Peripherals::PE_TIM8_CH1, {DMAStreamId::DMA2_Str2, Channel::CHANNEL7}}, + {Peripherals::PE_TIM8_CH2, {DMAStreamId::DMA2_Str2, Channel::CHANNEL0}}, + // {Peripherals::PE_TIM8_CH2, {DMAStreamId::DMA2_Str3, + // Channel::CHANNEL7}}, // Stream currently not supported + {Peripherals::PE_TIM8_CH3, {DMAStreamId::DMA2_Str2, Channel::CHANNEL0}}, + {Peripherals::PE_TIM8_CH3, {DMAStreamId::DMA2_Str4, Channel::CHANNEL7}}, + {Peripherals::PE_TIM8_CH4, {DMAStreamId::DMA2_Str7, Channel::CHANNEL7}}, + + // Others + {Peripherals::PE_DAC1, {DMAStreamId::DMA1_Str5, Channel::CHANNEL7}}, + {Peripherals::PE_DAC2, {DMAStreamId::DMA1_Str6, Channel::CHANNEL7}}, + + {Peripherals::PE_ADC1, {DMAStreamId::DMA2_Str0, Channel::CHANNEL0}}, + {Peripherals::PE_ADC1, {DMAStreamId::DMA2_Str4, Channel::CHANNEL0}}, + + {Peripherals::PE_ADC2, {DMAStreamId::DMA2_Str2, Channel::CHANNEL1}}, + // {Peripherals::PE_ADC2, {DMAStreamId::DMA2_Str3, Channel::CHANNEL1}}, + // // Stream currently not supported + + {Peripherals::PE_ADC3, {DMAStreamId::DMA2_Str0, Channel::CHANNEL2}}, + {Peripherals::PE_ADC3, {DMAStreamId::DMA2_Str1, Channel::CHANNEL2}}, + + {Peripherals::PE_DCMI, {DMAStreamId::DMA2_Str1, Channel::CHANNEL1}}, + {Peripherals::PE_DCMI, {DMAStreamId::DMA2_Str7, Channel::CHANNEL1}}, + + // {Peripherals::PE_SDIO, {DMAStreamId::DMA2_Str3, Channel::CHANNEL4}}, + // // Stream currently not supported + {Peripherals::PE_SDIO, {DMAStreamId::DMA2_Str6, Channel::CHANNEL4}}, + + {Peripherals::PE_CRYP_OUT, {DMAStreamId::DMA2_Str5, Channel::CHANNEL2}}, + {Peripherals::PE_CRYP_IN, {DMAStreamId::DMA2_Str6, Channel::CHANNEL2}}, + + {Peripherals::PE_HASH_IN, {DMAStreamId::DMA2_Str7, Channel::CHANNEL2}}, + +#endif // STM32F407xx + +#ifdef STM32F429xx + + // MEM-TO-MEM (only dma2 can perform mem-to-mem copy) + {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str0, Channel::CHANNEL0}}, + {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str1, Channel::CHANNEL0}}, + {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str2, Channel::CHANNEL0}}, + // {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str3, + // Channel::CHANNEL0}}, // Stream currently not supported + {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str4, Channel::CHANNEL0}}, + {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str5, Channel::CHANNEL0}}, + {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str6, Channel::CHANNEL0}}, + {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str7, Channel::CHANNEL0}}, + + // SPI + {Peripherals::PE_SPI1_TX, {DMAStreamId::DMA2_Str5, Channel::CHANNEL3}}, + // {Peripherals::PE_SPI1_TX, {DMAStreamId::DMA2_Str3, + // Channel::CHANNEL3}}, // Stream currently not supported + {Peripherals::PE_SPI1_RX, {DMAStreamId::DMA2_Str2, Channel::CHANNEL3}}, + {Peripherals::PE_SPI1_RX, {DMAStreamId::DMA2_Str0, Channel::CHANNEL3}}, + + {Peripherals::PE_SPI2_TX, {DMAStreamId::DMA1_Str4, Channel::CHANNEL0}}, + // {Peripherals::PE_SPI2_RX, {DMAStreamId::DMA1_Str3, + // Channel::CHANNEL0}}, // Stream currently not supported + + {Peripherals::PE_SPI3_TX, {DMAStreamId::DMA1_Str5, Channel::CHANNEL0}}, + {Peripherals::PE_SPI3_TX, {DMAStreamId::DMA1_Str7, Channel::CHANNEL0}}, + {Peripherals::PE_SPI3_RX, {DMAStreamId::DMA1_Str0, Channel::CHANNEL0}}, + {Peripherals::PE_SPI3_RX, {DMAStreamId::DMA1_Str2, Channel::CHANNEL0}}, + + {Peripherals::PE_SPI4_TX, {DMAStreamId::DMA2_Str1, Channel::CHANNEL4}}, + {Peripherals::PE_SPI4_TX, {DMAStreamId::DMA2_Str4, Channel::CHANNEL5}}, + {Peripherals::PE_SPI4_RX, {DMAStreamId::DMA2_Str0, Channel::CHANNEL4}}, + {Peripherals::PE_SPI4_RX, {DMAStreamId::DMA2_Str3, Channel::CHANNEL5}}, + + {Peripherals::PE_SPI5_TX, {DMAStreamId::DMA2_Str4, Channel::CHANNEL2}}, + {Peripherals::PE_SPI5_TX, {DMAStreamId::DMA2_Str6, Channel::CHANNEL7}}, + {Peripherals::PE_SPI5_RX, {DMAStreamId::DMA2_Str3, Channel::CHANNEL2}}, + {Peripherals::PE_SPI5_RX, {DMAStreamId::DMA2_Str5, Channel::CHANNEL7}}, + + {Peripherals::PE_SPI6_TX, {DMAStreamId::DMA2_Str5, Channel::CHANNEL1}}, + {Peripherals::PE_SPI6_RX, {DMAStreamId::DMA2_Str6, Channel::CHANNEL1}}, + + // UART & USART + {Peripherals::PE_USART1_TX, + {DMAStreamId::DMA2_Str7, Channel::CHANNEL4}}, + {Peripherals::PE_USART1_RX, + {DMAStreamId::DMA2_Str2, Channel::CHANNEL4}}, + {Peripherals::PE_USART1_RX, + {DMAStreamId::DMA2_Str5, Channel::CHANNEL4}}, + + {Peripherals::PE_USART2_TX, + {DMAStreamId::DMA1_Str6, Channel::CHANNEL4}}, + {Peripherals::PE_USART2_RX, + {DMAStreamId::DMA1_Str5, Channel::CHANNEL4}}, + + // {Peripherals::PE_USART3_TX, {DMAStreamId::DMA1_Str3, + // Channel::CHANNEL4}}, // Stream currently not supported + {Peripherals::PE_USART3_TX, + {DMAStreamId::DMA1_Str4, Channel::CHANNEL7}}, + // {Peripherals::PE_USART3_RX, {DMAStreamId::DMA1_Str1, + // Channel::CHANNEL4}}, // Stream currently not supported + + {Peripherals::PE_UART4_TX, {DMAStreamId::DMA1_Str4, Channel::CHANNEL4}}, + {Peripherals::PE_UART4_RX, {DMAStreamId::DMA1_Str2, Channel::CHANNEL4}}, + + {Peripherals::PE_UART5_TX, {DMAStreamId::DMA1_Str7, Channel::CHANNEL4}}, + {Peripherals::PE_UART5_RX, {DMAStreamId::DMA1_Str0, Channel::CHANNEL4}}, + + {Peripherals::PE_UART7_TX, {DMAStreamId::DMA1_Str1, Channel::CHANNEL5}}, + {Peripherals::PE_UART7_RX, {DMAStreamId::DMA1_Str3, Channel::CHANNEL5}}, + + {Peripherals::PE_UART8_TX, {DMAStreamId::DMA1_Str0, Channel::CHANNEL5}}, + {Peripherals::PE_UART8_RX, {DMAStreamId::DMA1_Str6, Channel::CHANNEL5}}, + + {Peripherals::PE_USART6_TX, + {DMAStreamId::DMA2_Str6, Channel::CHANNEL5}}, + {Peripherals::PE_USART6_TX, + {DMAStreamId::DMA2_Str7, Channel::CHANNEL5}}, + {Peripherals::PE_USART6_RX, + {DMAStreamId::DMA2_Str1, Channel::CHANNEL5}}, + {Peripherals::PE_USART6_RX, + {DMAStreamId::DMA2_Str2, Channel::CHANNEL5}}, + + // I2C + {Peripherals::PE_I2C1_TX, {DMAStreamId::DMA1_Str6, Channel::CHANNEL1}}, + {Peripherals::PE_I2C1_TX, {DMAStreamId::DMA1_Str7, Channel::CHANNEL1}}, + {Peripherals::PE_I2C1_RX, {DMAStreamId::DMA1_Str0, Channel::CHANNEL1}}, + {Peripherals::PE_I2C1_RX, {DMAStreamId::DMA1_Str5, Channel::CHANNEL1}}, + + {Peripherals::PE_I2C2_TX, {DMAStreamId::DMA1_Str7, Channel::CHANNEL7}}, + {Peripherals::PE_I2C2_RX, {DMAStreamId::DMA1_Str2, Channel::CHANNEL7}}, + // {Peripherals::PE_I2C2_RX, {DMAStreamId::DMA1_Str3, + // Channel::CHANNEL7}}, // Stream currently not supported + + {Peripherals::PE_I2C3_TX, {DMAStreamId::DMA1_Str4, Channel::CHANNEL3}}, + {Peripherals::PE_I2C3_RX, {DMAStreamId::DMA1_Str2, Channel::CHANNEL3}}, + + {Peripherals::PE_I2S2_EXT_TX, + {DMAStreamId::DMA1_Str4, Channel::CHANNEL2}}, + // {Peripherals::PE_I2S2_EXT_RX, {DMAStreamId::DMA1_Str3, + // Channel::CHANNEL3}}, // Stream currently not supported + + {Peripherals::PE_I2S3_EXT_TX, + {DMAStreamId::DMA1_Str5, Channel::CHANNEL2}}, + {Peripherals::PE_I2S3_EXT_RX, + {DMAStreamId::DMA1_Str2, Channel::CHANNEL2}}, + {Peripherals::PE_I2S3_EXT_RX, + {DMAStreamId::DMA1_Str0, Channel::CHANNEL3}}, + + // TIMERS + {Peripherals::PE_TIM1_UP, {DMAStreamId::DMA2_Str5, Channel::CHANNEL6}}, + {Peripherals::PE_TIM1_TRIG, + {DMAStreamId::DMA2_Str0, Channel::CHANNEL6}}, + {Peripherals::PE_TIM1_TRIG, + {DMAStreamId::DMA2_Str4, Channel::CHANNEL6}}, + {Peripherals::PE_TIM1_COM, {DMAStreamId::DMA2_Str4, Channel::CHANNEL6}}, + {Peripherals::PE_TIM1_CH1, {DMAStreamId::DMA2_Str6, Channel::CHANNEL0}}, + {Peripherals::PE_TIM1_CH1, {DMAStreamId::DMA2_Str1, Channel::CHANNEL6}}, + // {Peripherals::PE_TIM1_CH1, {DMAStreamId::DMA2_Str3, + // Channel::CHANNEL6}}, // Stream currently not supported + {Peripherals::PE_TIM1_CH2, {DMAStreamId::DMA2_Str6, Channel::CHANNEL0}}, + {Peripherals::PE_TIM1_CH2, {DMAStreamId::DMA2_Str2, Channel::CHANNEL6}}, + {Peripherals::PE_TIM1_CH3, {DMAStreamId::DMA2_Str6, Channel::CHANNEL0}}, + {Peripherals::PE_TIM1_CH3, {DMAStreamId::DMA2_Str6, Channel::CHANNEL6}}, + {Peripherals::PE_TIM1_CH4, {DMAStreamId::DMA2_Str4, Channel::CHANNEL6}}, + + // {Peripherals::PE_TIM2_UP, {DMAStreamId::DMA1_Str1, + // Channel::CHANNEL3}}, // Stream currently not supported + {Peripherals::PE_TIM2_UP, {DMAStreamId::DMA1_Str7, Channel::CHANNEL3}}, + {Peripherals::PE_TIM2_CH1, {DMAStreamId::DMA1_Str5, Channel::CHANNEL3}}, + {Peripherals::PE_TIM2_CH2, {DMAStreamId::DMA1_Str6, Channel::CHANNEL3}}, + // {Peripherals::PE_TIM2_CH3, {DMAStreamId::DMA1_Str1, + // Channel::CHANNEL3}}, // Stream currently not supported + {Peripherals::PE_TIM2_CH4, {DMAStreamId::DMA1_Str6, Channel::CHANNEL3}}, + {Peripherals::PE_TIM2_CH4, {DMAStreamId::DMA1_Str7, Channel::CHANNEL3}}, + + {Peripherals::PE_TIM3_UP, {DMAStreamId::DMA1_Str2, Channel::CHANNEL5}}, + {Peripherals::PE_TIM3_TRIG, + {DMAStreamId::DMA1_Str4, Channel::CHANNEL5}}, + {Peripherals::PE_TIM3_CH1, {DMAStreamId::DMA1_Str4, Channel::CHANNEL5}}, + {Peripherals::PE_TIM3_CH2, {DMAStreamId::DMA1_Str5, Channel::CHANNEL5}}, + {Peripherals::PE_TIM3_CH3, {DMAStreamId::DMA1_Str7, Channel::CHANNEL5}}, + {Peripherals::PE_TIM3_CH4, {DMAStreamId::DMA1_Str2, Channel::CHANNEL5}}, + + {Peripherals::PE_TIM4_UP, {DMAStreamId::DMA1_Str6, Channel::CHANNEL2}}, + {Peripherals::PE_TIM4_CH1, {DMAStreamId::DMA1_Str0, Channel::CHANNEL2}}, + // {Peripherals::PE_TIM4_CH2, {DMAStreamId::DMA1_Str3, + // Channel::CHANNEL2}}, // Stream currently not supported + {Peripherals::PE_TIM4_CH3, {DMAStreamId::DMA1_Str7, Channel::CHANNEL2}}, + + {Peripherals::PE_TIM5_UP, {DMAStreamId::DMA1_Str0, Channel::CHANNEL6}}, + {Peripherals::PE_TIM5_UP, {DMAStreamId::DMA1_Str6, Channel::CHANNEL6}}, + // {Peripherals::PE_TIM5_TRIG, {DMAStreamId::DMA1_Str1, + // Channel::CHANNEL6}}, // Stream currently not supported + // {Peripherals::PE_TIM5_TRIG, {DMAStreamId::DMA1_Str3, + // Channel::CHANNEL6}}, // Stream currently not supported + {Peripherals::PE_TIM5_CH1, {DMAStreamId::DMA1_Str2, Channel::CHANNEL6}}, + {Peripherals::PE_TIM5_CH2, {DMAStreamId::DMA1_Str4, Channel::CHANNEL6}}, + {Peripherals::PE_TIM5_CH3, {DMAStreamId::DMA1_Str0, Channel::CHANNEL6}}, + // {Peripherals::PE_TIM5_CH4, {DMAStreamId::DMA1_Str1, + // Channel::CHANNEL6}}, // Stream currently not supported + // {Peripherals::PE_TIM5_CH4, {DMAStreamId::DMA1_Str3, + // Channel::CHANNEL6}}, // Stream currently not supported + + // {Peripherals::PE_TIM6_UP, {DMAStreamId::DMA1_Str1, + // Channel::CHANNEL7}}, // Stream currently not supported + + {Peripherals::PE_TIM7_UP, {DMAStreamId::DMA1_Str2, Channel::CHANNEL1}}, + {Peripherals::PE_TIM7_UP, {DMAStreamId::DMA1_Str4, Channel::CHANNEL1}}, + + {Peripherals::PE_TIM8_UP, {DMAStreamId::DMA2_Str1, Channel::CHANNEL7}}, + {Peripherals::PE_TIM8_TRIG, + {DMAStreamId::DMA2_Str7, Channel::CHANNEL7}}, + {Peripherals::PE_TIM8_COM, {DMAStreamId::DMA2_Str7, Channel::CHANNEL7}}, + {Peripherals::PE_TIM8_CH1, {DMAStreamId::DMA2_Str2, Channel::CHANNEL0}}, + {Peripherals::PE_TIM8_CH1, {DMAStreamId::DMA2_Str2, Channel::CHANNEL7}}, + {Peripherals::PE_TIM8_CH2, {DMAStreamId::DMA2_Str2, Channel::CHANNEL0}}, + // {Peripherals::PE_TIM8_CH2, {DMAStreamId::DMA2_Str3, + // Channel::CHANNEL7}}, // Stream currently not supported + {Peripherals::PE_TIM8_CH3, {DMAStreamId::DMA2_Str2, Channel::CHANNEL0}}, + {Peripherals::PE_TIM8_CH3, {DMAStreamId::DMA2_Str4, Channel::CHANNEL7}}, + {Peripherals::PE_TIM8_CH4, {DMAStreamId::DMA2_Str7, Channel::CHANNEL7}}, + + // Others + {Peripherals::PE_DAC1, {DMAStreamId::DMA1_Str5, Channel::CHANNEL7}}, + {Peripherals::PE_DAC2, {DMAStreamId::DMA1_Str6, Channel::CHANNEL7}}, + + {Peripherals::PE_ADC1, {DMAStreamId::DMA2_Str0, Channel::CHANNEL0}}, + {Peripherals::PE_ADC1, {DMAStreamId::DMA2_Str4, Channel::CHANNEL0}}, + + {Peripherals::PE_ADC2, {DMAStreamId::DMA2_Str2, Channel::CHANNEL1}}, + // {Peripherals::PE_ADC2, {DMAStreamId::DMA2_Str3, Channel::CHANNEL1}}, + // // Stream currently not supported + + {Peripherals::PE_ADC3, {DMAStreamId::DMA2_Str0, Channel::CHANNEL2}}, + {Peripherals::PE_ADC3, {DMAStreamId::DMA2_Str1, Channel::CHANNEL2}}, + + {Peripherals::PE_SAI1_A, {DMAStreamId::DMA2_Str1, Channel::CHANNEL0}}, + {Peripherals::PE_SAI1_A, {DMAStreamId::DMA2_Str3, Channel::CHANNEL0}}, + + {Peripherals::PE_SAI1_B, {DMAStreamId::DMA2_Str5, Channel::CHANNEL0}}, + {Peripherals::PE_SAI1_B, {DMAStreamId::DMA2_Str4, Channel::CHANNEL1}}, + + {Peripherals::PE_DCMI, {DMAStreamId::DMA2_Str1, Channel::CHANNEL1}}, + {Peripherals::PE_DCMI, {DMAStreamId::DMA2_Str7, Channel::CHANNEL1}}, + + // {Peripherals::PE_SDIO, {DMAStreamId::DMA2_Str3, Channel::CHANNEL4}}, + // // Stream currently not supported + {Peripherals::PE_SDIO, {DMAStreamId::DMA2_Str6, Channel::CHANNEL4}}, + + {Peripherals::PE_CRYP_OUT, {DMAStreamId::DMA2_Str5, Channel::CHANNEL2}}, + {Peripherals::PE_CRYP_IN, {DMAStreamId::DMA2_Str6, Channel::CHANNEL2}}, + + {Peripherals::PE_HASH_IN, {DMAStreamId::DMA2_Str7, Channel::CHANNEL2}}, + +#endif // STM32F429xx +}; + +} // namespace DMADefs + +} // namespace Boardcore diff --git a/src/shared/drivers/dma/DMADefs.h b/src/shared/drivers/dma/DMADefs.h index bdbca679f3b3e6437ccdbfa3f2c1a54fef2d3886..88797e8abe295b5744dc2c6dc488405a6044f8cf 100644 --- a/src/shared/drivers/dma/DMADefs.h +++ b/src/shared/drivers/dma/DMADefs.h @@ -1,5 +1,5 @@ /* Copyright (c) 2025 Skyward Experimental Rocketry - * Author: Fabrizio Monti + * Author: Alberto Nidasio, Fabrizio Monti * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -58,18 +58,6 @@ enum class DMAStreamId : uint8_t DMA2_Str7 = 15, }; -/** - * @brief Mapping between `DMAStreamId` and the corresponding irq number. - * This is needed because irq number values are not contiguous and they are - * architecture dependent. - */ -const IRQn_Type irqNumberMapping[] = { - DMA1_Stream0_IRQn, DMA1_Stream1_IRQn, DMA1_Stream2_IRQn, DMA1_Stream3_IRQn, - DMA1_Stream4_IRQn, DMA1_Stream5_IRQn, DMA1_Stream6_IRQn, DMA1_Stream7_IRQn, - DMA2_Stream0_IRQn, DMA2_Stream1_IRQn, DMA2_Stream2_IRQn, DMA2_Stream3_IRQn, - DMA2_Stream4_IRQn, DMA2_Stream5_IRQn, DMA2_Stream6_IRQn, DMA2_Stream7_IRQn, -}; - /** * @brief Channels selectable for each dma stream. */ @@ -182,245 +170,20 @@ enum class Peripherals : uint8_t }; +/** + * @brief Mapping between `DMAStreamId` and the corresponding irq number. + * This is needed because irq number values are not contiguous and they are + * architecture dependent. + */ +extern const IRQn_Type irqNumberMapping[]; + /** * @brief Maps the peripherals to the dma streams (and * the corresponding channel) that are connected with. */ -const std::multimap<Peripherals, std::pair<DMAStreamId, Channel>> - mapPeripherals = { - - // MEM-TO-MEM (only dma2 can perform mem-to-mem copy) - {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str0, Channel::CHANNEL0}}, - {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str1, Channel::CHANNEL0}}, - {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str2, Channel::CHANNEL0}}, - // {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str3, - // Channel::CHANNEL0}}, // Stream currently not supported - {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str4, Channel::CHANNEL0}}, - {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str5, Channel::CHANNEL0}}, - {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str6, Channel::CHANNEL0}}, - {Peripherals::PE_MEM_ONLY, {DMAStreamId::DMA2_Str7, Channel::CHANNEL0}}, - - // SPI - {Peripherals::PE_SPI1_TX, {DMAStreamId::DMA2_Str5, Channel::CHANNEL3}}, - // {Peripherals::PE_SPI1_TX, {DMAStreamId::DMA2_Str3, - // Channel::CHANNEL3}}, // Stream currently not supported - {Peripherals::PE_SPI1_RX, {DMAStreamId::DMA2_Str2, Channel::CHANNEL3}}, - {Peripherals::PE_SPI1_RX, {DMAStreamId::DMA2_Str0, Channel::CHANNEL3}}, - - {Peripherals::PE_SPI2_TX, {DMAStreamId::DMA1_Str4, Channel::CHANNEL0}}, - // {Peripherals::PE_SPI2_RX, {DMAStreamId::DMA1_Str3, - // Channel::CHANNEL0}}, // Stream currently not supported - - {Peripherals::PE_SPI3_TX, {DMAStreamId::DMA1_Str5, Channel::CHANNEL0}}, - {Peripherals::PE_SPI3_TX, {DMAStreamId::DMA1_Str7, Channel::CHANNEL0}}, - {Peripherals::PE_SPI3_RX, {DMAStreamId::DMA1_Str0, Channel::CHANNEL0}}, - {Peripherals::PE_SPI3_RX, {DMAStreamId::DMA1_Str2, Channel::CHANNEL0}}, - - // {Peripherals::PE_SPI4_TX, {DMAStreamId::DMA2_Str1, - // Channel::CHANNEL4}}, // available on STM32F42xxx and STM32F43xxx only - // {Peripherals::PE_SPI4_TX, {DMAStreamId::DMA2_Str4, - // Channel::CHANNEL5}}, // available on STM32F42xxx and STM32F43xxx only - // {Peripherals::PE_SPI4_RX, {DMAStreamId::DMA2_Str0, - // Channel::CHANNEL4}}, // available on STM32F42xxx and STM32F43xxx only - // {Peripherals::PE_SPI4_RX, {DMAStreamId::DMA2_Str3, - // Channel::CHANNEL5}}, // available on STM32F42xxx and STM32F43xxx only - - // {Peripherals::PE_SPI5_TX, {DMAStreamId::DMA2_Str4, - // Channel::CHANNEL2}}, // available on STM32F42xxx and STM32F43xxx only - // {Peripherals::PE_SPI5_TX, {DMAStreamId::DMA2_Str6, - // Channel::CHANNEL7}}, // available on STM32F42xxx and STM32F43xxx only - // {Peripherals::PE_SPI5_RX, {DMAStreamId::DMA2_Str3, - // Channel::CHANNEL2}}, // available on STM32F42xxx and STM32F43xxx only - // {Peripherals::PE_SPI5_RX, {DMAStreamId::DMA2_Str5, - // Channel::CHANNEL7}}, // available on STM32F42xxx and STM32F43xxx only - - // {Peripherals::PE_SPI6_TX, {DMAStreamId::DMA2_Str5, - // Channel::CHANNEL1}}, // available on STM32F42xxx and STM32F43xxx only - // {Peripherals::PE_SPI6_RX, {DMAStreamId::DMA2_Str6, - // Channel::CHANNEL1}}, // available on STM32F42xxx and STM32F43xxx only - - // UART & USART - {Peripherals::PE_USART1_TX, - {DMAStreamId::DMA2_Str7, Channel::CHANNEL4}}, - {Peripherals::PE_USART1_RX, - {DMAStreamId::DMA2_Str2, Channel::CHANNEL4}}, - {Peripherals::PE_USART1_RX, - {DMAStreamId::DMA2_Str5, Channel::CHANNEL4}}, - - {Peripherals::PE_USART2_TX, - {DMAStreamId::DMA1_Str6, Channel::CHANNEL4}}, - {Peripherals::PE_USART2_RX, - {DMAStreamId::DMA1_Str5, Channel::CHANNEL4}}, - - // {Peripherals::PE_USART3_TX, {DMAStreamId::DMA1_Str3, - // Channel::CHANNEL4}}, // Stream currently not supported - {Peripherals::PE_USART3_TX, - {DMAStreamId::DMA1_Str4, Channel::CHANNEL7}}, - // {Peripherals::PE_USART3_RX, {DMAStreamId::DMA1_Str1, - // Channel::CHANNEL4}}, // Stream currently not supported - - {Peripherals::PE_UART4_TX, {DMAStreamId::DMA1_Str4, Channel::CHANNEL4}}, - {Peripherals::PE_UART4_RX, {DMAStreamId::DMA1_Str2, Channel::CHANNEL4}}, - - {Peripherals::PE_UART5_TX, {DMAStreamId::DMA1_Str7, Channel::CHANNEL4}}, - {Peripherals::PE_UART5_RX, {DMAStreamId::DMA1_Str0, Channel::CHANNEL4}}, - - // {Peripherals::PE_UART7_TX, {DMAStreamId::DMA1_Str1, - // Channel::CHANNEL5}}, // available on STM32F42xxx and STM32F43xxx only - // {Peripherals::PE_UART7_RX, {DMAStreamId::DMA1_Str3, - // Channel::CHANNEL5}}, // available on STM32F42xxx and STM32F43xxx only - - // {Peripherals::PE_UART8_TX, {DMAStreamId::DMA1_Str0, - // Channel::CHANNEL5}}, // available on STM32F42xxx and STM32F43xxx only - // {Peripherals::PE_UART8_RX, {DMAStreamId::DMA1_Str6, - // Channel::CHANNEL5}}, // available on STM32F42xxx and STM32F43xxx only - - {Peripherals::PE_USART6_TX, - {DMAStreamId::DMA2_Str6, Channel::CHANNEL5}}, - {Peripherals::PE_USART6_TX, - {DMAStreamId::DMA2_Str7, Channel::CHANNEL5}}, - {Peripherals::PE_USART6_RX, - {DMAStreamId::DMA2_Str1, Channel::CHANNEL5}}, - {Peripherals::PE_USART6_RX, - {DMAStreamId::DMA2_Str2, Channel::CHANNEL5}}, - - // I2C - {Peripherals::PE_I2C1_TX, {DMAStreamId::DMA1_Str6, Channel::CHANNEL1}}, - {Peripherals::PE_I2C1_TX, {DMAStreamId::DMA1_Str7, Channel::CHANNEL1}}, - {Peripherals::PE_I2C1_RX, {DMAStreamId::DMA1_Str0, Channel::CHANNEL1}}, - {Peripherals::PE_I2C1_RX, {DMAStreamId::DMA1_Str5, Channel::CHANNEL1}}, - - {Peripherals::PE_I2C2_TX, {DMAStreamId::DMA1_Str7, Channel::CHANNEL7}}, - {Peripherals::PE_I2C2_RX, {DMAStreamId::DMA1_Str2, Channel::CHANNEL7}}, - // {Peripherals::PE_I2C2_RX, {DMAStreamId::DMA1_Str3, - // Channel::CHANNEL7}}, // Stream currently not supported - - {Peripherals::PE_I2C3_TX, {DMAStreamId::DMA1_Str4, Channel::CHANNEL3}}, - {Peripherals::PE_I2C3_RX, {DMAStreamId::DMA1_Str2, Channel::CHANNEL3}}, - - {Peripherals::PE_I2S2_EXT_TX, - {DMAStreamId::DMA1_Str4, Channel::CHANNEL2}}, - // {Peripherals::PE_I2S2_EXT_RX, {DMAStreamId::DMA1_Str3, - // Channel::CHANNEL3}}, // Stream currently not supported - - {Peripherals::PE_I2S3_EXT_TX, - {DMAStreamId::DMA1_Str5, Channel::CHANNEL2}}, - {Peripherals::PE_I2S3_EXT_RX, - {DMAStreamId::DMA1_Str2, Channel::CHANNEL2}}, - {Peripherals::PE_I2S3_EXT_RX, - {DMAStreamId::DMA1_Str0, Channel::CHANNEL3}}, - - // TIMERS - {Peripherals::PE_TIM1_UP, {DMAStreamId::DMA2_Str5, Channel::CHANNEL6}}, - {Peripherals::PE_TIM1_TRIG, - {DMAStreamId::DMA2_Str0, Channel::CHANNEL6}}, - {Peripherals::PE_TIM1_TRIG, - {DMAStreamId::DMA2_Str4, Channel::CHANNEL6}}, - {Peripherals::PE_TIM1_COM, {DMAStreamId::DMA2_Str4, Channel::CHANNEL6}}, - {Peripherals::PE_TIM1_CH1, {DMAStreamId::DMA2_Str6, Channel::CHANNEL0}}, - {Peripherals::PE_TIM1_CH1, {DMAStreamId::DMA2_Str1, Channel::CHANNEL6}}, - // {Peripherals::PE_TIM1_CH1, {DMAStreamId::DMA2_Str3, - // Channel::CHANNEL6}}, // Stream currently not supported - {Peripherals::PE_TIM1_CH2, {DMAStreamId::DMA2_Str6, Channel::CHANNEL0}}, - {Peripherals::PE_TIM1_CH2, {DMAStreamId::DMA2_Str2, Channel::CHANNEL6}}, - {Peripherals::PE_TIM1_CH3, {DMAStreamId::DMA2_Str6, Channel::CHANNEL0}}, - {Peripherals::PE_TIM1_CH3, {DMAStreamId::DMA2_Str6, Channel::CHANNEL6}}, - {Peripherals::PE_TIM1_CH4, {DMAStreamId::DMA2_Str4, Channel::CHANNEL6}}, - - // {Peripherals::PE_TIM2_UP, {DMAStreamId::DMA1_Str1, - // Channel::CHANNEL3}}, // Stream currently not supported - {Peripherals::PE_TIM2_UP, {DMAStreamId::DMA1_Str7, Channel::CHANNEL3}}, - {Peripherals::PE_TIM2_CH1, {DMAStreamId::DMA1_Str5, Channel::CHANNEL3}}, - {Peripherals::PE_TIM2_CH2, {DMAStreamId::DMA1_Str6, Channel::CHANNEL3}}, - // {Peripherals::PE_TIM2_CH3, {DMAStreamId::DMA1_Str1, - // Channel::CHANNEL3}}, // Stream currently not supported - {Peripherals::PE_TIM2_CH4, {DMAStreamId::DMA1_Str6, Channel::CHANNEL3}}, - {Peripherals::PE_TIM2_CH4, {DMAStreamId::DMA1_Str7, Channel::CHANNEL3}}, - - {Peripherals::PE_TIM3_UP, {DMAStreamId::DMA1_Str2, Channel::CHANNEL5}}, - {Peripherals::PE_TIM3_TRIG, - {DMAStreamId::DMA1_Str4, Channel::CHANNEL5}}, - {Peripherals::PE_TIM3_CH1, {DMAStreamId::DMA1_Str4, Channel::CHANNEL5}}, - {Peripherals::PE_TIM3_CH2, {DMAStreamId::DMA1_Str5, Channel::CHANNEL5}}, - {Peripherals::PE_TIM3_CH3, {DMAStreamId::DMA1_Str7, Channel::CHANNEL5}}, - {Peripherals::PE_TIM3_CH4, {DMAStreamId::DMA1_Str2, Channel::CHANNEL5}}, - - {Peripherals::PE_TIM4_UP, {DMAStreamId::DMA1_Str6, Channel::CHANNEL2}}, - {Peripherals::PE_TIM4_CH1, {DMAStreamId::DMA1_Str0, Channel::CHANNEL2}}, - // {Peripherals::PE_TIM4_CH2, {DMAStreamId::DMA1_Str3, - // Channel::CHANNEL2}}, // Stream currently not supported - {Peripherals::PE_TIM4_CH3, {DMAStreamId::DMA1_Str7, Channel::CHANNEL2}}, - - {Peripherals::PE_TIM5_UP, {DMAStreamId::DMA1_Str0, Channel::CHANNEL6}}, - {Peripherals::PE_TIM5_UP, {DMAStreamId::DMA1_Str6, Channel::CHANNEL6}}, - // {Peripherals::PE_TIM5_TRIG, {DMAStreamId::DMA1_Str1, - // Channel::CHANNEL6}}, // Stream currently not supported - // {Peripherals::PE_TIM5_TRIG, {DMAStreamId::DMA1_Str3, - // Channel::CHANNEL6}}, // Stream currently not supported - {Peripherals::PE_TIM5_CH1, {DMAStreamId::DMA1_Str2, Channel::CHANNEL6}}, - {Peripherals::PE_TIM5_CH2, {DMAStreamId::DMA1_Str4, Channel::CHANNEL6}}, - {Peripherals::PE_TIM5_CH3, {DMAStreamId::DMA1_Str0, Channel::CHANNEL6}}, - // {Peripherals::PE_TIM5_CH4, {DMAStreamId::DMA1_Str1, - // Channel::CHANNEL6}}, // Stream currently not supported - // {Peripherals::PE_TIM5_CH4, {DMAStreamId::DMA1_Str3, - // Channel::CHANNEL6}}, // Stream currently not supported - - // {Peripherals::PE_TIM6_UP, {DMAStreamId::DMA1_Str1, - // Channel::CHANNEL7}}, // Stream currently not supported - - {Peripherals::PE_TIM7_UP, {DMAStreamId::DMA1_Str2, Channel::CHANNEL1}}, - {Peripherals::PE_TIM7_UP, {DMAStreamId::DMA1_Str4, Channel::CHANNEL1}}, - - {Peripherals::PE_TIM8_UP, {DMAStreamId::DMA2_Str1, Channel::CHANNEL7}}, - {Peripherals::PE_TIM8_TRIG, - {DMAStreamId::DMA2_Str7, Channel::CHANNEL7}}, - {Peripherals::PE_TIM8_COM, {DMAStreamId::DMA2_Str7, Channel::CHANNEL7}}, - {Peripherals::PE_TIM8_CH1, {DMAStreamId::DMA2_Str2, Channel::CHANNEL0}}, - {Peripherals::PE_TIM8_CH1, {DMAStreamId::DMA2_Str2, Channel::CHANNEL7}}, - {Peripherals::PE_TIM8_CH2, {DMAStreamId::DMA2_Str2, Channel::CHANNEL0}}, - // {Peripherals::PE_TIM8_CH2, {DMAStreamId::DMA2_Str3, - // Channel::CHANNEL7}}, // Stream currently not supported - {Peripherals::PE_TIM8_CH3, {DMAStreamId::DMA2_Str2, Channel::CHANNEL0}}, - {Peripherals::PE_TIM8_CH3, {DMAStreamId::DMA2_Str4, Channel::CHANNEL7}}, - {Peripherals::PE_TIM8_CH4, {DMAStreamId::DMA2_Str7, Channel::CHANNEL7}}, - - // Others - {Peripherals::PE_DAC1, {DMAStreamId::DMA1_Str5, Channel::CHANNEL7}}, - {Peripherals::PE_DAC2, {DMAStreamId::DMA1_Str6, Channel::CHANNEL7}}, - - {Peripherals::PE_ADC1, {DMAStreamId::DMA2_Str0, Channel::CHANNEL0}}, - {Peripherals::PE_ADC1, {DMAStreamId::DMA2_Str4, Channel::CHANNEL0}}, - - {Peripherals::PE_ADC2, {DMAStreamId::DMA2_Str2, Channel::CHANNEL1}}, - // {Peripherals::PE_ADC2, {DMAStreamId::DMA2_Str3, Channel::CHANNEL1}}, - // // Stream currently not supported - - {Peripherals::PE_ADC3, {DMAStreamId::DMA2_Str0, Channel::CHANNEL2}}, - {Peripherals::PE_ADC3, {DMAStreamId::DMA2_Str1, Channel::CHANNEL2}}, - - // {Peripherals::PE_SAI1_A, {DMAStreamId::DMA2_Str1, - // Channel::CHANNEL0}}, // available on STM32F42xxx and STM32F43xxx only - // {Peripherals::PE_SAI1_A, {DMAStreamId::DMA2_Str3, - // Channel::CHANNEL0}}, // available on STM32F42xxx and STM32F43xxx only - - // {Peripherals::PE_SAI1_B, {DMAStreamId::DMA2_Str5, - // Channel::CHANNEL0}}, // available on STM32F42xxx and STM32F43xxx only - // {Peripherals::PE_SAI1_B, {DMAStreamId::DMA2_Str4, - // Channel::CHANNEL1}}, // available on STM32F42xxx and STM32F43xxx only - - {Peripherals::PE_DCMI, {DMAStreamId::DMA2_Str1, Channel::CHANNEL1}}, - {Peripherals::PE_DCMI, {DMAStreamId::DMA2_Str7, Channel::CHANNEL1}}, - - // {Peripherals::PE_SDIO, {DMAStreamId::DMA2_Str3, Channel::CHANNEL4}}, - // // Stream currently not supported - {Peripherals::PE_SDIO, {DMAStreamId::DMA2_Str6, Channel::CHANNEL4}}, - - {Peripherals::PE_CRYP_OUT, {DMAStreamId::DMA2_Str5, Channel::CHANNEL2}}, - {Peripherals::PE_CRYP_IN, {DMAStreamId::DMA2_Str6, Channel::CHANNEL2}}, - - {Peripherals::PE_HASH_IN, {DMAStreamId::DMA2_Str7, Channel::CHANNEL2}}, -}; +extern const std::multimap<Peripherals, std::pair<DMAStreamId, Channel>> + mapPeripherals; } // namespace DMADefs -} // namespace Boardcore \ No newline at end of file +} // namespace Boardcore diff --git a/src/shared/drivers/dma/DMAStream.h b/src/shared/drivers/dma/DMAStream.h deleted file mode 100644 index ad3fd03b853712dfab297e91e9fbee8d9cdd970b..0000000000000000000000000000000000000000 --- a/src/shared/drivers/dma/DMAStream.h +++ /dev/null @@ -1,510 +0,0 @@ -/* Copyright (c) 2021 Skyward Experimental Rocketry - * Author: Alberto Nidasio - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#pragma once - -#include <diagnostic/PrintLogger.h> -#include <interfaces/arch_registers.h> - -namespace Boardcore -{ - -/** - * @brief Driver for STM32 DMA streams. - * - * Direct Memory Access is used in order to provide high-speed data transfer - * between peripherals and memory and betweeen memory and memory. Data can be - * quickly moved by DMA without any CPU interacion. - * - * The STM32F4 family features two DMA controller, each with 8 streams. - * - * DMA features are: - * - Four-word depth 32 FIFO memory buffers per stream, that can be used in FIFO - * mode or direct mode - * - Double buffering - * - Software programmable piorities between DMA stream requests (4 levels) - * - The number of data items to be transferred can be managed either by the DMA - * controller or by the peripheral: - * - DMA flow controller: the number of data items to be transferred is - * software-programmable form 1 to 65535 - * - Peripheral flow controller: the number of data items to be transferred is - * unknown and controlled by the source or the destination peripheral that - * signals the end of the transfer by hardware - * - Incrementing or non incrementing adressing for source and destination - * - Circular buffer management - * - * Note that only DMA2 controller can perform memory-to-memory transactions. - * - * Each DMA transfer consists of three operations: - * - A loading from the peripheral data register or a location in memory - * - A storage of the data loaded to the peripheral data register or a location - * in memory - * - A post-decrement of the counter of transeffer data items (NDTR) - * - * After an event, the peripheral sends a request signal to the DMA controller. - * The DMA controller serves the request depending on the channel priorities. As - * soon as the DMA controller accesses the peripheral, an acknowledge signal is - * sent to the peripheral by the DMA controller. The peripheral releases its - * request as soon as it gets the acknowledge signal. - * - * Each stream is associated with a DMA request that can be selected out of 8 - * possible channel requests. - * - * Note that configuration functions have effect only if the stream is disabled. - */ -class DMAStream -{ -public: - enum class Channel : uint32_t - { - CHANNEL0 = 0, - CHANNEL1 = DMA_SxCR_CHSEL_0, - CHANNEL2 = DMA_SxCR_CHSEL_1, - CHANNEL3 = DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0, - CHANNEL4 = DMA_SxCR_CHSEL_2, - CHANNEL5 = DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_0, - CHANNEL6 = DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_1, - CHANNEL7 = DMA_SxCR_CHSEL, - }; - - enum class MemoryBurstConfiguration : uint32_t - { - SINGLE_TRANSFER = 0, - INCR4 = DMA_SxCR_MBURST_0, - INCR8 = DMA_SxCR_MBURST_1, - INCR16 = DMA_SxCR_MBURST, - }; - - enum class PeripheralBurstConfiguration : uint32_t - { - SINGLE_TRANSFER = 0, - INCR4 = DMA_SxCR_PBURST_0, - INCR8 = DMA_SxCR_PBURST_1, - INCR16 = DMA_SxCR_PBURST, - }; - - enum class PriorityLevel : uint32_t - { - LOW = 0, - MEDIUM = DMA_SxCR_PL_0, - HIGH = DMA_SxCR_PL_1, - VERY_HIGH = DMA_SxCR_PL, - }; - - enum class MemoryDataSize : uint32_t - { - BYTE = 0, - HALF_WORD = DMA_SxCR_MSIZE_0, - WORD = DMA_SxCR_MSIZE_1 - }; - - enum class PeripheralDataSize : uint32_t - { - BYTE = 0, - HALF_WORD = DMA_SxCR_PSIZE_0, - WORD = DMA_SxCR_PSIZE_1 - }; - - enum class DataTransferDirection : uint32_t - { - PERIPH_TO_MEM = 0, - MEM_TO_PERIPH = DMA_SxCR_DIR_0, - MEM_TO_MEM = DMA_SxCR_DIR_1, - }; - - DMAStream(DMA_Stream_TypeDef* dmaStream); - - DMA_TypeDef* getController(); - - DMA_Stream_TypeDef* getStream(); - - void reset(); - - void enable(); - - void disable(); - - void setStreamChannel(Channel channel); - - void setStreamMemoryBurstConfiguration(MemoryBurstConfiguration config); - - void setStreamPeripheralBurstConfiguration( - PeripheralBurstConfiguration config); - - void enableDoubleBufferMode(); - - void disableDoubleBufferMode(); - - void setStreamPriorityLevel(PriorityLevel priorityLevel); - - void setMemoryDataSize(MemoryDataSize size); - - void setPeripheralDataSize(PeripheralDataSize size); - - void enableMemoryIncrement(); - - void disableMemoryIncrement(); - - void enablePeripheralIncrement(); - - void disablePeripheralIncrement(); - - void enableCircularMode(); - - void disableCircularMode(); - - void setDataTransferDirection(DataTransferDirection direction); - - void setPeripheralFlowController(); - - void setDMAFlowController(); - - void disableTransferCompleteInterrupt(); - - void enableTransferCompleteInterrupt(); - - void enableHalfTransferCompleteInterrupt(); - - void disableHalfTransferCompleteInterrupt(); - - void enableTransferErrorInterrupt(); - - void disableTransferErrorInterrupt(); - - void enableDirectModeErrorInterrupt(); - - void disableDirectModeErrorInterrupt(); - - /** - * @brief Sets the number of data items to transfer. - * - * The NDTR register decrements after each DMA transfer. Once the transfer - * has completed, this register can either stay at zero (when the stream is - * in normal mode) or be reloaded automatically with the previusly - * programmed value in the following cases: - * - When the stream is configure in circular mode - * - When the stream is enabled again (by setting EN bit to 1) - * If the value of the NDTR register is zero, no transaction can be served - * even if the stream is enabled. - */ - void setNumberOfDataItems(uint16_t numberOfDataItems); - - uint16_t readNumberOfDataItems(); - - void setPeripheralAddress(uint32_t* address); - - void setMemory0Address(uint32_t* address); - - /** - * @brief Sets the memory address used only in double buffer mode. - */ - void setMemory1Address(uint32_t* address); - - void clearStatusRegister(); - -private: - DMA_TypeDef* dmaController; - DMA_Stream_TypeDef* dmaStream; - - // Interrupt status flags - volatile uint32_t* IFCR; ///< Interrupt flags clear register - uint32_t IFCR_MASK; ///< Clear mask for all interrupt flags - - PrintLogger logger = Logging::getLogger("DMAStream"); -}; - -inline DMAStream::DMAStream(DMA_Stream_TypeDef* dmaStream) - : dmaStream(dmaStream) -{ - // Find the correct DMA controller - if (reinterpret_cast<uint32_t*>(dmaStream) < &(DMA2->LISR)) - dmaController = DMA1; - else - dmaController = DMA2; - - // Find the corret interrupt flags clear register - if (dmaController == DMA1) - if (dmaStream <= DMA1_Stream3) - IFCR = &(DMA1->LIFCR); - else - IFCR = &(DMA1->HIFCR); - else if (dmaStream <= DMA2_Stream3) - IFCR = &(DMA2->LIFCR); - else - IFCR = &(DMA2->HIFCR); - - // Find the correct clear mask - if (dmaStream == DMA1_Stream0 || dmaStream == DMA2_Stream0) - { - IFCR_MASK = DMA_LIFCR_CFEIF0 | DMA_LIFCR_CHTIF0 | DMA_LIFCR_CTCIF0 | - DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0; - } - else if (dmaStream == DMA1_Stream1 || dmaStream == DMA2_Stream1) - { - IFCR_MASK = DMA_LIFCR_CFEIF1 | DMA_LIFCR_CHTIF1 | DMA_LIFCR_CTCIF1 | - DMA_LIFCR_CTEIF1 | DMA_LIFCR_CDMEIF1; - } - else if (dmaStream == DMA1_Stream2 || dmaStream == DMA2_Stream2) - { - IFCR_MASK = DMA_LIFCR_CFEIF2 | DMA_LIFCR_CHTIF2 | DMA_LIFCR_CTCIF2 | - DMA_LIFCR_CTEIF2 | DMA_LIFCR_CDMEIF2; - } - else if (dmaStream == DMA1_Stream3 || dmaStream == DMA2_Stream3) - { - IFCR_MASK = DMA_LIFCR_CFEIF3 | DMA_LIFCR_CHTIF3 | DMA_LIFCR_CTCIF3 | - DMA_LIFCR_CTEIF3 | DMA_LIFCR_CDMEIF3; - } - else if (dmaStream == DMA1_Stream4 || dmaStream == DMA2_Stream4) - { - IFCR_MASK = DMA_HIFCR_CFEIF4 | DMA_HIFCR_CHTIF4 | DMA_HIFCR_CTCIF4 | - DMA_HIFCR_CTEIF4 | DMA_HIFCR_CDMEIF4; - } - else if (dmaStream == DMA1_Stream5 || dmaStream == DMA2_Stream5) - { - IFCR_MASK = DMA_HIFCR_CFEIF5 | DMA_HIFCR_CHTIF5 | DMA_HIFCR_CTCIF5 | - DMA_HIFCR_CTEIF5 | DMA_HIFCR_CDMEIF5; - } - else if (dmaStream == DMA1_Stream6 || dmaStream == DMA2_Stream6) - { - IFCR_MASK = DMA_HIFCR_CFEIF6 | DMA_HIFCR_CHTIF6 | DMA_HIFCR_CTCIF6 | - DMA_HIFCR_CTEIF6 | DMA_HIFCR_CDMEIF6; - } - else if (dmaStream == DMA1_Stream7 || dmaStream == DMA2_Stream7) - { - IFCR_MASK = DMA_HIFCR_CFEIF7 | DMA_HIFCR_CHTIF7 | DMA_HIFCR_CTCIF7 | - DMA_HIFCR_CTEIF7 | DMA_HIFCR_CDMEIF7; - } - else - { - IFCR_MASK = 0; - LOG_CRIT(logger, "Could not recognize DMA stream"); - } -} - -inline DMA_TypeDef* DMAStream::getController() { return dmaController; } - -inline DMA_Stream_TypeDef* DMAStream::getStream() { return dmaStream; } - -inline void DMAStream::reset() -{ - // Disable stream - dmaStream->CR &= ~DMA_SxCR_EN; - - // Wait for the stream to be disabled - while (dmaStream->CR & DMA_SxCR_EN) - ; - - // Clear the registers - dmaStream->CR = 0; - dmaStream->FCR = 0; - clearStatusRegister(); - - // Wait for the stream to be disabled - while (dmaStream->CR & DMA_SxCR_EN) - ; -} - -inline void DMAStream::enable() -{ - // Before enabling the stream ensures all status flags are cleared - clearStatusRegister(); - - // Enable the stream - dmaStream->CR |= DMA_SxCR_EN; -} - -inline void DMAStream::disable() { dmaStream->CR &= ~DMA_SxCR_EN; } - -inline void DMAStream::setStreamChannel(Channel channel) -{ - // First clear the configuration - dmaStream->CR &= ~DMA_SxCR_CHSEL; - - // Set the new value - dmaStream->CR |= static_cast<uint32_t>(channel); -} - -inline void DMAStream::setStreamMemoryBurstConfiguration( - MemoryBurstConfiguration config) -{ - // First clear the configuration - dmaStream->CR &= ~DMA_SxCR_MBURST; - - // Set the new value - dmaStream->CR |= static_cast<uint32_t>(config); -} - -inline void DMAStream::setStreamPeripheralBurstConfiguration( - PeripheralBurstConfiguration config) -{ - // First clear the configuration - dmaStream->CR &= ~DMA_SxCR_PBURST; - - // Set the new value - dmaStream->CR |= static_cast<uint32_t>(config); -} - -inline void DMAStream::enableDoubleBufferMode() -{ - dmaStream->CR |= DMA_SxCR_DBM; -} - -inline void DMAStream::disableDoubleBufferMode() -{ - dmaStream->CR &= ~DMA_SxCR_DBM; -} - -inline void DMAStream::setStreamPriorityLevel(PriorityLevel priorityLevel) -{ - // First clear the configuration - dmaStream->CR &= ~DMA_SxCR_PL; - - // Set the new value - dmaStream->CR |= static_cast<uint32_t>(priorityLevel); -} - -inline void DMAStream::setMemoryDataSize(MemoryDataSize size) -{ - // First clear the configuration - dmaStream->CR &= ~DMA_SxCR_MSIZE; - - // Set the new value - dmaStream->CR |= static_cast<uint32_t>(size); -} - -inline void DMAStream::setPeripheralDataSize(PeripheralDataSize size) -{ - // First clear the configuration - dmaStream->CR &= ~DMA_SxCR_PSIZE; - - // Set the new value - dmaStream->CR |= static_cast<uint32_t>(size); -} - -inline void DMAStream::enableMemoryIncrement() -{ - dmaStream->CR |= DMA_SxCR_MINC; -} - -inline void DMAStream::disableMemoryIncrement() -{ - dmaStream->CR &= ~DMA_SxCR_MINC; -} - -inline void DMAStream::enablePeripheralIncrement() -{ - dmaStream->CR |= DMA_SxCR_PINC; -} - -inline void DMAStream::disablePeripheralIncrement() -{ - dmaStream->CR &= ~DMA_SxCR_PINC; -} - -inline void DMAStream::enableCircularMode() { dmaStream->CR |= DMA_SxCR_CIRC; } - -inline void DMAStream::disableCircularMode() { dmaStream->CR |= DMA_SxCR_CIRC; } - -inline void DMAStream::setDataTransferDirection(DataTransferDirection direction) -{ - // First clear the configuration - dmaStream->CR &= ~DMA_SxCR_DIR; - - // Set the new value - dmaStream->CR |= static_cast<uint32_t>(direction); -} - -inline void DMAStream::setPeripheralFlowController() -{ - dmaStream->CR |= DMA_SxCR_PFCTRL; -} - -inline void DMAStream::setDMAFlowController() -{ - dmaStream->CR &= ~DMA_SxCR_PFCTRL; -} - -inline void DMAStream::enableTransferCompleteInterrupt() -{ - dmaStream->CR |= DMA_SxCR_TCIE; -} - -inline void DMAStream::disableTransferCompleteInterrupt() -{ - dmaStream->CR &= ~DMA_SxCR_TCIE; -} - -inline void DMAStream::enableHalfTransferCompleteInterrupt() -{ - dmaStream->CR |= DMA_SxCR_HTIE; -} - -inline void DMAStream::disableHalfTransferCompleteInterrupt() -{ - dmaStream->CR &= ~DMA_SxCR_HTIE; -} - -inline void DMAStream::enableTransferErrorInterrupt() -{ - dmaStream->CR |= DMA_SxCR_TEIE; -} - -inline void DMAStream::disableTransferErrorInterrupt() -{ - dmaStream->CR &= ~DMA_SxCR_TEIE; -} - -inline void DMAStream::enableDirectModeErrorInterrupt() -{ - dmaStream->CR |= DMA_SxCR_DMEIE; -} - -inline void DMAStream::disableDirectModeErrorInterrupt() -{ - dmaStream->CR &= ~DMA_SxCR_DMEIE; -} - -inline void DMAStream::setNumberOfDataItems(uint16_t numberOfDataItems) -{ - dmaStream->NDTR = numberOfDataItems; -} - -inline uint16_t DMAStream::readNumberOfDataItems() { return dmaStream->NDTR; } - -inline void DMAStream::setPeripheralAddress(uint32_t* address) -{ - dmaStream->PAR = reinterpret_cast<uint32_t>(address); -} - -inline void DMAStream::setMemory0Address(uint32_t* address) -{ - dmaStream->M0AR = reinterpret_cast<uint32_t>(address); -} - -inline void DMAStream::setMemory1Address(uint32_t* address) -{ - dmaStream->M1AR = reinterpret_cast<uint32_t>(address); -} - -inline void DMAStream::clearStatusRegister() { *IFCR |= IFCR_MASK; } - -} // namespace Boardcore diff --git a/src/tests/drivers/test-dma-mem-to-mem.cpp b/src/tests/drivers/test-dma-mem-to-mem.cpp index 7109a1e3d2bb5bc558edbd3519cb320c286e6282..7807b8810b09418db111c7a12e3d9f40ad833e70 100644 --- a/src/tests/drivers/test-dma-mem-to-mem.cpp +++ b/src/tests/drivers/test-dma-mem-to-mem.cpp @@ -1,5 +1,5 @@ -/* Copyright (c) 2023 Skyward Experimental Rocketry - * Authors: Alberto Nidasio +/* Copyright (c) 2025 Skyward Experimental Rocketry + * Authors: Alberto Nidasio, Fabrizio Monti * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal