@@ -146,20 +146,20 @@ static const DMA_InitTypeDef dma_init_struct_dac = {
146
146
#define NSTREAMS_PER_CONTROLLER (7)
147
147
#define NSTREAM (NCONTROLLERS * NSTREAMS_PER_CONTROLLER)
148
148
149
- #define DMA_SUB_INSTANCE_AS_UINT8 (dma_channel ) (dma_channel)
149
+ #define DMA_SUB_INSTANCE_AS_UINT8 (dma_channel ) (( dma_channel) >> ((dma_channel >> 28) * 4) )
150
150
151
151
#define DMA1_ENABLE_MASK (0x007f) // Bits in dma_enable_mask corresponding to DMA1 (7 channels)
152
152
#define DMA2_ENABLE_MASK (0x0f80) // Bits in dma_enable_mask corresponding to DMA2 (only 5 channels)
153
153
154
154
// DMA1 streams
155
155
#if MICROPY_HW_ENABLE_DAC
156
- const dma_descr_t dma_DAC_1_TX = { DMA1_Channel3 , HAL_DMA1_CH3_DAC_CH1 , dma_id_3 , & dma_init_struct_dac };
157
- const dma_descr_t dma_DAC_2_TX = { DMA1_Channel4 , HAL_DMA1_CH4_DAC_CH2 , dma_id_4 , & dma_init_struct_dac };
156
+ const dma_descr_t dma_DAC_1_TX = { DMA1_Channel3 , HAL_DMA1_CH3_DAC_CH1 , dma_id_2 , & dma_init_struct_dac };
157
+ const dma_descr_t dma_DAC_2_TX = { DMA1_Channel4 , HAL_DMA1_CH4_DAC_CH2 , dma_id_3 , & dma_init_struct_dac };
158
158
#endif
159
- const dma_descr_t dma_SPI_2_TX = { DMA1_Channel5 , HAL_DMA1_CH5_SPI2_TX , dma_id_5 , & dma_init_struct_spi_i2c };
160
- const dma_descr_t dma_SPI_2_RX = { DMA1_Channel6 , HAL_DMA1_CH6_SPI2_RX , dma_id_6 , & dma_init_struct_spi_i2c };
161
- const dma_descr_t dma_SPI_1_RX = { DMA2_Channel3 , HAL_DMA2_CH3_SPI1_RX , dma_id_3 , & dma_init_struct_spi_i2c };
162
- const dma_descr_t dma_SPI_1_TX = { DMA2_Channel4 , HAL_DMA2_CH4_SPI1_TX , dma_id_4 , & dma_init_struct_spi_i2c };
159
+ const dma_descr_t dma_SPI_2_TX = { DMA1_Channel5 , HAL_DMA1_CH5_SPI2_TX , dma_id_4 , & dma_init_struct_spi_i2c };
160
+ const dma_descr_t dma_SPI_2_RX = { DMA1_Channel6 , HAL_DMA1_CH6_SPI2_RX , dma_id_5 , & dma_init_struct_spi_i2c };
161
+ const dma_descr_t dma_SPI_1_RX = { DMA2_Channel3 , HAL_DMA2_CH3_SPI1_RX , dma_id_9 , & dma_init_struct_spi_i2c };
162
+ const dma_descr_t dma_SPI_1_TX = { DMA2_Channel4 , HAL_DMA2_CH4_SPI1_TX , dma_id_10 , & dma_init_struct_spi_i2c };
163
163
164
164
static const uint8_t dma_irqn [NSTREAM ] = {
165
165
DMA1_Ch1_IRQn ,
@@ -425,7 +425,47 @@ volatile dma_idle_count_t dma_idle;
425
425
#define DMA2_IS_CLK_ENABLED () ((RCC->AHB1ENR & RCC_AHB1ENR_DMA2EN) != 0)
426
426
#endif
427
427
428
- #if defined(STM32F4 ) || defined(STM32F7 ) || defined(STM32H7 )
428
+ #if defined(STM32F0 )
429
+
430
+ void DMA1_Ch1_IRQHandler (void ) {
431
+ IRQ_ENTER (DMA1_Ch1_IRQn );
432
+ if (dma_handle [dma_id_0 ] != NULL ) {
433
+ HAL_DMA_IRQHandler (dma_handle [dma_id_0 ]);
434
+ }
435
+ }
436
+
437
+ void DMA1_Ch2_3_DMA2_Ch1_2_IRQHandler (void ) {
438
+ IRQ_ENTER (DMA1_Ch2_3_DMA2_Ch1_2_IRQn );
439
+ if (dma_handle [dma_id_1 ] != NULL ) {
440
+ HAL_DMA_IRQHandler (dma_handle [dma_id_1 ]);
441
+ }
442
+ if (dma_handle [dma_id_2 ] != NULL ) {
443
+ HAL_DMA_IRQHandler (dma_handle [dma_id_2 ]);
444
+ }
445
+ if (dma_handle [dma_id_7 ] != NULL ) {
446
+ HAL_DMA_IRQHandler (dma_handle [dma_id_7 ]);
447
+ }
448
+ if (dma_handle [dma_id_8 ] != NULL ) {
449
+ HAL_DMA_IRQHandler (dma_handle [dma_id_8 ]);
450
+ }
451
+ IRQ_EXIT (DMA1_Ch2_3_DMA2_Ch1_2_IRQn );
452
+ }
453
+
454
+ void DMA1_Ch4_7_DMA2_Ch3_5_IRQHandler (void ) {
455
+ IRQ_ENTER (DMA1_Ch4_7_DMA2_Ch3_5_IRQn );
456
+ for (unsigned int i = 0 ; i < 4 ; ++ i ) {
457
+ if (dma_handle [dma_id_3 + i ] != NULL ) {
458
+ HAL_DMA_IRQHandler (dma_handle [dma_id_3 + i ]);
459
+ }
460
+ // When i==3 this will check an invalid handle, but it will always be NULL
461
+ if (dma_handle [dma_id_9 + i ] != NULL ) {
462
+ HAL_DMA_IRQHandler (dma_handle [dma_id_9 + i ]);
463
+ }
464
+ }
465
+ IRQ_EXIT (DMA1_Ch4_7_DMA2_Ch3_5_IRQn );
466
+ }
467
+
468
+ #elif defined(STM32F4 ) || defined(STM32F7 ) || defined(STM32H7 )
429
469
430
470
void DMA1_Stream0_IRQHandler (void ) { IRQ_ENTER (DMA1_Stream0_IRQn ); if (dma_handle [dma_id_0 ] != NULL ) { HAL_DMA_IRQHandler (dma_handle [dma_id_0 ]); } IRQ_EXIT (DMA1_Stream0_IRQn ); }
431
471
void DMA1_Stream1_IRQHandler (void ) { IRQ_ENTER (DMA1_Stream1_IRQn ); if (dma_handle [dma_id_1 ] != NULL ) { HAL_DMA_IRQHandler (dma_handle [dma_id_1 ]); } IRQ_EXIT (DMA1_Stream1_IRQn ); }
@@ -570,11 +610,20 @@ void dma_init(DMA_HandleTypeDef *dma, const dma_descr_t *dma_descr, uint32_t dir
570
610
} else {
571
611
// only necessary initialization
572
612
dma -> State = HAL_DMA_STATE_READY ;
573
- #if defined(STM32F4 ) || defined(STM32F7 )
613
+ #if defined(STM32F0 )
614
+ // These variables are used to access the relevant 4 bits in ISR and IFCR
615
+ if (dma_id < NSTREAMS_PER_CONTROLLER ) {
616
+ dma -> DmaBaseAddress = DMA1 ;
617
+ dma -> ChannelIndex = dma_id * 4 ;
618
+ } else {
619
+ dma -> DmaBaseAddress = DMA2 ;
620
+ dma -> ChannelIndex = (dma_id - NSTREAMS_PER_CONTROLLER ) * 4 ;
621
+ }
622
+ #elif defined(STM32F4 ) || defined(STM32F7 )
574
623
// calculate DMA base address and bitshift to be used in IRQ handler
575
624
extern uint32_t DMA_CalcBaseAndBitshift (DMA_HandleTypeDef * hdma );
576
625
DMA_CalcBaseAndBitshift (dma );
577
- #endif
626
+ #endif
578
627
}
579
628
#endif
580
629
@@ -584,7 +633,9 @@ void dma_init(DMA_HandleTypeDef *dma, const dma_descr_t *dma_descr, uint32_t dir
584
633
585
634
void dma_deinit (const dma_descr_t * dma_descr ) {
586
635
if (dma_descr != NULL ) {
636
+ #if !defined(STM32F0 )
587
637
HAL_NVIC_DisableIRQ (dma_irqn [dma_descr -> id ]);
638
+ #endif
588
639
dma_handle [dma_descr -> id ] = NULL ;
589
640
590
641
dma_disable_clock (dma_descr -> id );
0 commit comments