@@ -80,7 +80,7 @@ typedef union {
80
80
struct _dma_descr_t {
81
81
#if defined(STM32F4 ) || defined(STM32F7 ) || defined(STM32H7 )
82
82
DMA_Stream_TypeDef * instance ;
83
- #elif defined(STM32F0 ) || defined(STM32G0 ) || defined(STM32G4 ) || defined(STM32L0 ) || defined(STM32L1 ) || defined(STM32L4 ) || defined(STM32WB ) || defined(STM32WL )
83
+ #elif defined(STM32F0 ) || defined(STM32G0 ) || defined(STM32G4 ) || defined(STM32H5 ) || defined( STM32L0 ) || defined(STM32L1 ) || defined(STM32L4 ) || defined(STM32WB ) || defined(STM32WL )
84
84
DMA_Channel_TypeDef * instance ;
85
85
#else
86
86
#error "Unsupported Processor"
@@ -92,6 +92,23 @@ struct _dma_descr_t {
92
92
93
93
// Default parameters to dma_init() shared by spi and i2c; Channel and Direction
94
94
// vary depending on the peripheral instance so they get passed separately
95
+ #if defined(STM32H5 )
96
+ static const DMA_InitTypeDef dma_init_struct_spi_i2c = {
97
+ .Request = 0 , // set by dma_init_handle
98
+ .BlkHWRequest = DMA_BREQ_SINGLE_BURST ,
99
+ .Direction = 0 , // set by dma_init_handle
100
+ .SrcInc = 0 , // set by dma_init_handle
101
+ .DestInc = 0 , // set by dma_init_handle
102
+ .SrcDataWidth = DMA_SRC_DATAWIDTH_BYTE ,
103
+ .DestDataWidth = DMA_DEST_DATAWIDTH_BYTE ,
104
+ .Priority = DMA_LOW_PRIORITY_LOW_WEIGHT ,
105
+ .SrcBurstLength = 1 ,
106
+ .DestBurstLength = 1 ,
107
+ .TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT0 | DMA_DEST_ALLOCATED_PORT0 ,
108
+ .TransferEventMode = DMA_TCEM_BLOCK_TRANSFER ,
109
+ .Mode = DMA_NORMAL , // DMA_NORMAL or DMA_PFCTRL (peripheral flow control mode)
110
+ };
111
+ #else
95
112
static const DMA_InitTypeDef dma_init_struct_spi_i2c = {
96
113
#if defined(STM32F4 ) || defined (STM32F7 )
97
114
.Channel = 0 ,
@@ -112,6 +129,7 @@ static const DMA_InitTypeDef dma_init_struct_spi_i2c = {
112
129
.PeriphBurst = DMA_PBURST_INC4
113
130
#endif
114
131
};
132
+ #endif
115
133
116
134
#if MICROPY_HW_ENABLE_I2S
117
135
// Default parameters to dma_init() for i2s; Channel and Direction
@@ -678,6 +696,39 @@ static const uint8_t dma_irqn[NSTREAM] = {
678
696
#endif
679
697
};
680
698
699
+ #elif defined(STM32H5 )
700
+
701
+ #define NCONTROLLERS (2)
702
+ #define NSTREAMS_PER_CONTROLLER (8)
703
+ #define NSTREAM (NCONTROLLERS * NSTREAMS_PER_CONTROLLER)
704
+
705
+ #define DMA_SUB_INSTANCE_AS_UINT8 (dma_channel ) (dma_channel)
706
+
707
+ #define DMA1_ENABLE_MASK (0x00ff) // Bits in dma_enable_mask corresponding to GPDMA1
708
+ #define DMA2_ENABLE_MASK (0xff00) // Bits in dma_enable_mask corresponding to GPDMA2
709
+
710
+ const dma_descr_t dma_SPI_2_RX = { GPDMA1_Channel0 , GPDMA1_REQUEST_SPI2_RX , dma_id_0 , & dma_init_struct_spi_i2c };
711
+ const dma_descr_t dma_SPI_2_TX = { GPDMA1_Channel1 , GPDMA1_REQUEST_SPI2_TX , dma_id_1 , & dma_init_struct_spi_i2c };
712
+
713
+ static const uint8_t dma_irqn [NSTREAM ] = {
714
+ GPDMA1_Channel0_IRQn ,
715
+ GPDMA1_Channel1_IRQn ,
716
+ GPDMA1_Channel2_IRQn ,
717
+ GPDMA1_Channel3_IRQn ,
718
+ GPDMA1_Channel4_IRQn ,
719
+ GPDMA1_Channel5_IRQn ,
720
+ GPDMA1_Channel6_IRQn ,
721
+ GPDMA1_Channel7_IRQn ,
722
+ GPDMA2_Channel0_IRQn ,
723
+ GPDMA2_Channel1_IRQn ,
724
+ GPDMA2_Channel2_IRQn ,
725
+ GPDMA2_Channel3_IRQn ,
726
+ GPDMA2_Channel4_IRQn ,
727
+ GPDMA2_Channel5_IRQn ,
728
+ GPDMA2_Channel6_IRQn ,
729
+ GPDMA2_Channel7_IRQn ,
730
+ };
731
+
681
732
#elif defined(STM32H7 )
682
733
683
734
#define NCONTROLLERS (2)
@@ -761,6 +812,13 @@ volatile dma_idle_count_t dma_idle;
761
812
#if defined(DMA2 )
762
813
#define DMA2_IS_CLK_ENABLED () ((RCC->AHBENR & RCC_AHBENR_DMA2EN) != 0)
763
814
#endif
815
+ #elif defined(STM32H5 )
816
+ #define DMA1_IS_CLK_ENABLED () (__HAL_RCC_GPDMA1_IS_CLK_ENABLED())
817
+ #define DMA2_IS_CLK_ENABLED () (__HAL_RCC_GPDMA2_IS_CLK_ENABLED())
818
+ #define __HAL_RCC_DMA1_CLK_ENABLE __HAL_RCC_GPDMA1_CLK_ENABLE
819
+ #define __HAL_RCC_DMA2_CLK_ENABLE __HAL_RCC_GPDMA2_CLK_ENABLE
820
+ #define __HAL_RCC_DMA1_CLK_DISABLE __HAL_RCC_GPDMA1_CLK_DISABLE
821
+ #define __HAL_RCC_DMA2_CLK_DISABLE __HAL_RCC_GPDMA2_CLK_DISABLE
764
822
#else
765
823
#define DMA1_IS_CLK_ENABLED () ((RCC->AHB1ENR & RCC_AHB1ENR_DMA1EN) != 0)
766
824
#define DMA2_IS_CLK_ENABLED () ((RCC->AHB1ENR & RCC_AHB1ENR_DMA2EN) != 0)
@@ -1093,6 +1151,34 @@ void DMA2_Channel8_IRQHandler(void) {
1093
1151
}
1094
1152
#endif
1095
1153
1154
+ #elif defined(STM32H5 )
1155
+
1156
+ #define DEFINE_IRQ_HANDLER (periph , channel , id ) \
1157
+ void GPDMA##periph##_Channel##channel##_IRQHandler(void) { \
1158
+ IRQ_ENTER(GPDMA##periph##_Channel##channel##_IRQn); \
1159
+ if (dma_handle[id] != NULL) { \
1160
+ HAL_DMA_IRQHandler(dma_handle[id]); \
1161
+ } \
1162
+ IRQ_EXIT(GPDMA##periph##_Channel##channel##_IRQn); \
1163
+ }
1164
+
1165
+ DEFINE_IRQ_HANDLER (1 , 0 , dma_id_0 )
1166
+ DEFINE_IRQ_HANDLER (1 , 1 , dma_id_1 )
1167
+ DEFINE_IRQ_HANDLER (1 , 2 , dma_id_2 )
1168
+ DEFINE_IRQ_HANDLER (1 , 3 , dma_id_3 )
1169
+ DEFINE_IRQ_HANDLER (1 , 4 , dma_id_4 )
1170
+ DEFINE_IRQ_HANDLER (1 , 5 , dma_id_5 )
1171
+ DEFINE_IRQ_HANDLER (1 , 6 , dma_id_6 )
1172
+ DEFINE_IRQ_HANDLER (1 , 7 , dma_id_7 )
1173
+ DEFINE_IRQ_HANDLER (2 , 0 , dma_id_8 )
1174
+ DEFINE_IRQ_HANDLER (2 , 1 , dma_id_9 )
1175
+ DEFINE_IRQ_HANDLER (2 , 2 , dma_id_10 )
1176
+ DEFINE_IRQ_HANDLER (2 , 3 , dma_id_11 )
1177
+ DEFINE_IRQ_HANDLER (2 , 4 , dma_id_12 )
1178
+ DEFINE_IRQ_HANDLER (2 , 5 , dma_id_13 )
1179
+ DEFINE_IRQ_HANDLER (2 , 6 , dma_id_14 )
1180
+ DEFINE_IRQ_HANDLER (2 , 7 , dma_id_15 )
1181
+
1096
1182
#elif defined(STM32L0 )
1097
1183
1098
1184
void DMA1_Channel1_IRQHandler (void ) {
@@ -1276,7 +1362,7 @@ static void dma_enable_clock(dma_id_t dma_id) {
1276
1362
}
1277
1363
}
1278
1364
}
1279
- #if defined(DMA2 )
1365
+ #if defined(DMA2 ) || defined( GPDMA2 )
1280
1366
else {
1281
1367
if (((old_enable_mask & DMA2_ENABLE_MASK ) == 0 ) && !DMA2_IS_CLK_ENABLED ()) {
1282
1368
__HAL_RCC_DMA2_CLK_ENABLE ();
@@ -1310,13 +1396,25 @@ void dma_init_handle(DMA_HandleTypeDef *dma, const dma_descr_t *dma_descr, uint3
1310
1396
dma -> Instance = dma_descr -> instance ;
1311
1397
dma -> Init = * dma_descr -> init ;
1312
1398
dma -> Init .Direction = dir ;
1313
- #if defined(STM32G0 ) || defined(STM32G4 ) || defined(STM32H7 ) || defined(STM32L0 ) || defined(STM32L4 ) || defined(STM32WB ) || defined(STM32WL )
1399
+ #if defined(STM32G0 ) || defined(STM32G4 ) || defined(STM32H5 ) || defined( STM32H7 ) || defined(STM32L0 ) || defined(STM32L4 ) || defined(STM32WB ) || defined(STM32WL )
1314
1400
dma -> Init .Request = dma_descr -> sub_instance ;
1315
1401
#else
1316
1402
#if !defined(STM32F0 ) && !defined(STM32L1 )
1317
1403
dma -> Init .Channel = dma_descr -> sub_instance ;
1318
1404
#endif
1319
1405
#endif
1406
+
1407
+ #if defined(STM32H5 )
1408
+ // Configure src/dest settings based on the DMA direction.
1409
+ if (dir == DMA_MEMORY_TO_PERIPH ) {
1410
+ dma -> Init .SrcInc = DMA_SINC_INCREMENTED ;
1411
+ dma -> Init .DestInc = DMA_DINC_FIXED ;
1412
+ } else if (dir == DMA_PERIPH_TO_MEMORY ) {
1413
+ dma -> Init .SrcInc = DMA_SINC_FIXED ;
1414
+ dma -> Init .DestInc = DMA_DINC_INCREMENTED ;
1415
+ }
1416
+ #endif
1417
+
1320
1418
// half of __HAL_LINKDMA(data, xxx, *dma)
1321
1419
// caller must implement other half by doing: data->xxx = dma
1322
1420
dma -> Parent = data ;
@@ -1337,11 +1435,12 @@ void dma_init(DMA_HandleTypeDef *dma, const dma_descr_t *dma_descr, uint32_t dir
1337
1435
1338
1436
dma_enable_clock (dma_id );
1339
1437
1340
- #if defined(STM32G0 ) || defined(STM32G4 ) || defined(STM32H7 ) || defined(STM32L0 ) || defined(STM32L1 ) || defined(STM32L4 ) || defined(STM32WB ) || defined(STM32WL )
1438
+ #if defined(STM32G0 ) || defined(STM32G4 ) || defined(STM32H5 ) || defined( STM32H7 ) || defined(STM32L0 ) || defined(STM32L1 ) || defined(STM32L4 ) || defined(STM32WB ) || defined(STM32WL )
1341
1439
// Always reset and configure the H7 and G0/G4/H7/L0/L4/WB/WL DMA peripheral
1342
1440
// (dma->State is set to HAL_DMA_STATE_RESET by memset above)
1343
1441
// TODO: understand how L0/L4 DMA works so this is not needed
1344
1442
HAL_DMA_DeInit (dma );
1443
+ dma -> Parent = data ; // HAL_DMA_DeInit may clear Parent, so set it again
1345
1444
HAL_DMA_Init (dma );
1346
1445
NVIC_SetPriority (IRQn_NONNEG (dma_irqn [dma_id ]), IRQ_PRI_DMA );
1347
1446
#else
@@ -1418,7 +1517,7 @@ static void dma_idle_handler(uint32_t tick) {
1418
1517
1419
1518
static const uint32_t controller_mask [] = {
1420
1519
DMA1_ENABLE_MASK ,
1421
- #if defined(DMA2 )
1520
+ #if defined(DMA2 ) || defined ( GPDMA2 )
1422
1521
DMA2_ENABLE_MASK ,
1423
1522
#endif
1424
1523
};
@@ -1435,15 +1534,15 @@ static void dma_idle_handler(uint32_t tick) {
1435
1534
if (controller == 0 ) {
1436
1535
__HAL_RCC_DMA1_CLK_DISABLE ();
1437
1536
#if defined(STM32G4 )
1438
- #if defined(DMA2 )
1537
+ #if defined(DMA2 ) || defined( GPDMA2 )
1439
1538
if (__HAL_RCC_DMA2_IS_CLK_DISABLED ())
1440
1539
#endif
1441
1540
{
1442
1541
__HAL_RCC_DMAMUX1_CLK_DISABLE ();
1443
1542
}
1444
1543
#endif
1445
1544
}
1446
- #if defined(DMA2 )
1545
+ #if defined(DMA2 ) || defined( GPDMA2 )
1447
1546
else {
1448
1547
__HAL_RCC_DMA2_CLK_DISABLE ();
1449
1548
#if defined(STM32G4 )
@@ -1514,7 +1613,7 @@ void dma_nohal_start(const dma_descr_t *descr, uint32_t src_addr, uint32_t dst_a
1514
1613
dma -> CCR |= DMA_CCR_EN ;
1515
1614
}
1516
1615
1517
- #elif defined(STM32G0 ) || defined(STM32WB ) || defined(STM32WL )
1616
+ #elif defined(STM32G0 ) || defined(STM32H5 ) || defined( STM32WB ) || defined(STM32WL )
1518
1617
1519
1618
// These functions are currently not implemented or needed for this MCU.
1520
1619
0 commit comments