sdio.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. /**
  2. ******************************************************************************
  3. * File Name : SDIO.c
  4. * Description : This file provides code for the configuration
  5. * of the SDIO instances.
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  10. * All rights reserved.</center></h2>
  11. *
  12. * This software component is licensed by ST under Ultimate Liberty license
  13. * SLA0044, the "License"; You may not use this file except in compliance with
  14. * the License. You may obtain a copy of the License at:
  15. * www.st.com/SLA0044
  16. *
  17. ******************************************************************************
  18. */
  19. /* Includes ------------------------------------------------------------------*/
  20. #include "sdio.h"
  21. /* USER CODE BEGIN 0 */
  22. /* USER CODE END 0 */
  23. SD_HandleTypeDef hsd;
  24. DMA_HandleTypeDef hdma_sdio_tx;
  25. DMA_HandleTypeDef hdma_sdio_rx;
  26. /* SDIO init function */
  27. void MX_SDIO_SD_Init(void)
  28. {
  29. hsd.Instance = SDIO;
  30. hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
  31. hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
  32. hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
  33. hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
  34. hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
  35. hsd.Init.ClockDiv = 0;
  36. /*
  37. if (HAL_SD_Init(&hsd) != HAL_OK)
  38. {
  39. Error_Handler();
  40. }
  41. if (HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B) != HAL_OK)
  42. {
  43. Error_Handler();
  44. }*/
  45. }
  46. void HAL_SD_MspInit(SD_HandleTypeDef* sdHandle)
  47. {
  48. GPIO_InitTypeDef GPIO_InitStruct = {0};
  49. if(sdHandle->Instance==SDIO)
  50. {
  51. /* USER CODE BEGIN SDIO_MspInit 0 */
  52. /* USER CODE END SDIO_MspInit 0 */
  53. /* SDIO clock enable */
  54. __HAL_RCC_SDIO_CLK_ENABLE();
  55. __HAL_RCC_GPIOC_CLK_ENABLE();
  56. __HAL_RCC_GPIOD_CLK_ENABLE();
  57. /**SDIO GPIO Configuration
  58. PC8 ------> SDIO_D0
  59. PC9 ------> SDIO_D1
  60. PC10 ------> SDIO_D2
  61. PC11 ------> SDIO_D3
  62. PC12 ------> SDIO_CK
  63. PD2 ------> SDIO_CMD
  64. */
  65. GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11;
  66. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  67. GPIO_InitStruct.Pull = GPIO_PULLUP;
  68. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  69. GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
  70. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  71. GPIO_InitStruct.Pin = GPIO_PIN_12;
  72. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  73. GPIO_InitStruct.Pull = GPIO_NOPULL;
  74. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  75. GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
  76. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  77. GPIO_InitStruct.Pin = GPIO_PIN_2;
  78. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  79. GPIO_InitStruct.Pull = GPIO_PULLUP;
  80. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  81. GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
  82. HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  83. /* SDIO DMA Init */
  84. /* SDIO_TX Init */
  85. hdma_sdio_tx.Instance = DMA2_Stream3;
  86. hdma_sdio_tx.Init.Channel = DMA_CHANNEL_4;
  87. hdma_sdio_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
  88. hdma_sdio_tx.Init.PeriphInc = DMA_PINC_DISABLE;
  89. hdma_sdio_tx.Init.MemInc = DMA_MINC_ENABLE;
  90. hdma_sdio_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  91. hdma_sdio_tx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
  92. hdma_sdio_tx.Init.Mode = DMA_PFCTRL;
  93. hdma_sdio_tx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
  94. hdma_sdio_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
  95. hdma_sdio_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
  96. hdma_sdio_tx.Init.MemBurst = DMA_MBURST_INC4;
  97. hdma_sdio_tx.Init.PeriphBurst = DMA_PBURST_INC4;
  98. if (HAL_DMA_Init(&hdma_sdio_tx) != HAL_OK)
  99. {
  100. Error_Handler();
  101. }
  102. __HAL_LINKDMA(sdHandle,hdmatx,hdma_sdio_tx);
  103. /* SDIO_RX Init */
  104. hdma_sdio_rx.Instance = DMA2_Stream6;
  105. hdma_sdio_rx.Init.Channel = DMA_CHANNEL_4;
  106. hdma_sdio_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
  107. hdma_sdio_rx.Init.PeriphInc = DMA_PINC_DISABLE;
  108. hdma_sdio_rx.Init.MemInc = DMA_MINC_ENABLE;
  109. hdma_sdio_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  110. hdma_sdio_rx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
  111. hdma_sdio_rx.Init.Mode = DMA_PFCTRL;
  112. hdma_sdio_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
  113. hdma_sdio_rx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
  114. hdma_sdio_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
  115. hdma_sdio_rx.Init.MemBurst = DMA_MBURST_INC4;
  116. hdma_sdio_rx.Init.PeriphBurst = DMA_PBURST_INC4;
  117. if (HAL_DMA_Init(&hdma_sdio_rx) != HAL_OK)
  118. {
  119. Error_Handler();
  120. }
  121. __HAL_LINKDMA(sdHandle,hdmarx,hdma_sdio_rx);
  122. /* SDIO interrupt Init */
  123. HAL_NVIC_SetPriority(SDIO_IRQn, 2, 0);
  124. HAL_NVIC_EnableIRQ(SDIO_IRQn);
  125. /* USER CODE BEGIN SDIO_MspInit 1 */
  126. /* USER CODE END SDIO_MspInit 1 */
  127. }
  128. }
  129. void HAL_SD_MspDeInit(SD_HandleTypeDef* sdHandle)
  130. {
  131. if(sdHandle->Instance==SDIO)
  132. {
  133. /* USER CODE BEGIN SDIO_MspDeInit 0 */
  134. /* USER CODE END SDIO_MspDeInit 0 */
  135. /* Peripheral clock disable */
  136. __HAL_RCC_SDIO_CLK_DISABLE();
  137. /**SDIO GPIO Configuration
  138. PC8 ------> SDIO_D0
  139. PC9 ------> SDIO_D1
  140. PC10 ------> SDIO_D2
  141. PC11 ------> SDIO_D3
  142. PC12 ------> SDIO_CK
  143. PD2 ------> SDIO_CMD
  144. */
  145. HAL_GPIO_DeInit(GPIOC, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11
  146. |GPIO_PIN_12);
  147. HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2);
  148. /* SDIO DMA DeInit */
  149. HAL_DMA_DeInit(sdHandle->hdmatx);
  150. HAL_DMA_DeInit(sdHandle->hdmarx);
  151. /* SDIO interrupt Deinit */
  152. HAL_NVIC_DisableIRQ(SDIO_IRQn);
  153. /* USER CODE BEGIN SDIO_MspDeInit 1 */
  154. /* USER CODE END SDIO_MspDeInit 1 */
  155. }
  156. }
  157. /* USER CODE BEGIN 1 */
  158. /* USER CODE END 1 */
  159. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/