File indexing completed on 2025-05-11 08:23:07
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095 #include "stm32h7xx_hal.h"
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107 #ifdef HAL_DMA_MODULE_ENABLED
0108
0109
0110
0111
0112
0113 typedef struct
0114 {
0115 __IO uint32_t ISR;
0116 __IO uint32_t Reserved0;
0117 __IO uint32_t IFCR;
0118 } DMA_Base_Registers;
0119
0120 typedef struct
0121 {
0122 __IO uint32_t ISR;
0123 __IO uint32_t IFCR;
0124 } BDMA_Base_Registers;
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134 #define HAL_TIMEOUT_DMA_ABORT (5U)
0135
0136 #define BDMA_PERIPH_TO_MEMORY (0x00000000U)
0137 #define BDMA_MEMORY_TO_PERIPH ((uint32_t)BDMA_CCR_DIR)
0138 #define BDMA_MEMORY_TO_MEMORY ((uint32_t)BDMA_CCR_MEM2MEM)
0139
0140
0141 #define DMA_TO_BDMA_DIRECTION(__DMA_DIRECTION__) (((__DMA_DIRECTION__) == DMA_MEMORY_TO_PERIPH)? BDMA_MEMORY_TO_PERIPH: \
0142 ((__DMA_DIRECTION__) == DMA_MEMORY_TO_MEMORY)? BDMA_MEMORY_TO_MEMORY: \
0143 BDMA_PERIPH_TO_MEMORY)
0144
0145 #define DMA_TO_BDMA_PERIPHERAL_INC(__DMA_PERIPHERAL_INC__) ((__DMA_PERIPHERAL_INC__) >> 3U)
0146 #define DMA_TO_BDMA_MEMORY_INC(__DMA_MEMORY_INC__) ((__DMA_MEMORY_INC__) >> 3U)
0147
0148 #define DMA_TO_BDMA_PDATA_SIZE(__DMA_PDATA_SIZE__) ((__DMA_PDATA_SIZE__) >> 3U)
0149 #define DMA_TO_BDMA_MDATA_SIZE(__DMA_MDATA_SIZE__) ((__DMA_MDATA_SIZE__) >> 3U)
0150
0151 #define DMA_TO_BDMA_MODE(__DMA_MODE__) ((__DMA_MODE__) >> 3U)
0152
0153 #define DMA_TO_BDMA_PRIORITY(__DMA_PRIORITY__) ((__DMA_PRIORITY__) >> 4U)
0154
0155 #if defined(UART9)
0156 #define IS_DMA_UART_USART_REQUEST(__REQUEST__) ((((__REQUEST__) >= DMA_REQUEST_USART1_RX) && ((__REQUEST__) <= DMA_REQUEST_USART3_TX)) || \
0157 (((__REQUEST__) >= DMA_REQUEST_UART4_RX) && ((__REQUEST__) <= DMA_REQUEST_UART5_TX )) || \
0158 (((__REQUEST__) >= DMA_REQUEST_USART6_RX) && ((__REQUEST__) <= DMA_REQUEST_USART6_TX)) || \
0159 (((__REQUEST__) >= DMA_REQUEST_UART7_RX) && ((__REQUEST__) <= DMA_REQUEST_UART8_TX )) || \
0160 (((__REQUEST__) >= DMA_REQUEST_UART9_RX) && ((__REQUEST__) <= DMA_REQUEST_USART10_TX )))
0161 #else
0162 #define IS_DMA_UART_USART_REQUEST(__REQUEST__) ((((__REQUEST__) >= DMA_REQUEST_USART1_RX) && ((__REQUEST__) <= DMA_REQUEST_USART3_TX)) || \
0163 (((__REQUEST__) >= DMA_REQUEST_UART4_RX) && ((__REQUEST__) <= DMA_REQUEST_UART5_TX )) || \
0164 (((__REQUEST__) >= DMA_REQUEST_USART6_RX) && ((__REQUEST__) <= DMA_REQUEST_USART6_TX)) || \
0165 (((__REQUEST__) >= DMA_REQUEST_UART7_RX) && ((__REQUEST__) <= DMA_REQUEST_UART8_TX )))
0166
0167 #endif
0168
0169
0170
0171
0172
0173
0174
0175
0176 static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength);
0177 static uint32_t DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma);
0178 static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma);
0179 static void DMA_CalcDMAMUXChannelBaseAndMask(DMA_HandleTypeDef *hdma);
0180 static void DMA_CalcDMAMUXRequestGenBaseAndMask(DMA_HandleTypeDef *hdma);
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217 HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma)
0218 {
0219 uint32_t registerValue;
0220 uint32_t tickstart = HAL_GetTick();
0221 DMA_Base_Registers *regs_dma;
0222 BDMA_Base_Registers *regs_bdma;
0223
0224
0225 if(hdma == NULL)
0226 {
0227 return HAL_ERROR;
0228 }
0229
0230
0231 assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance));
0232 assert_param(IS_DMA_DIRECTION(hdma->Init.Direction));
0233 assert_param(IS_DMA_PERIPHERAL_INC_STATE(hdma->Init.PeriphInc));
0234 assert_param(IS_DMA_MEMORY_INC_STATE(hdma->Init.MemInc));
0235 assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(hdma->Init.PeriphDataAlignment));
0236 assert_param(IS_DMA_MEMORY_DATA_SIZE(hdma->Init.MemDataAlignment));
0237 assert_param(IS_DMA_MODE(hdma->Init.Mode));
0238 assert_param(IS_DMA_PRIORITY(hdma->Init.Priority));
0239
0240 if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U)
0241 {
0242 assert_param(IS_DMA_REQUEST(hdma->Init.Request));
0243 assert_param(IS_DMA_FIFO_MODE_STATE(hdma->Init.FIFOMode));
0244
0245
0246 if(hdma->Init.FIFOMode != DMA_FIFOMODE_DISABLE)
0247 {
0248 assert_param(IS_DMA_FIFO_THRESHOLD(hdma->Init.FIFOThreshold));
0249 assert_param(IS_DMA_MEMORY_BURST(hdma->Init.MemBurst));
0250 assert_param(IS_DMA_PERIPHERAL_BURST(hdma->Init.PeriphBurst));
0251 }
0252
0253
0254 hdma->State = HAL_DMA_STATE_BUSY;
0255
0256
0257 __HAL_UNLOCK(hdma);
0258
0259
0260 __HAL_DMA_DISABLE(hdma);
0261
0262
0263 while((((DMA_Stream_TypeDef *)hdma->Instance)->CR & DMA_SxCR_EN) != 0U)
0264 {
0265
0266 if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA_ABORT)
0267 {
0268
0269 hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT;
0270
0271
0272 hdma->State = HAL_DMA_STATE_ERROR;
0273
0274 return HAL_ERROR;
0275 }
0276 }
0277
0278
0279 registerValue = ((DMA_Stream_TypeDef *)hdma->Instance)->CR;
0280
0281
0282 registerValue &= ((uint32_t)~(DMA_SxCR_MBURST | DMA_SxCR_PBURST | \
0283 DMA_SxCR_PL | DMA_SxCR_MSIZE | DMA_SxCR_PSIZE | \
0284 DMA_SxCR_MINC | DMA_SxCR_PINC | DMA_SxCR_CIRC | \
0285 DMA_SxCR_DIR | DMA_SxCR_CT | DMA_SxCR_DBM));
0286
0287
0288 registerValue |= hdma->Init.Direction |
0289 hdma->Init.PeriphInc | hdma->Init.MemInc |
0290 hdma->Init.PeriphDataAlignment | hdma->Init.MemDataAlignment |
0291 hdma->Init.Mode | hdma->Init.Priority;
0292
0293
0294 if(hdma->Init.FIFOMode == DMA_FIFOMODE_ENABLE)
0295 {
0296
0297 registerValue |= hdma->Init.MemBurst | hdma->Init.PeriphBurst;
0298 }
0299
0300
0301
0302 #if (STM32H7_DEV_ID == 0x450UL)
0303 if((DBGMCU->IDCODE & 0xFFFF0000U) >= 0x20000000U)
0304 {
0305 #endif
0306 if(IS_DMA_UART_USART_REQUEST(hdma->Init.Request) != 0U)
0307 {
0308 registerValue |= DMA_SxCR_TRBUFF;
0309 }
0310 #if (STM32H7_DEV_ID == 0x450UL)
0311 }
0312 #endif
0313
0314
0315 ((DMA_Stream_TypeDef *)hdma->Instance)->CR = registerValue;
0316
0317
0318 registerValue = ((DMA_Stream_TypeDef *)hdma->Instance)->FCR;
0319
0320
0321 registerValue &= (uint32_t)~(DMA_SxFCR_DMDIS | DMA_SxFCR_FTH);
0322
0323
0324 registerValue |= hdma->Init.FIFOMode;
0325
0326
0327 if(hdma->Init.FIFOMode == DMA_FIFOMODE_ENABLE)
0328 {
0329
0330 registerValue |= hdma->Init.FIFOThreshold;
0331
0332
0333
0334 if(hdma->Init.MemBurst != DMA_MBURST_SINGLE)
0335 {
0336 if (DMA_CheckFifoParam(hdma) != HAL_OK)
0337 {
0338
0339 hdma->ErrorCode = HAL_DMA_ERROR_PARAM;
0340
0341
0342 hdma->State = HAL_DMA_STATE_READY;
0343
0344 return HAL_ERROR;
0345 }
0346 }
0347 }
0348
0349
0350 ((DMA_Stream_TypeDef *)hdma->Instance)->FCR = registerValue;
0351
0352
0353
0354 regs_dma = (DMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma);
0355
0356
0357 regs_dma->IFCR = 0x3FUL << (hdma->StreamIndex & 0x1FU);
0358 }
0359 else if(IS_BDMA_CHANNEL_INSTANCE(hdma->Instance) != 0U)
0360 {
0361 if(IS_BDMA_CHANNEL_DMAMUX_INSTANCE(hdma->Instance) != 0U)
0362 {
0363
0364 assert_param(IS_BDMA_REQUEST(hdma->Init.Request));
0365 }
0366
0367
0368 hdma->State = HAL_DMA_STATE_BUSY;
0369
0370
0371 __HAL_UNLOCK(hdma);
0372
0373
0374 registerValue = ((BDMA_Channel_TypeDef *)hdma->Instance)->CCR;
0375
0376
0377 registerValue &= ((uint32_t)~(BDMA_CCR_PL | BDMA_CCR_MSIZE | BDMA_CCR_PSIZE | \
0378 BDMA_CCR_MINC | BDMA_CCR_PINC | BDMA_CCR_CIRC | \
0379 BDMA_CCR_DIR | BDMA_CCR_MEM2MEM | BDMA_CCR_DBM | \
0380 BDMA_CCR_CT));
0381
0382
0383 registerValue |= DMA_TO_BDMA_DIRECTION(hdma->Init.Direction) |
0384 DMA_TO_BDMA_PERIPHERAL_INC(hdma->Init.PeriphInc) |
0385 DMA_TO_BDMA_MEMORY_INC(hdma->Init.MemInc) |
0386 DMA_TO_BDMA_PDATA_SIZE(hdma->Init.PeriphDataAlignment) |
0387 DMA_TO_BDMA_MDATA_SIZE(hdma->Init.MemDataAlignment) |
0388 DMA_TO_BDMA_MODE(hdma->Init.Mode) |
0389 DMA_TO_BDMA_PRIORITY(hdma->Init.Priority);
0390
0391
0392 ((BDMA_Channel_TypeDef *)hdma->Instance)->CCR = registerValue;
0393
0394
0395 hdma->StreamIndex = (((uint32_t)((uint32_t*)hdma->Instance) - (uint32_t)BDMA_Channel0) / ((uint32_t)BDMA_Channel1 - (uint32_t)BDMA_Channel0)) << 2U;
0396
0397
0398
0399 regs_bdma = (BDMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma);
0400
0401
0402 regs_bdma->IFCR = ((BDMA_IFCR_CGIF0) << (hdma->StreamIndex & 0x1FU));
0403 }
0404 else
0405 {
0406 hdma->ErrorCode = HAL_DMA_ERROR_PARAM;
0407 hdma->State = HAL_DMA_STATE_ERROR;
0408
0409 return HAL_ERROR;
0410 }
0411
0412 if(IS_DMA_DMAMUX_ALL_INSTANCE(hdma->Instance) != 0U)
0413 {
0414
0415
0416
0417 DMA_CalcDMAMUXChannelBaseAndMask(hdma);
0418
0419 if(hdma->Init.Direction == DMA_MEMORY_TO_MEMORY)
0420 {
0421
0422 hdma->Init.Request = DMA_REQUEST_MEM2MEM;
0423 }
0424
0425
0426 hdma->DMAmuxChannel->CCR = (hdma->Init.Request & DMAMUX_CxCR_DMAREQ_ID);
0427
0428
0429 hdma->DMAmuxChannelStatus->CFR = hdma->DMAmuxChannelStatusMask;
0430
0431
0432
0433
0434 if((hdma->Init.Request >= DMA_REQUEST_GENERATOR0) && (hdma->Init.Request <= DMA_REQUEST_GENERATOR7))
0435 {
0436
0437
0438 DMA_CalcDMAMUXRequestGenBaseAndMask(hdma);
0439
0440
0441 hdma->DMAmuxRequestGen->RGCR = 0U;
0442
0443
0444 hdma->DMAmuxRequestGenStatus->RGCFR = hdma->DMAmuxRequestGenStatusMask;
0445 }
0446 else
0447 {
0448 hdma->DMAmuxRequestGen = 0U;
0449 hdma->DMAmuxRequestGenStatus = 0U;
0450 hdma->DMAmuxRequestGenStatusMask = 0U;
0451 }
0452 }
0453
0454
0455 hdma->ErrorCode = HAL_DMA_ERROR_NONE;
0456
0457
0458 hdma->State = HAL_DMA_STATE_READY;
0459
0460 return HAL_OK;
0461 }
0462
0463
0464
0465
0466
0467
0468
0469 HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma)
0470 {
0471 DMA_Base_Registers *regs_dma;
0472 BDMA_Base_Registers *regs_bdma;
0473
0474
0475 if(hdma == NULL)
0476 {
0477 return HAL_ERROR;
0478 }
0479
0480
0481 __HAL_DMA_DISABLE(hdma);
0482
0483 if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U)
0484 {
0485
0486 ((DMA_Stream_TypeDef *)hdma->Instance)->CR = 0U;
0487
0488
0489 ((DMA_Stream_TypeDef *)hdma->Instance)->NDTR = 0U;
0490
0491
0492 ((DMA_Stream_TypeDef *)hdma->Instance)->PAR = 0U;
0493
0494
0495 ((DMA_Stream_TypeDef *)hdma->Instance)->M0AR = 0U;
0496
0497
0498 ((DMA_Stream_TypeDef *)hdma->Instance)->M1AR = 0U;
0499
0500
0501 ((DMA_Stream_TypeDef *)hdma->Instance)->FCR = (uint32_t)0x00000021U;
0502
0503
0504 regs_dma = (DMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma);
0505
0506
0507 regs_dma->IFCR = 0x3FUL << (hdma->StreamIndex & 0x1FU);
0508 }
0509 else if(IS_BDMA_CHANNEL_INSTANCE(hdma->Instance) != 0U)
0510 {
0511
0512 ((BDMA_Channel_TypeDef *)hdma->Instance)->CCR = 0U;
0513
0514
0515 ((BDMA_Channel_TypeDef *)hdma->Instance)->CNDTR = 0U;
0516
0517
0518 ((BDMA_Channel_TypeDef *)hdma->Instance)->CPAR = 0U;
0519
0520
0521 ((BDMA_Channel_TypeDef *)hdma->Instance)->CM0AR = 0U;
0522
0523
0524 ((BDMA_Channel_TypeDef *)hdma->Instance)->CM1AR = 0U;
0525
0526
0527 regs_bdma = (BDMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma);
0528
0529
0530 regs_bdma->IFCR = ((BDMA_IFCR_CGIF0) << (hdma->StreamIndex & 0x1FU));
0531 }
0532 else
0533 {
0534
0535 return HAL_ERROR;
0536 }
0537
0538 #if defined (BDMA1)
0539 if(IS_DMA_DMAMUX_ALL_INSTANCE(hdma->Instance) != 0U)
0540 #endif
0541 {
0542
0543
0544 DMA_CalcDMAMUXChannelBaseAndMask(hdma);
0545
0546 if(hdma->DMAmuxChannel != 0U)
0547 {
0548
0549 hdma->DMAmuxChannel->CCR = 0U;
0550
0551
0552 hdma->DMAmuxChannelStatus->CFR = hdma->DMAmuxChannelStatusMask;
0553 }
0554
0555 if((hdma->Init.Request >= DMA_REQUEST_GENERATOR0) && (hdma->Init.Request <= DMA_REQUEST_GENERATOR7))
0556 {
0557
0558
0559 DMA_CalcDMAMUXRequestGenBaseAndMask(hdma);
0560
0561
0562 hdma->DMAmuxRequestGen->RGCR = 0U;
0563
0564
0565 hdma->DMAmuxRequestGenStatus->RGCFR = hdma->DMAmuxRequestGenStatusMask;
0566 }
0567
0568 hdma->DMAmuxRequestGen = 0U;
0569 hdma->DMAmuxRequestGenStatus = 0U;
0570 hdma->DMAmuxRequestGenStatusMask = 0U;
0571 }
0572
0573
0574
0575 hdma->XferCpltCallback = NULL;
0576 hdma->XferHalfCpltCallback = NULL;
0577 hdma->XferM1CpltCallback = NULL;
0578 hdma->XferM1HalfCpltCallback = NULL;
0579 hdma->XferErrorCallback = NULL;
0580 hdma->XferAbortCallback = NULL;
0581
0582
0583 hdma->ErrorCode = HAL_DMA_ERROR_NONE;
0584
0585
0586 hdma->State = HAL_DMA_STATE_RESET;
0587
0588
0589 __HAL_UNLOCK(hdma);
0590
0591 return HAL_OK;
0592 }
0593
0594
0595
0596
0597
0598
0599
0600
0601
0602
0603
0604
0605
0606
0607
0608
0609
0610
0611
0612
0613
0614
0615
0616
0617
0618
0619
0620
0621
0622
0623
0624
0625
0626 HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
0627 {
0628 HAL_StatusTypeDef status = HAL_OK;
0629
0630
0631 assert_param(IS_DMA_BUFFER_SIZE(DataLength));
0632
0633
0634 if(hdma == NULL)
0635 {
0636 return HAL_ERROR;
0637 }
0638
0639
0640 __HAL_LOCK(hdma);
0641
0642 if(HAL_DMA_STATE_READY == hdma->State)
0643 {
0644
0645 hdma->State = HAL_DMA_STATE_BUSY;
0646
0647
0648 hdma->ErrorCode = HAL_DMA_ERROR_NONE;
0649
0650
0651 __HAL_DMA_DISABLE(hdma);
0652
0653
0654 DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength);
0655
0656
0657 __HAL_DMA_ENABLE(hdma);
0658 }
0659 else
0660 {
0661
0662 hdma->ErrorCode = HAL_DMA_ERROR_BUSY;
0663
0664
0665 __HAL_UNLOCK(hdma);
0666
0667
0668 status = HAL_ERROR;
0669 }
0670 return status;
0671 }
0672
0673
0674
0675
0676
0677
0678
0679
0680
0681
0682 HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
0683 {
0684 HAL_StatusTypeDef status = HAL_OK;
0685
0686
0687 assert_param(IS_DMA_BUFFER_SIZE(DataLength));
0688
0689
0690 if(hdma == NULL)
0691 {
0692 return HAL_ERROR;
0693 }
0694
0695
0696 __HAL_LOCK(hdma);
0697
0698 if(HAL_DMA_STATE_READY == hdma->State)
0699 {
0700
0701 hdma->State = HAL_DMA_STATE_BUSY;
0702
0703
0704 hdma->ErrorCode = HAL_DMA_ERROR_NONE;
0705
0706
0707 __HAL_DMA_DISABLE(hdma);
0708
0709
0710 DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength);
0711
0712 if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U)
0713 {
0714
0715 MODIFY_REG(((DMA_Stream_TypeDef *)hdma->Instance)->CR, (DMA_IT_TC | DMA_IT_TE | DMA_IT_DME | DMA_IT_HT), (DMA_IT_TC | DMA_IT_TE | DMA_IT_DME));
0716
0717 if(hdma->XferHalfCpltCallback != NULL)
0718 {
0719
0720 ((DMA_Stream_TypeDef *)hdma->Instance)->CR |= DMA_IT_HT;
0721 }
0722 }
0723 else
0724 {
0725
0726 MODIFY_REG(((BDMA_Channel_TypeDef *)hdma->Instance)->CCR, (BDMA_CCR_TCIE | BDMA_CCR_HTIE | BDMA_CCR_TEIE), (BDMA_CCR_TCIE | BDMA_CCR_TEIE));
0727
0728 if(hdma->XferHalfCpltCallback != NULL)
0729 {
0730
0731 ((BDMA_Channel_TypeDef *)hdma->Instance)->CCR |= BDMA_CCR_HTIE;
0732 }
0733 }
0734
0735 if(IS_DMA_DMAMUX_ALL_INSTANCE(hdma->Instance) != 0U)
0736 {
0737
0738 if((hdma->DMAmuxChannel->CCR & DMAMUX_CxCR_SE) != 0U)
0739 {
0740
0741 hdma->DMAmuxChannel->CCR |= DMAMUX_CxCR_SOIE;
0742 }
0743
0744 if(hdma->DMAmuxRequestGen != 0U)
0745 {
0746
0747
0748 hdma->DMAmuxRequestGen->RGCR |= DMAMUX_RGxCR_OIE;
0749 }
0750 }
0751
0752
0753 __HAL_DMA_ENABLE(hdma);
0754 }
0755 else
0756 {
0757
0758 hdma->ErrorCode = HAL_DMA_ERROR_BUSY;
0759
0760
0761 __HAL_UNLOCK(hdma);
0762
0763
0764 status = HAL_ERROR;
0765 }
0766
0767 return status;
0768 }
0769
0770
0771
0772
0773
0774
0775
0776
0777
0778
0779
0780
0781
0782 HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
0783 {
0784
0785 DMA_Base_Registers *regs_dma;
0786 BDMA_Base_Registers *regs_bdma;
0787 const __IO uint32_t *enableRegister;
0788
0789 uint32_t tickstart = HAL_GetTick();
0790
0791
0792 if(hdma == NULL)
0793 {
0794 return HAL_ERROR;
0795 }
0796
0797
0798 if(hdma->State != HAL_DMA_STATE_BUSY)
0799 {
0800 hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER;
0801
0802
0803 __HAL_UNLOCK(hdma);
0804
0805 return HAL_ERROR;
0806 }
0807 else
0808 {
0809
0810 if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U)
0811 {
0812
0813 ((DMA_Stream_TypeDef *)hdma->Instance)->CR &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME | DMA_IT_HT);
0814 ((DMA_Stream_TypeDef *)hdma->Instance)->FCR &= ~(DMA_IT_FE);
0815
0816 enableRegister = (__IO uint32_t *)(&(((DMA_Stream_TypeDef *)hdma->Instance)->CR));
0817 }
0818 else
0819 {
0820
0821 ((BDMA_Channel_TypeDef *)hdma->Instance)->CCR &= ~(BDMA_CCR_TCIE | BDMA_CCR_HTIE | BDMA_CCR_TEIE);
0822
0823 enableRegister = (__IO uint32_t *)(&(((BDMA_Channel_TypeDef *)hdma->Instance)->CCR));
0824 }
0825
0826 if(IS_DMA_DMAMUX_ALL_INSTANCE(hdma->Instance) != 0U)
0827 {
0828
0829 hdma->DMAmuxChannel->CCR &= ~DMAMUX_CxCR_SOIE;
0830 }
0831
0832
0833 __HAL_DMA_DISABLE(hdma);
0834
0835
0836 while(((*enableRegister) & DMA_SxCR_EN) != 0U)
0837 {
0838
0839 if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA_ABORT)
0840 {
0841
0842 hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT;
0843
0844
0845 hdma->State = HAL_DMA_STATE_ERROR;
0846
0847
0848 __HAL_UNLOCK(hdma);
0849
0850 return HAL_ERROR;
0851 }
0852 }
0853
0854
0855 if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U)
0856 {
0857 regs_dma = (DMA_Base_Registers *)hdma->StreamBaseAddress;
0858 regs_dma->IFCR = 0x3FUL << (hdma->StreamIndex & 0x1FU);
0859 }
0860 else
0861 {
0862 regs_bdma = (BDMA_Base_Registers *)hdma->StreamBaseAddress;
0863 regs_bdma->IFCR = ((BDMA_IFCR_CGIF0) << (hdma->StreamIndex & 0x1FU));
0864 }
0865
0866 if(IS_DMA_DMAMUX_ALL_INSTANCE(hdma->Instance) != 0U)
0867 {
0868
0869 hdma->DMAmuxChannelStatus->CFR = hdma->DMAmuxChannelStatusMask;
0870
0871 if(hdma->DMAmuxRequestGen != 0U)
0872 {
0873
0874
0875 hdma->DMAmuxRequestGen->RGCR &= ~DMAMUX_RGxCR_OIE;
0876
0877
0878 hdma->DMAmuxRequestGenStatus->RGCFR = hdma->DMAmuxRequestGenStatusMask;
0879 }
0880 }
0881
0882
0883 hdma->State = HAL_DMA_STATE_READY;
0884
0885
0886 __HAL_UNLOCK(hdma);
0887 }
0888
0889 return HAL_OK;
0890 }
0891
0892
0893
0894
0895
0896
0897
0898 HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
0899 {
0900 BDMA_Base_Registers *regs_bdma;
0901
0902
0903 if(hdma == NULL)
0904 {
0905 return HAL_ERROR;
0906 }
0907
0908 if(hdma->State != HAL_DMA_STATE_BUSY)
0909 {
0910 hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER;
0911 return HAL_ERROR;
0912 }
0913 else
0914 {
0915 if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U)
0916 {
0917
0918 hdma->State = HAL_DMA_STATE_ABORT;
0919
0920
0921 __HAL_DMA_DISABLE(hdma);
0922 }
0923 else
0924 {
0925
0926 ((BDMA_Channel_TypeDef *)hdma->Instance)->CCR &= ~(BDMA_CCR_TCIE | BDMA_CCR_HTIE | BDMA_CCR_TEIE);
0927
0928
0929 __HAL_DMA_DISABLE(hdma);
0930
0931 if(IS_DMA_DMAMUX_ALL_INSTANCE(hdma->Instance) != 0U)
0932 {
0933
0934 hdma->DMAmuxChannel->CCR &= ~DMAMUX_CxCR_SOIE;
0935
0936
0937 regs_bdma = (BDMA_Base_Registers *)hdma->StreamBaseAddress;
0938 regs_bdma->IFCR = ((BDMA_IFCR_CGIF0) << (hdma->StreamIndex & 0x1FU));
0939
0940
0941 hdma->DMAmuxChannelStatus->CFR = hdma->DMAmuxChannelStatusMask;
0942
0943 if(hdma->DMAmuxRequestGen != 0U)
0944 {
0945
0946
0947 hdma->DMAmuxRequestGen->RGCR &= ~DMAMUX_RGxCR_OIE;
0948
0949
0950 hdma->DMAmuxRequestGenStatus->RGCFR = hdma->DMAmuxRequestGenStatusMask;
0951 }
0952 }
0953
0954
0955 hdma->State = HAL_DMA_STATE_READY;
0956
0957
0958 __HAL_UNLOCK(hdma);
0959
0960
0961 if(hdma->XferAbortCallback != NULL)
0962 {
0963 hdma->XferAbortCallback(hdma);
0964 }
0965 }
0966 }
0967
0968 return HAL_OK;
0969 }
0970
0971
0972
0973
0974
0975
0976
0977
0978
0979
0980
0981
0982 HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_LevelCompleteTypeDef CompleteLevel, uint32_t Timeout)
0983 {
0984 HAL_StatusTypeDef status = HAL_OK;
0985 uint32_t cpltlevel_mask;
0986 uint32_t tickstart = HAL_GetTick();
0987
0988
0989 __IO uint32_t *isr_reg;
0990
0991 __IO uint32_t *ifcr_reg;
0992
0993
0994 if(hdma == NULL)
0995 {
0996 return HAL_ERROR;
0997 }
0998
0999 if(HAL_DMA_STATE_BUSY != hdma->State)
1000 {
1001
1002 hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER;
1003 __HAL_UNLOCK(hdma);
1004
1005 return HAL_ERROR;
1006 }
1007
1008 if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U)
1009 {
1010
1011 if ((((DMA_Stream_TypeDef *)hdma->Instance)->CR & DMA_SxCR_CIRC) != 0U)
1012 {
1013 hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED;
1014 return HAL_ERROR;
1015 }
1016
1017
1018 if(CompleteLevel == HAL_DMA_FULL_TRANSFER)
1019 {
1020
1021 cpltlevel_mask = DMA_FLAG_TCIF0_4 << (hdma->StreamIndex & 0x1FU);
1022 }
1023 else
1024 {
1025
1026 cpltlevel_mask = DMA_FLAG_HTIF0_4 << (hdma->StreamIndex & 0x1FU);
1027 }
1028
1029 isr_reg = &(((DMA_Base_Registers *)hdma->StreamBaseAddress)->ISR);
1030 ifcr_reg = &(((DMA_Base_Registers *)hdma->StreamBaseAddress)->IFCR);
1031 }
1032 else
1033 {
1034
1035 if ((((BDMA_Channel_TypeDef *)hdma->Instance)->CCR & BDMA_CCR_CIRC) != 0U)
1036 {
1037 hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED;
1038 return HAL_ERROR;
1039 }
1040
1041
1042 if(CompleteLevel == HAL_DMA_FULL_TRANSFER)
1043 {
1044
1045 cpltlevel_mask = BDMA_FLAG_TC0 << (hdma->StreamIndex & 0x1FU);
1046 }
1047 else
1048 {
1049
1050 cpltlevel_mask = BDMA_FLAG_HT0 << (hdma->StreamIndex & 0x1FU);
1051 }
1052
1053 isr_reg = &(((BDMA_Base_Registers *)hdma->StreamBaseAddress)->ISR);
1054 ifcr_reg = &(((BDMA_Base_Registers *)hdma->StreamBaseAddress)->IFCR);
1055 }
1056
1057 while(((*isr_reg) & cpltlevel_mask) == 0U)
1058 {
1059 if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U)
1060 {
1061 if(((*isr_reg) & (DMA_FLAG_FEIF0_4 << (hdma->StreamIndex & 0x1FU))) != 0U)
1062 {
1063
1064 hdma->ErrorCode |= HAL_DMA_ERROR_FE;
1065
1066
1067 (*ifcr_reg) = DMA_FLAG_FEIF0_4 << (hdma->StreamIndex & 0x1FU);
1068 }
1069
1070 if(((*isr_reg) & (DMA_FLAG_DMEIF0_4 << (hdma->StreamIndex & 0x1FU))) != 0U)
1071 {
1072
1073 hdma->ErrorCode |= HAL_DMA_ERROR_DME;
1074
1075
1076 (*ifcr_reg) = DMA_FLAG_DMEIF0_4 << (hdma->StreamIndex & 0x1FU);
1077 }
1078
1079 if(((*isr_reg) & (DMA_FLAG_TEIF0_4 << (hdma->StreamIndex & 0x1FU))) != 0U)
1080 {
1081
1082 hdma->ErrorCode |= HAL_DMA_ERROR_TE;
1083
1084
1085 (*ifcr_reg) = DMA_FLAG_TEIF0_4 << (hdma->StreamIndex & 0x1FU);
1086
1087
1088 hdma->State = HAL_DMA_STATE_READY;
1089
1090
1091 __HAL_UNLOCK(hdma);
1092
1093 return HAL_ERROR;
1094 }
1095 }
1096 else
1097 {
1098 if(((*isr_reg) & (BDMA_FLAG_TE0 << (hdma->StreamIndex & 0x1FU))) != 0U)
1099 {
1100
1101
1102
1103 (*isr_reg) = ((BDMA_ISR_GIF0) << (hdma->StreamIndex & 0x1FU));
1104
1105
1106 hdma->ErrorCode = HAL_DMA_ERROR_TE;
1107
1108
1109 hdma->State = HAL_DMA_STATE_READY;
1110
1111
1112 __HAL_UNLOCK(hdma);
1113
1114 return HAL_ERROR;
1115 }
1116 }
1117
1118
1119 if(Timeout != HAL_MAX_DELAY)
1120 {
1121 if(((HAL_GetTick() - tickstart ) > Timeout)||(Timeout == 0U))
1122 {
1123
1124 hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT;
1125
1126
1127
1128 (void) HAL_DMA_Abort(hdma);
1129
1130
1131
1132
1133
1134
1135
1136 return HAL_ERROR;
1137 }
1138 }
1139
1140 if(IS_DMA_DMAMUX_ALL_INSTANCE(hdma->Instance) != 0U)
1141 {
1142
1143 if(hdma->DMAmuxRequestGen != 0U)
1144 {
1145
1146 if((hdma->DMAmuxRequestGenStatus->RGSR & hdma->DMAmuxRequestGenStatusMask) != 0U)
1147 {
1148
1149 hdma->DMAmuxRequestGenStatus->RGCFR = hdma->DMAmuxRequestGenStatusMask;
1150
1151
1152 hdma->ErrorCode |= HAL_DMA_ERROR_REQGEN;
1153 }
1154 }
1155
1156
1157 if((hdma->DMAmuxChannelStatus->CSR & hdma->DMAmuxChannelStatusMask) != 0U)
1158 {
1159
1160 hdma->DMAmuxChannelStatus->CFR = hdma->DMAmuxChannelStatusMask;
1161
1162
1163 hdma->ErrorCode |= HAL_DMA_ERROR_SYNC;
1164 }
1165 }
1166 }
1167
1168
1169
1170 if(CompleteLevel == HAL_DMA_FULL_TRANSFER)
1171 {
1172
1173 if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U)
1174 {
1175 (*ifcr_reg) = (DMA_FLAG_HTIF0_4 | DMA_FLAG_TCIF0_4) << (hdma->StreamIndex & 0x1FU);
1176 }
1177 else
1178 {
1179 (*ifcr_reg) = (BDMA_FLAG_TC0 << (hdma->StreamIndex & 0x1FU));
1180 }
1181
1182 hdma->State = HAL_DMA_STATE_READY;
1183
1184
1185 __HAL_UNLOCK(hdma);
1186 }
1187 else
1188 {
1189
1190 if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U)
1191 {
1192 (*ifcr_reg) = (DMA_FLAG_HTIF0_4) << (hdma->StreamIndex & 0x1FU);
1193 }
1194 else
1195 {
1196 (*ifcr_reg) = (BDMA_FLAG_HT0 << (hdma->StreamIndex & 0x1FU));
1197 }
1198 }
1199
1200 return status;
1201 }
1202
1203
1204
1205
1206
1207
1208
1209 void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma)
1210 {
1211 uint32_t tmpisr_dma, tmpisr_bdma;
1212 uint32_t ccr_reg;
1213 __IO uint32_t count = 0U;
1214 uint32_t timeout = SystemCoreClock / 9600U;
1215
1216
1217 DMA_Base_Registers *regs_dma = (DMA_Base_Registers *)hdma->StreamBaseAddress;
1218 BDMA_Base_Registers *regs_bdma = (BDMA_Base_Registers *)hdma->StreamBaseAddress;
1219
1220 tmpisr_dma = regs_dma->ISR;
1221 tmpisr_bdma = regs_bdma->ISR;
1222
1223 if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U)
1224 {
1225
1226 if ((tmpisr_dma & (DMA_FLAG_TEIF0_4 << (hdma->StreamIndex & 0x1FU))) != 0U)
1227 {
1228 if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TE) != 0U)
1229 {
1230
1231 ((DMA_Stream_TypeDef *)hdma->Instance)->CR &= ~(DMA_IT_TE);
1232
1233
1234 regs_dma->IFCR = DMA_FLAG_TEIF0_4 << (hdma->StreamIndex & 0x1FU);
1235
1236
1237 hdma->ErrorCode |= HAL_DMA_ERROR_TE;
1238 }
1239 }
1240
1241 if ((tmpisr_dma & (DMA_FLAG_FEIF0_4 << (hdma->StreamIndex & 0x1FU))) != 0U)
1242 {
1243 if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_FE) != 0U)
1244 {
1245
1246 regs_dma->IFCR = DMA_FLAG_FEIF0_4 << (hdma->StreamIndex & 0x1FU);
1247
1248
1249 hdma->ErrorCode |= HAL_DMA_ERROR_FE;
1250 }
1251 }
1252
1253 if ((tmpisr_dma & (DMA_FLAG_DMEIF0_4 << (hdma->StreamIndex & 0x1FU))) != 0U)
1254 {
1255 if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_DME) != 0U)
1256 {
1257
1258 regs_dma->IFCR = DMA_FLAG_DMEIF0_4 << (hdma->StreamIndex & 0x1FU);
1259
1260
1261 hdma->ErrorCode |= HAL_DMA_ERROR_DME;
1262 }
1263 }
1264
1265 if ((tmpisr_dma & (DMA_FLAG_HTIF0_4 << (hdma->StreamIndex & 0x1FU))) != 0U)
1266 {
1267 if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_HT) != 0U)
1268 {
1269
1270 regs_dma->IFCR = DMA_FLAG_HTIF0_4 << (hdma->StreamIndex & 0x1FU);
1271
1272
1273 if(((((DMA_Stream_TypeDef *)hdma->Instance)->CR) & (uint32_t)(DMA_SxCR_DBM)) != 0U)
1274 {
1275
1276 if((((DMA_Stream_TypeDef *)hdma->Instance)->CR & DMA_SxCR_CT) == 0U)
1277 {
1278 if(hdma->XferHalfCpltCallback != NULL)
1279 {
1280
1281 hdma->XferHalfCpltCallback(hdma);
1282 }
1283 }
1284
1285 else
1286 {
1287 if(hdma->XferM1HalfCpltCallback != NULL)
1288 {
1289
1290 hdma->XferM1HalfCpltCallback(hdma);
1291 }
1292 }
1293 }
1294 else
1295 {
1296
1297 if((((DMA_Stream_TypeDef *)hdma->Instance)->CR & DMA_SxCR_CIRC) == 0U)
1298 {
1299
1300 ((DMA_Stream_TypeDef *)hdma->Instance)->CR &= ~(DMA_IT_HT);
1301 }
1302
1303 if(hdma->XferHalfCpltCallback != NULL)
1304 {
1305
1306 hdma->XferHalfCpltCallback(hdma);
1307 }
1308 }
1309 }
1310 }
1311
1312 if ((tmpisr_dma & (DMA_FLAG_TCIF0_4 << (hdma->StreamIndex & 0x1FU))) != 0U)
1313 {
1314 if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TC) != 0U)
1315 {
1316
1317 regs_dma->IFCR = DMA_FLAG_TCIF0_4 << (hdma->StreamIndex & 0x1FU);
1318
1319 if(HAL_DMA_STATE_ABORT == hdma->State)
1320 {
1321
1322 ((DMA_Stream_TypeDef *)hdma->Instance)->CR &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME);
1323 ((DMA_Stream_TypeDef *)hdma->Instance)->FCR &= ~(DMA_IT_FE);
1324
1325 if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL))
1326 {
1327 ((DMA_Stream_TypeDef *)hdma->Instance)->CR &= ~(DMA_IT_HT);
1328 }
1329
1330
1331 regs_dma->IFCR = 0x3FUL << (hdma->StreamIndex & 0x1FU);
1332
1333
1334 hdma->State = HAL_DMA_STATE_READY;
1335
1336
1337 __HAL_UNLOCK(hdma);
1338
1339 if(hdma->XferAbortCallback != NULL)
1340 {
1341 hdma->XferAbortCallback(hdma);
1342 }
1343 return;
1344 }
1345
1346 if(((((DMA_Stream_TypeDef *)hdma->Instance)->CR) & (uint32_t)(DMA_SxCR_DBM)) != 0U)
1347 {
1348
1349 if((((DMA_Stream_TypeDef *)hdma->Instance)->CR & DMA_SxCR_CT) == 0U)
1350 {
1351 if(hdma->XferM1CpltCallback != NULL)
1352 {
1353
1354 hdma->XferM1CpltCallback(hdma);
1355 }
1356 }
1357
1358 else
1359 {
1360 if(hdma->XferCpltCallback != NULL)
1361 {
1362
1363 hdma->XferCpltCallback(hdma);
1364 }
1365 }
1366 }
1367
1368 else
1369 {
1370 if((((DMA_Stream_TypeDef *)hdma->Instance)->CR & DMA_SxCR_CIRC) == 0U)
1371 {
1372
1373 ((DMA_Stream_TypeDef *)hdma->Instance)->CR &= ~(DMA_IT_TC);
1374
1375
1376 hdma->State = HAL_DMA_STATE_READY;
1377
1378
1379 __HAL_UNLOCK(hdma);
1380 }
1381
1382 if(hdma->XferCpltCallback != NULL)
1383 {
1384
1385 hdma->XferCpltCallback(hdma);
1386 }
1387 }
1388 }
1389 }
1390
1391
1392 if(hdma->ErrorCode != HAL_DMA_ERROR_NONE)
1393 {
1394 if((hdma->ErrorCode & HAL_DMA_ERROR_TE) != 0U)
1395 {
1396 hdma->State = HAL_DMA_STATE_ABORT;
1397
1398
1399 __HAL_DMA_DISABLE(hdma);
1400
1401 do
1402 {
1403 if (++count > timeout)
1404 {
1405 break;
1406 }
1407 }
1408 while((((DMA_Stream_TypeDef *)hdma->Instance)->CR & DMA_SxCR_EN) != 0U);
1409
1410 if((((DMA_Stream_TypeDef *)hdma->Instance)->CR & DMA_SxCR_EN) != 0U)
1411 {
1412
1413 hdma->State = HAL_DMA_STATE_ERROR;
1414 }
1415 else
1416 {
1417
1418 hdma->State = HAL_DMA_STATE_READY;
1419 }
1420
1421
1422 __HAL_UNLOCK(hdma);
1423 }
1424
1425 if(hdma->XferErrorCallback != NULL)
1426 {
1427
1428 hdma->XferErrorCallback(hdma);
1429 }
1430 }
1431 }
1432 else if(IS_BDMA_CHANNEL_INSTANCE(hdma->Instance) != 0U)
1433 {
1434 ccr_reg = (((BDMA_Channel_TypeDef *)hdma->Instance)->CCR);
1435
1436
1437 if (((tmpisr_bdma & (BDMA_FLAG_HT0 << (hdma->StreamIndex & 0x1FU))) != 0U) && ((ccr_reg & BDMA_CCR_HTIE) != 0U))
1438 {
1439
1440 regs_bdma->IFCR = (BDMA_ISR_HTIF0 << (hdma->StreamIndex & 0x1FU));
1441
1442
1443 if((ccr_reg & BDMA_CCR_DBM) != 0U)
1444 {
1445
1446 if((ccr_reg & BDMA_CCR_CT) == 0U)
1447 {
1448 if(hdma->XferM1HalfCpltCallback != NULL)
1449 {
1450
1451 hdma->XferM1HalfCpltCallback(hdma);
1452 }
1453 }
1454
1455 else
1456 {
1457 if(hdma->XferHalfCpltCallback != NULL)
1458 {
1459
1460 hdma->XferHalfCpltCallback(hdma);
1461 }
1462 }
1463 }
1464 else
1465 {
1466 if((ccr_reg & BDMA_CCR_CIRC) == 0U)
1467 {
1468
1469 __HAL_DMA_DISABLE_IT(hdma, DMA_IT_HT);
1470 }
1471
1472
1473
1474
1475 if(hdma->XferHalfCpltCallback != NULL)
1476 {
1477
1478 hdma->XferHalfCpltCallback(hdma);
1479 }
1480 }
1481 }
1482
1483
1484 else if (((tmpisr_bdma & (BDMA_FLAG_TC0 << (hdma->StreamIndex & 0x1FU))) != 0U) && ((ccr_reg & BDMA_CCR_TCIE) != 0U))
1485 {
1486
1487 regs_bdma->IFCR = (BDMA_ISR_TCIF0) << (hdma->StreamIndex & 0x1FU);
1488
1489
1490 if((ccr_reg & BDMA_CCR_DBM) != 0U)
1491 {
1492
1493 if((ccr_reg & BDMA_CCR_CT) == 0U)
1494 {
1495 if(hdma->XferM1CpltCallback != NULL)
1496 {
1497
1498 hdma->XferM1CpltCallback(hdma);
1499 }
1500 }
1501
1502 else
1503 {
1504 if(hdma->XferCpltCallback != NULL)
1505 {
1506
1507 hdma->XferCpltCallback(hdma);
1508 }
1509 }
1510 }
1511 else
1512 {
1513 if((ccr_reg & BDMA_CCR_CIRC) == 0U)
1514 {
1515
1516 __HAL_DMA_DISABLE_IT(hdma, DMA_IT_TE | DMA_IT_TC);
1517
1518
1519 hdma->State = HAL_DMA_STATE_READY;
1520
1521
1522 __HAL_UNLOCK(hdma);
1523 }
1524
1525 if(hdma->XferCpltCallback != NULL)
1526 {
1527
1528 hdma->XferCpltCallback(hdma);
1529 }
1530 }
1531 }
1532
1533 else if (((tmpisr_bdma & (BDMA_FLAG_TE0 << (hdma->StreamIndex & 0x1FU))) != 0U) && ((ccr_reg & BDMA_CCR_TEIE) != 0U))
1534 {
1535
1536
1537
1538 __HAL_DMA_DISABLE_IT(hdma, (DMA_IT_TC | DMA_IT_HT | DMA_IT_TE));
1539
1540
1541 regs_bdma->IFCR = (BDMA_ISR_GIF0) << (hdma->StreamIndex & 0x1FU);
1542
1543
1544 hdma->ErrorCode = HAL_DMA_ERROR_TE;
1545
1546
1547 hdma->State = HAL_DMA_STATE_READY;
1548
1549
1550 __HAL_UNLOCK(hdma);
1551
1552 if (hdma->XferErrorCallback != NULL)
1553 {
1554
1555 hdma->XferErrorCallback(hdma);
1556 }
1557 }
1558 else
1559 {
1560
1561 }
1562 }
1563 else
1564 {
1565
1566 }
1567 }
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579 HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void (* pCallback)(DMA_HandleTypeDef *_hdma))
1580 {
1581
1582 HAL_StatusTypeDef status = HAL_OK;
1583
1584
1585 if(hdma == NULL)
1586 {
1587 return HAL_ERROR;
1588 }
1589
1590
1591 __HAL_LOCK(hdma);
1592
1593 if(HAL_DMA_STATE_READY == hdma->State)
1594 {
1595 switch (CallbackID)
1596 {
1597 case HAL_DMA_XFER_CPLT_CB_ID:
1598 hdma->XferCpltCallback = pCallback;
1599 break;
1600
1601 case HAL_DMA_XFER_HALFCPLT_CB_ID:
1602 hdma->XferHalfCpltCallback = pCallback;
1603 break;
1604
1605 case HAL_DMA_XFER_M1CPLT_CB_ID:
1606 hdma->XferM1CpltCallback = pCallback;
1607 break;
1608
1609 case HAL_DMA_XFER_M1HALFCPLT_CB_ID:
1610 hdma->XferM1HalfCpltCallback = pCallback;
1611 break;
1612
1613 case HAL_DMA_XFER_ERROR_CB_ID:
1614 hdma->XferErrorCallback = pCallback;
1615 break;
1616
1617 case HAL_DMA_XFER_ABORT_CB_ID:
1618 hdma->XferAbortCallback = pCallback;
1619 break;
1620
1621 default:
1622 status = HAL_ERROR;
1623 break;
1624 }
1625 }
1626 else
1627 {
1628
1629 status = HAL_ERROR;
1630 }
1631
1632
1633 __HAL_UNLOCK(hdma);
1634
1635 return status;
1636 }
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646 HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID)
1647 {
1648 HAL_StatusTypeDef status = HAL_OK;
1649
1650
1651 if(hdma == NULL)
1652 {
1653 return HAL_ERROR;
1654 }
1655
1656
1657 __HAL_LOCK(hdma);
1658
1659 if(HAL_DMA_STATE_READY == hdma->State)
1660 {
1661 switch (CallbackID)
1662 {
1663 case HAL_DMA_XFER_CPLT_CB_ID:
1664 hdma->XferCpltCallback = NULL;
1665 break;
1666
1667 case HAL_DMA_XFER_HALFCPLT_CB_ID:
1668 hdma->XferHalfCpltCallback = NULL;
1669 break;
1670
1671 case HAL_DMA_XFER_M1CPLT_CB_ID:
1672 hdma->XferM1CpltCallback = NULL;
1673 break;
1674
1675 case HAL_DMA_XFER_M1HALFCPLT_CB_ID:
1676 hdma->XferM1HalfCpltCallback = NULL;
1677 break;
1678
1679 case HAL_DMA_XFER_ERROR_CB_ID:
1680 hdma->XferErrorCallback = NULL;
1681 break;
1682
1683 case HAL_DMA_XFER_ABORT_CB_ID:
1684 hdma->XferAbortCallback = NULL;
1685 break;
1686
1687 case HAL_DMA_XFER_ALL_CB_ID:
1688 hdma->XferCpltCallback = NULL;
1689 hdma->XferHalfCpltCallback = NULL;
1690 hdma->XferM1CpltCallback = NULL;
1691 hdma->XferM1HalfCpltCallback = NULL;
1692 hdma->XferErrorCallback = NULL;
1693 hdma->XferAbortCallback = NULL;
1694 break;
1695
1696 default:
1697 status = HAL_ERROR;
1698 break;
1699 }
1700 }
1701 else
1702 {
1703 status = HAL_ERROR;
1704 }
1705
1706
1707 __HAL_UNLOCK(hdma);
1708
1709 return status;
1710 }
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737 HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma)
1738 {
1739 return hdma->State;
1740 }
1741
1742
1743
1744
1745
1746
1747
1748 uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma)
1749 {
1750 return hdma->ErrorCode;
1751 }
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774 static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
1775 {
1776
1777 DMA_Base_Registers *regs_dma = (DMA_Base_Registers *)hdma->StreamBaseAddress;
1778 BDMA_Base_Registers *regs_bdma = (BDMA_Base_Registers *)hdma->StreamBaseAddress;
1779
1780 if(IS_DMA_DMAMUX_ALL_INSTANCE(hdma->Instance) != 0U)
1781 {
1782
1783 hdma->DMAmuxChannelStatus->CFR = hdma->DMAmuxChannelStatusMask;
1784
1785 if(hdma->DMAmuxRequestGen != 0U)
1786 {
1787
1788 hdma->DMAmuxRequestGenStatus->RGCFR = hdma->DMAmuxRequestGenStatusMask;
1789 }
1790 }
1791
1792 if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U)
1793 {
1794
1795 regs_dma->IFCR = 0x3FUL << (hdma->StreamIndex & 0x1FU);
1796
1797
1798 ((DMA_Stream_TypeDef *)hdma->Instance)->CR &= (uint32_t)(~DMA_SxCR_DBM);
1799
1800
1801 ((DMA_Stream_TypeDef *)hdma->Instance)->NDTR = DataLength;
1802
1803
1804 if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH)
1805 {
1806
1807 ((DMA_Stream_TypeDef *)hdma->Instance)->PAR = DstAddress;
1808
1809
1810 ((DMA_Stream_TypeDef *)hdma->Instance)->M0AR = SrcAddress;
1811 }
1812
1813 else
1814 {
1815
1816 ((DMA_Stream_TypeDef *)hdma->Instance)->PAR = SrcAddress;
1817
1818
1819 ((DMA_Stream_TypeDef *)hdma->Instance)->M0AR = DstAddress;
1820 }
1821 }
1822 else if(IS_BDMA_CHANNEL_INSTANCE(hdma->Instance) != 0U)
1823 {
1824
1825 regs_bdma->IFCR = (BDMA_ISR_GIF0) << (hdma->StreamIndex & 0x1FU);
1826
1827
1828 ((BDMA_Channel_TypeDef *)hdma->Instance)->CNDTR = DataLength;
1829
1830
1831 if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH)
1832 {
1833
1834 ((BDMA_Channel_TypeDef *)hdma->Instance)->CPAR = DstAddress;
1835
1836
1837 ((BDMA_Channel_TypeDef *)hdma->Instance)->CM0AR = SrcAddress;
1838 }
1839
1840 else
1841 {
1842
1843 ((BDMA_Channel_TypeDef *)hdma->Instance)->CPAR = SrcAddress;
1844
1845
1846 ((BDMA_Channel_TypeDef *)hdma->Instance)->CM0AR = DstAddress;
1847 }
1848 }
1849 else
1850 {
1851
1852 }
1853 }
1854
1855
1856
1857
1858
1859
1860
1861 static uint32_t DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma)
1862 {
1863 if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U)
1864 {
1865 uint32_t stream_number = (((uint32_t)((uint32_t*)hdma->Instance) & 0xFFU) - 16U) / 24U;
1866
1867
1868 static const uint8_t flagBitshiftOffset[8U] = {0U, 6U, 16U, 22U, 0U, 6U, 16U, 22U};
1869 hdma->StreamIndex = flagBitshiftOffset[stream_number & 0x7U];
1870
1871 if (stream_number > 3U)
1872 {
1873
1874 hdma->StreamBaseAddress = (((uint32_t)((uint32_t*)hdma->Instance) & (uint32_t)(~0x3FFU)) + 4U);
1875 }
1876 else
1877 {
1878
1879 hdma->StreamBaseAddress = ((uint32_t)((uint32_t*)hdma->Instance) & (uint32_t)(~0x3FFU));
1880 }
1881 }
1882 else
1883 {
1884
1885 hdma->StreamBaseAddress = ((uint32_t)((uint32_t*)hdma->Instance) & (uint32_t)(~0xFFU));
1886 }
1887
1888 return hdma->StreamBaseAddress;
1889 }
1890
1891
1892
1893
1894
1895
1896
1897 static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma)
1898 {
1899 HAL_StatusTypeDef status = HAL_OK;
1900
1901
1902 if (hdma->Init.MemDataAlignment == DMA_MDATAALIGN_BYTE)
1903 {
1904 switch (hdma->Init.FIFOThreshold)
1905 {
1906 case DMA_FIFO_THRESHOLD_1QUARTERFULL:
1907 case DMA_FIFO_THRESHOLD_3QUARTERSFULL:
1908
1909 if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1)
1910 {
1911 status = HAL_ERROR;
1912 }
1913 break;
1914
1915 case DMA_FIFO_THRESHOLD_HALFFULL:
1916 if (hdma->Init.MemBurst == DMA_MBURST_INC16)
1917 {
1918 status = HAL_ERROR;
1919 }
1920 break;
1921
1922 case DMA_FIFO_THRESHOLD_FULL:
1923 break;
1924
1925 default:
1926 break;
1927 }
1928 }
1929
1930
1931 else if (hdma->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD)
1932 {
1933 switch (hdma->Init.FIFOThreshold)
1934 {
1935 case DMA_FIFO_THRESHOLD_1QUARTERFULL:
1936 case DMA_FIFO_THRESHOLD_3QUARTERSFULL:
1937 status = HAL_ERROR;
1938 break;
1939
1940 case DMA_FIFO_THRESHOLD_HALFFULL:
1941 if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1)
1942 {
1943 status = HAL_ERROR;
1944 }
1945 break;
1946
1947 case DMA_FIFO_THRESHOLD_FULL:
1948 if (hdma->Init.MemBurst == DMA_MBURST_INC16)
1949 {
1950 status = HAL_ERROR;
1951 }
1952 break;
1953
1954 default:
1955 break;
1956 }
1957 }
1958
1959
1960 else
1961 {
1962 switch (hdma->Init.FIFOThreshold)
1963 {
1964 case DMA_FIFO_THRESHOLD_1QUARTERFULL:
1965 case DMA_FIFO_THRESHOLD_HALFFULL:
1966 case DMA_FIFO_THRESHOLD_3QUARTERSFULL:
1967 status = HAL_ERROR;
1968 break;
1969
1970 case DMA_FIFO_THRESHOLD_FULL:
1971 if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1)
1972 {
1973 status = HAL_ERROR;
1974 }
1975 break;
1976
1977 default:
1978 break;
1979 }
1980 }
1981
1982 return status;
1983 }
1984
1985
1986
1987
1988
1989
1990
1991 static void DMA_CalcDMAMUXChannelBaseAndMask(DMA_HandleTypeDef *hdma)
1992 {
1993 uint32_t stream_number;
1994 uint32_t stream_baseaddress = (uint32_t)((uint32_t*)hdma->Instance);
1995
1996 if(IS_BDMA_CHANNEL_DMAMUX_INSTANCE(hdma->Instance) != 0U)
1997 {
1998
1999 stream_number = (((uint32_t)((uint32_t*)hdma->Instance) & 0xFFU) - 8U) / 20U;
2000 hdma->DMAmuxChannel = (DMAMUX_Channel_TypeDef *)((uint32_t)(((uint32_t)DMAMUX2_Channel0) + (stream_number * 4U)));
2001 hdma->DMAmuxChannelStatus = DMAMUX2_ChannelStatus;
2002 hdma->DMAmuxChannelStatusMask = 1UL << (stream_number & 0x1FU);
2003 }
2004 else
2005 {
2006
2007 stream_number = (((uint32_t)((uint32_t*)hdma->Instance) & 0xFFU) - 16U) / 24U;
2008
2009 if((stream_baseaddress <= ((uint32_t)DMA2_Stream7) ) && \
2010 (stream_baseaddress >= ((uint32_t)DMA2_Stream0)))
2011 {
2012 stream_number += 8U;
2013 }
2014 hdma->DMAmuxChannel = (DMAMUX_Channel_TypeDef *)((uint32_t)(((uint32_t)DMAMUX1_Channel0) + (stream_number * 4U)));
2015 hdma->DMAmuxChannelStatus = DMAMUX1_ChannelStatus;
2016 hdma->DMAmuxChannelStatusMask = 1UL << (stream_number & 0x1FU);
2017 }
2018 }
2019
2020
2021
2022
2023
2024
2025
2026 static void DMA_CalcDMAMUXRequestGenBaseAndMask(DMA_HandleTypeDef *hdma)
2027 {
2028 uint32_t request = hdma->Init.Request & DMAMUX_CxCR_DMAREQ_ID;
2029
2030 if((request >= DMA_REQUEST_GENERATOR0) && (request <= DMA_REQUEST_GENERATOR7))
2031 {
2032 if(IS_BDMA_CHANNEL_DMAMUX_INSTANCE(hdma->Instance) != 0U)
2033 {
2034
2035 hdma->DMAmuxRequestGen = (DMAMUX_RequestGen_TypeDef *)((uint32_t)(((uint32_t)DMAMUX2_RequestGenerator0) + ((request - 1U) * 4U)));
2036
2037 hdma->DMAmuxRequestGenStatus = DMAMUX2_RequestGenStatus;
2038 }
2039 else
2040 {
2041
2042 hdma->DMAmuxRequestGen = (DMAMUX_RequestGen_TypeDef *)((uint32_t)(((uint32_t)DMAMUX1_RequestGenerator0) + ((request - 1U) * 4U)));
2043
2044 hdma->DMAmuxRequestGenStatus = DMAMUX1_RequestGenStatus;
2045 }
2046
2047 hdma->DMAmuxRequestGenStatusMask = 1UL << (request - 1U);
2048 }
2049 }
2050
2051
2052
2053
2054
2055 #endif
2056
2057
2058
2059
2060
2061
2062
2063