Advertisement
Guest User

SDMMC DMA STM32-L476RG

a guest
Sep 27th, 2017
1,569
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.35 KB | None | 0 0
  1. DMA Channel doesn't work (+SDMMC)
  2. Request Number: TECH040009 
  3.  
  4. Type:   Technical
  5. Severity:   Medium
  6. State:  SOLUTION PROPOSED
  7. Product :   Microcontrollers
  8. STM32 32-bit ARM Cortex MCUs
  9. STM32 Ultra Low Power MCUs
  10. STM32L476RG
  11. Description:    Package: STM32-L476RG (Nucleo)
  12. Firmware: CubeMX 1.8.1
  13.  
  14. When using SDMMC (1-Bit) + DMA, the DMA2 Channel 4 doesn't seem to work.
  15. When SDMMC_TX or _RX is put on channel 4, the SDMMC unit does not transmit anything (on cmd, data line, verified by oscilloscope).
  16. When SDMMC_TX or _RX is put on channel 5, the SDMMC unit works as expected.
  17.  
  18. Thank you for any feedback!
  19. Resolution Summary: SOLUTION PROPOSED BY SUPPORTER - 21/9/2017 11:54:26 :
  20. ---------------------------------------------------------------------------------
  21. Dear Customer,
  22.  
  23. I could reproduce your issue on STM32L476G eval board creating a project from CubeMx.
  24.  
  25.  
  26. I investigated looking at example on cubemx firmware project:
  27. xxx\STM32Cube\Repository\STM32Cube_FW_L4_V1.8.1\Drivers\BSP\STM32L476G_EVAL\stm32l476g_eval_sd.c
  28.  
  29.  
  30. I succeed to make work channel 4 and/or channel 5 for tx and rx by doing the following changes .
  31.  
  32. uint8_t BSP_SD_ReadBlocks_DMA(uint32_t *pData, uint32_t ReadAddr,
  33.     uint32_t NumOfBlocks)
  34. {
  35.   HAL_DMA_Abort(&hdma_sdmmc1_tx);
  36.   HAL_DMA_Abort(&hdma_sdmmc1_rx);
  37.  
  38.   /* Deinitialize the Channel for new transfer */
  39.   HAL_DMA_DeInit(&hdma_sdmmc1_tx);
  40.   HAL_DMA_DeInit(&hdma_sdmmc1_rx);
  41.  
  42.   HAL_DMA_Init(&hdma_sdmmc1_rx);
  43.   ..
  44.  
  45. uint8_t BSP_SD_WriteBlocks_DMA(uint32_t *pData, uint32_t WriteAddr,
  46.     uint32_t NumOfBlocks)
  47. {
  48.  uint32_t tickstart = HAL_GetTick();
  49.   HAL_DMA_Abort(&hdma_sdmmc1_tx);
  50.   HAL_DMA_Abort(&hdma_sdmmc1_rx);
  51.  
  52.   /* Deinitialize the Channel for new transfer */
  53.   HAL_DMA_DeInit(&hdma_sdmmc1_tx);
  54.   HAL_DMA_DeInit(&hdma_sdmmc1_rx);
  55.  
  56.   /* Configure the DMA Channel */
  57.   HAL_DMA_Init(&hdma_sdmmc1_tx);
  58.  
  59. void DMA2_Channelx_IRQHandler(void)
  60. {
  61.   /* USER CODE BEGIN DMA2_Channel5_IRQn 0 */
  62.   if((hsd1.Context == (SD_CONTEXT_DMA | SD_CONTEXT_READ_SINGLE_BLOCK)) ||
  63.      (hsd1.Context == (SD_CONTEXT_DMA | SD_CONTEXT_READ_MULTIPLE_BLOCK)))
  64.   {
  65.      HAL_DMA_IRQHandler(&hdma_sdmmc1_rx);
  66.   }
  67.   else if((hsd1.Context == (SD_CONTEXT_DMA | SD_CONTEXT_WRITE_SINGLE_BLOCK)) ||
  68.           (hsd1.Context == (SD_CONTEXT_DMA | SD_CONTEXT_WRITE_MULTIPLE_BLOCK)))
  69.   {
  70.       HAL_DMA_IRQHandler(&hdma_sdmmc1_tx);
  71.   }    
  72.  
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement