SPKT

Dependents:   Player

Committer:
phungductung
Date:
Fri Jun 07 05:06:42 2019 +0000
Revision:
0:4e245f4bc8ac
spkt

Who changed what in which revision?

UserRevisionLine numberNew contents of line
phungductung 0:4e245f4bc8ac 1 /**
phungductung 0:4e245f4bc8ac 2 ******************************************************************************
phungductung 0:4e245f4bc8ac 3 * @file stm32746g_discovery_sd.c
phungductung 0:4e245f4bc8ac 4 * @author MCD Application Team
phungductung 0:4e245f4bc8ac 5 * @version V1.0.0
phungductung 0:4e245f4bc8ac 6 * @date 25-June-2015
phungductung 0:4e245f4bc8ac 7 * @brief This file includes the uSD card driver mounted on STM32746G-Discovery
phungductung 0:4e245f4bc8ac 8 * board.
phungductung 0:4e245f4bc8ac 9 @verbatim
phungductung 0:4e245f4bc8ac 10 1. How To use this driver:
phungductung 0:4e245f4bc8ac 11 --------------------------
phungductung 0:4e245f4bc8ac 12 - This driver is used to drive the micro SD external card mounted on STM32746G-Discovery
phungductung 0:4e245f4bc8ac 13 board.
phungductung 0:4e245f4bc8ac 14 - This driver does not need a specific component driver for the micro SD device
phungductung 0:4e245f4bc8ac 15 to be included with.
phungductung 0:4e245f4bc8ac 16
phungductung 0:4e245f4bc8ac 17 2. Driver description:
phungductung 0:4e245f4bc8ac 18 ---------------------
phungductung 0:4e245f4bc8ac 19 + Initialization steps:
phungductung 0:4e245f4bc8ac 20 o Initialize the micro SD card using the BSP_SD_Init() function. This
phungductung 0:4e245f4bc8ac 21 function includes the MSP layer hardware resources initialization and the
phungductung 0:4e245f4bc8ac 22 SDIO interface configuration to interface with the external micro SD. It
phungductung 0:4e245f4bc8ac 23 also includes the micro SD initialization sequence.
phungductung 0:4e245f4bc8ac 24 o To check the SD card presence you can use the function BSP_SD_IsDetected() which
phungductung 0:4e245f4bc8ac 25 returns the detection status
phungductung 0:4e245f4bc8ac 26 o If SD presence detection interrupt mode is desired, you must configure the
phungductung 0:4e245f4bc8ac 27 SD detection interrupt mode by calling the function BSP_SD_ITConfig(). The interrupt
phungductung 0:4e245f4bc8ac 28 is generated as an external interrupt whenever the micro SD card is
phungductung 0:4e245f4bc8ac 29 plugged/unplugged in/from the board.
phungductung 0:4e245f4bc8ac 30 o The function BSP_SD_GetCardInfo() is used to get the micro SD card information
phungductung 0:4e245f4bc8ac 31 which is stored in the structure "HAL_SD_CardInfoTypedef".
phungductung 0:4e245f4bc8ac 32
phungductung 0:4e245f4bc8ac 33 + Micro SD card operations
phungductung 0:4e245f4bc8ac 34 o The micro SD card can be accessed with read/write block(s) operations once
phungductung 0:4e245f4bc8ac 35 it is ready for access. The access can be performed whether using the polling
phungductung 0:4e245f4bc8ac 36 mode by calling the functions BSP_SD_ReadBlocks()/BSP_SD_WriteBlocks(), or by DMA
phungductung 0:4e245f4bc8ac 37 transfer using the functions BSP_SD_ReadBlocks_DMA()/BSP_SD_WriteBlocks_DMA()
phungductung 0:4e245f4bc8ac 38 o The DMA transfer complete is used with interrupt mode. Once the SD transfer
phungductung 0:4e245f4bc8ac 39 is complete, the SD interrupt is handled using the function BSP_SD_IRQHandler(),
phungductung 0:4e245f4bc8ac 40 the DMA Tx/Rx transfer complete are handled using the functions
phungductung 0:4e245f4bc8ac 41 BSP_SD_DMA_Tx_IRQHandler()/BSP_SD_DMA_Rx_IRQHandler(). The corresponding user callbacks
phungductung 0:4e245f4bc8ac 42 are implemented by the user at application level.
phungductung 0:4e245f4bc8ac 43 o The SD erase block(s) is performed using the function BSP_SD_Erase() with specifying
phungductung 0:4e245f4bc8ac 44 the number of blocks to erase.
phungductung 0:4e245f4bc8ac 45 o The SD runtime status is returned when calling the function BSP_SD_GetStatus().
phungductung 0:4e245f4bc8ac 46 @endverbatim
phungductung 0:4e245f4bc8ac 47 ******************************************************************************
phungductung 0:4e245f4bc8ac 48 * @attention
phungductung 0:4e245f4bc8ac 49 *
phungductung 0:4e245f4bc8ac 50 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
phungductung 0:4e245f4bc8ac 51 *
phungductung 0:4e245f4bc8ac 52 * Redistribution and use in source and binary forms, with or without modification,
phungductung 0:4e245f4bc8ac 53 * are permitted provided that the following conditions are met:
phungductung 0:4e245f4bc8ac 54 * 1. Redistributions of source code must retain the above copyright notice,
phungductung 0:4e245f4bc8ac 55 * this list of conditions and the following disclaimer.
phungductung 0:4e245f4bc8ac 56 * 2. Redistributions in binary form must reproduce the above copyright notice,
phungductung 0:4e245f4bc8ac 57 * this list of conditions and the following disclaimer in the documentation
phungductung 0:4e245f4bc8ac 58 * and/or other materials provided with the distribution.
phungductung 0:4e245f4bc8ac 59 * 3. Neither the name of STMicroelectronics nor the names of its contributors
phungductung 0:4e245f4bc8ac 60 * may be used to endorse or promote products derived from this software
phungductung 0:4e245f4bc8ac 61 * without specific prior written permission.
phungductung 0:4e245f4bc8ac 62 *
phungductung 0:4e245f4bc8ac 63 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
phungductung 0:4e245f4bc8ac 64 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
phungductung 0:4e245f4bc8ac 65 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
phungductung 0:4e245f4bc8ac 66 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
phungductung 0:4e245f4bc8ac 67 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
phungductung 0:4e245f4bc8ac 68 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
phungductung 0:4e245f4bc8ac 69 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
phungductung 0:4e245f4bc8ac 70 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
phungductung 0:4e245f4bc8ac 71 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
phungductung 0:4e245f4bc8ac 72 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
phungductung 0:4e245f4bc8ac 73 *
phungductung 0:4e245f4bc8ac 74 ******************************************************************************
phungductung 0:4e245f4bc8ac 75 */
phungductung 0:4e245f4bc8ac 76
phungductung 0:4e245f4bc8ac 77 /* Includes ------------------------------------------------------------------*/
phungductung 0:4e245f4bc8ac 78 #include "stm32746g_discovery_sd.h"
phungductung 0:4e245f4bc8ac 79
phungductung 0:4e245f4bc8ac 80 /** @addtogroup BSP
phungductung 0:4e245f4bc8ac 81 * @{
phungductung 0:4e245f4bc8ac 82 */
phungductung 0:4e245f4bc8ac 83
phungductung 0:4e245f4bc8ac 84 /** @addtogroup STM32746G_DISCOVERY
phungductung 0:4e245f4bc8ac 85 * @{
phungductung 0:4e245f4bc8ac 86 */
phungductung 0:4e245f4bc8ac 87
phungductung 0:4e245f4bc8ac 88 /** @defgroup STM32746G_DISCOVERY_SD STM32746G_DISCOVERY_SD
phungductung 0:4e245f4bc8ac 89 * @{
phungductung 0:4e245f4bc8ac 90 */
phungductung 0:4e245f4bc8ac 91
phungductung 0:4e245f4bc8ac 92
phungductung 0:4e245f4bc8ac 93 /** @defgroup STM32746G_DISCOVERY_SD_Private_TypesDefinitions STM32746G_DISCOVERY_SD Private Types Definitions
phungductung 0:4e245f4bc8ac 94 * @{
phungductung 0:4e245f4bc8ac 95 */
phungductung 0:4e245f4bc8ac 96 /**
phungductung 0:4e245f4bc8ac 97 * @}
phungductung 0:4e245f4bc8ac 98 */
phungductung 0:4e245f4bc8ac 99
phungductung 0:4e245f4bc8ac 100 /** @defgroup STM32746G_DISCOVERY_SD_Private_Defines STM32746G_DISCOVERY_SD Private Defines
phungductung 0:4e245f4bc8ac 101 * @{
phungductung 0:4e245f4bc8ac 102 */
phungductung 0:4e245f4bc8ac 103 /**
phungductung 0:4e245f4bc8ac 104 * @}
phungductung 0:4e245f4bc8ac 105 */
phungductung 0:4e245f4bc8ac 106
phungductung 0:4e245f4bc8ac 107 /** @defgroup STM32746G_DISCOVERY_SD_Private_Macros STM32746G_DISCOVERY_SD Private Macros
phungductung 0:4e245f4bc8ac 108 * @{
phungductung 0:4e245f4bc8ac 109 */
phungductung 0:4e245f4bc8ac 110 /**
phungductung 0:4e245f4bc8ac 111 * @}
phungductung 0:4e245f4bc8ac 112 */
phungductung 0:4e245f4bc8ac 113
phungductung 0:4e245f4bc8ac 114 /** @defgroup STM32746G_DISCOVERY_SD_Private_Variables STM32746G_DISCOVERY_SD Private Variables
phungductung 0:4e245f4bc8ac 115 * @{
phungductung 0:4e245f4bc8ac 116 */
phungductung 0:4e245f4bc8ac 117 static SD_HandleTypeDef uSdHandle;
phungductung 0:4e245f4bc8ac 118 static SD_CardInfo uSdCardInfo;
phungductung 0:4e245f4bc8ac 119
phungductung 0:4e245f4bc8ac 120 /**
phungductung 0:4e245f4bc8ac 121 * @}
phungductung 0:4e245f4bc8ac 122 */
phungductung 0:4e245f4bc8ac 123
phungductung 0:4e245f4bc8ac 124 /** @defgroup STM32746G_DISCOVERY_SD_Private_FunctionPrototypes STM32746G_DISCOVERY_SD Private Function Prototypes
phungductung 0:4e245f4bc8ac 125 * @{
phungductung 0:4e245f4bc8ac 126 */
phungductung 0:4e245f4bc8ac 127 /**
phungductung 0:4e245f4bc8ac 128 * @}
phungductung 0:4e245f4bc8ac 129 */
phungductung 0:4e245f4bc8ac 130
phungductung 0:4e245f4bc8ac 131 /** @defgroup STM32746G_DISCOVERY_SD_Exported_Functions STM32746G_DISCOVERY_SD Exported Functions
phungductung 0:4e245f4bc8ac 132 * @{
phungductung 0:4e245f4bc8ac 133 */
phungductung 0:4e245f4bc8ac 134
phungductung 0:4e245f4bc8ac 135 /**
phungductung 0:4e245f4bc8ac 136 * @brief Initializes the SD card device.
phungductung 0:4e245f4bc8ac 137 * @retval SD status
phungductung 0:4e245f4bc8ac 138 */
phungductung 0:4e245f4bc8ac 139 uint8_t BSP_SD_Init(void)
phungductung 0:4e245f4bc8ac 140 {
phungductung 0:4e245f4bc8ac 141 uint8_t sd_state = MSD_OK;
phungductung 0:4e245f4bc8ac 142
phungductung 0:4e245f4bc8ac 143 /* uSD device interface configuration */
phungductung 0:4e245f4bc8ac 144 uSdHandle.Instance = SDMMC1;
phungductung 0:4e245f4bc8ac 145
phungductung 0:4e245f4bc8ac 146 uSdHandle.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
phungductung 0:4e245f4bc8ac 147 uSdHandle.Init.ClockBypass = SDMMC_CLOCK_BYPASS_DISABLE;
phungductung 0:4e245f4bc8ac 148 uSdHandle.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
phungductung 0:4e245f4bc8ac 149 uSdHandle.Init.BusWide = SDMMC_BUS_WIDE_1B;
phungductung 0:4e245f4bc8ac 150 uSdHandle.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
phungductung 0:4e245f4bc8ac 151 uSdHandle.Init.ClockDiv = SDMMC_TRANSFER_CLK_DIV;
phungductung 0:4e245f4bc8ac 152
phungductung 0:4e245f4bc8ac 153 /* Msp SD Detect pin initialization */
phungductung 0:4e245f4bc8ac 154 BSP_SD_Detect_MspInit(&uSdHandle, NULL);
phungductung 0:4e245f4bc8ac 155 if(BSP_SD_IsDetected() != SD_PRESENT) /* Check if SD card is present */
phungductung 0:4e245f4bc8ac 156 {
phungductung 0:4e245f4bc8ac 157 return MSD_ERROR_SD_NOT_PRESENT;
phungductung 0:4e245f4bc8ac 158 }
phungductung 0:4e245f4bc8ac 159
phungductung 0:4e245f4bc8ac 160 /* Msp SD initialization */
phungductung 0:4e245f4bc8ac 161 BSP_SD_MspInit(&uSdHandle, NULL);
phungductung 0:4e245f4bc8ac 162
phungductung 0:4e245f4bc8ac 163 /* HAL SD initialization */
phungductung 0:4e245f4bc8ac 164 if(HAL_SD_Init(&uSdHandle, &uSdCardInfo) != SD_OK)
phungductung 0:4e245f4bc8ac 165 {
phungductung 0:4e245f4bc8ac 166 sd_state = MSD_ERROR;
phungductung 0:4e245f4bc8ac 167 }
phungductung 0:4e245f4bc8ac 168
phungductung 0:4e245f4bc8ac 169 /* Configure SD Bus width */
phungductung 0:4e245f4bc8ac 170 if(sd_state == MSD_OK)
phungductung 0:4e245f4bc8ac 171 {
phungductung 0:4e245f4bc8ac 172 /* Enable wide operation */
phungductung 0:4e245f4bc8ac 173 if(HAL_SD_WideBusOperation_Config(&uSdHandle, SDMMC_BUS_WIDE_4B) != SD_OK)
phungductung 0:4e245f4bc8ac 174 {
phungductung 0:4e245f4bc8ac 175 sd_state = MSD_ERROR;
phungductung 0:4e245f4bc8ac 176 }
phungductung 0:4e245f4bc8ac 177 else
phungductung 0:4e245f4bc8ac 178 {
phungductung 0:4e245f4bc8ac 179 sd_state = MSD_OK;
phungductung 0:4e245f4bc8ac 180 }
phungductung 0:4e245f4bc8ac 181 }
phungductung 0:4e245f4bc8ac 182
phungductung 0:4e245f4bc8ac 183 return sd_state;
phungductung 0:4e245f4bc8ac 184 }
phungductung 0:4e245f4bc8ac 185
phungductung 0:4e245f4bc8ac 186 /**
phungductung 0:4e245f4bc8ac 187 * @brief DeInitializes the SD card device.
phungductung 0:4e245f4bc8ac 188 * @retval SD status
phungductung 0:4e245f4bc8ac 189 */
phungductung 0:4e245f4bc8ac 190 uint8_t BSP_SD_DeInit(void)
phungductung 0:4e245f4bc8ac 191 {
phungductung 0:4e245f4bc8ac 192 uint8_t sd_state = MSD_OK;
phungductung 0:4e245f4bc8ac 193
phungductung 0:4e245f4bc8ac 194 uSdHandle.Instance = SDMMC1;
phungductung 0:4e245f4bc8ac 195
phungductung 0:4e245f4bc8ac 196 /* HAL SD deinitialization */
phungductung 0:4e245f4bc8ac 197 if(HAL_SD_DeInit(&uSdHandle) != HAL_OK)
phungductung 0:4e245f4bc8ac 198 {
phungductung 0:4e245f4bc8ac 199 sd_state = MSD_ERROR;
phungductung 0:4e245f4bc8ac 200 }
phungductung 0:4e245f4bc8ac 201
phungductung 0:4e245f4bc8ac 202 /* Msp SD deinitialization */
phungductung 0:4e245f4bc8ac 203 uSdHandle.Instance = SDMMC1;
phungductung 0:4e245f4bc8ac 204 BSP_SD_MspDeInit(&uSdHandle, NULL);
phungductung 0:4e245f4bc8ac 205
phungductung 0:4e245f4bc8ac 206 return sd_state;
phungductung 0:4e245f4bc8ac 207 }
phungductung 0:4e245f4bc8ac 208
phungductung 0:4e245f4bc8ac 209 /**
phungductung 0:4e245f4bc8ac 210 * @brief Configures Interrupt mode for SD detection pin.
phungductung 0:4e245f4bc8ac 211 * @retval Returns MSD_OK
phungductung 0:4e245f4bc8ac 212 */
phungductung 0:4e245f4bc8ac 213 uint8_t BSP_SD_ITConfig(void)
phungductung 0:4e245f4bc8ac 214 {
phungductung 0:4e245f4bc8ac 215 GPIO_InitTypeDef gpio_init_structure;
phungductung 0:4e245f4bc8ac 216
phungductung 0:4e245f4bc8ac 217 /* Configure Interrupt mode for SD detection pin */
phungductung 0:4e245f4bc8ac 218 gpio_init_structure.Pin = SD_DETECT_PIN;
phungductung 0:4e245f4bc8ac 219 gpio_init_structure.Pull = GPIO_PULLUP;
phungductung 0:4e245f4bc8ac 220 gpio_init_structure.Speed = GPIO_SPEED_FAST;
phungductung 0:4e245f4bc8ac 221 gpio_init_structure.Mode = GPIO_MODE_IT_RISING_FALLING;
phungductung 0:4e245f4bc8ac 222 HAL_GPIO_Init(SD_DETECT_GPIO_PORT, &gpio_init_structure);
phungductung 0:4e245f4bc8ac 223
phungductung 0:4e245f4bc8ac 224 /* Enable and set SD detect EXTI Interrupt to the lowest priority */
phungductung 0:4e245f4bc8ac 225 HAL_NVIC_SetPriority((IRQn_Type)(SD_DETECT_EXTI_IRQn), 0x0F, 0x00);
phungductung 0:4e245f4bc8ac 226 HAL_NVIC_EnableIRQ((IRQn_Type)(SD_DETECT_EXTI_IRQn));
phungductung 0:4e245f4bc8ac 227
phungductung 0:4e245f4bc8ac 228 return MSD_OK;
phungductung 0:4e245f4bc8ac 229 }
phungductung 0:4e245f4bc8ac 230
phungductung 0:4e245f4bc8ac 231 /**
phungductung 0:4e245f4bc8ac 232 * @brief Detects if SD card is correctly plugged in the memory slot or not.
phungductung 0:4e245f4bc8ac 233 * @retval Returns if SD is detected or not
phungductung 0:4e245f4bc8ac 234 */
phungductung 0:4e245f4bc8ac 235 uint8_t BSP_SD_IsDetected(void)
phungductung 0:4e245f4bc8ac 236 {
phungductung 0:4e245f4bc8ac 237 __IO uint8_t status = SD_PRESENT;
phungductung 0:4e245f4bc8ac 238
phungductung 0:4e245f4bc8ac 239 /* Check SD card detect pin */
phungductung 0:4e245f4bc8ac 240 if (HAL_GPIO_ReadPin(SD_DETECT_GPIO_PORT, SD_DETECT_PIN) == GPIO_PIN_SET)
phungductung 0:4e245f4bc8ac 241 {
phungductung 0:4e245f4bc8ac 242 status = SD_NOT_PRESENT;
phungductung 0:4e245f4bc8ac 243 }
phungductung 0:4e245f4bc8ac 244
phungductung 0:4e245f4bc8ac 245 return status;
phungductung 0:4e245f4bc8ac 246 }
phungductung 0:4e245f4bc8ac 247
phungductung 0:4e245f4bc8ac 248 /**
phungductung 0:4e245f4bc8ac 249 * @brief Reads block(s) from a specified address in an SD card, in polling mode.
phungductung 0:4e245f4bc8ac 250 * @param pData: Pointer to the buffer that will contain the data to transmit
phungductung 0:4e245f4bc8ac 251 * @param ReadAddr: Address from where data is to be read
phungductung 0:4e245f4bc8ac 252 * @param BlockSize: SD card data block size, that should be 512
phungductung 0:4e245f4bc8ac 253 * @param NumOfBlocks: Number of SD blocks to read
phungductung 0:4e245f4bc8ac 254 * @retval SD status
phungductung 0:4e245f4bc8ac 255 */
phungductung 0:4e245f4bc8ac 256 uint8_t BSP_SD_ReadBlocks(uint32_t *pData, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumOfBlocks)
phungductung 0:4e245f4bc8ac 257 {
phungductung 0:4e245f4bc8ac 258 if(HAL_SD_ReadBlocks(&uSdHandle, pData, ReadAddr, BlockSize, NumOfBlocks) != SD_OK)
phungductung 0:4e245f4bc8ac 259 {
phungductung 0:4e245f4bc8ac 260 return MSD_ERROR;
phungductung 0:4e245f4bc8ac 261 }
phungductung 0:4e245f4bc8ac 262 else
phungductung 0:4e245f4bc8ac 263 {
phungductung 0:4e245f4bc8ac 264 return MSD_OK;
phungductung 0:4e245f4bc8ac 265 }
phungductung 0:4e245f4bc8ac 266 }
phungductung 0:4e245f4bc8ac 267
phungductung 0:4e245f4bc8ac 268 /**
phungductung 0:4e245f4bc8ac 269 * @brief Writes block(s) to a specified address in an SD card, in polling mode.
phungductung 0:4e245f4bc8ac 270 * @param pData: Pointer to the buffer that will contain the data to transmit
phungductung 0:4e245f4bc8ac 271 * @param WriteAddr: Address from where data is to be written
phungductung 0:4e245f4bc8ac 272 * @param BlockSize: SD card data block size, that should be 512
phungductung 0:4e245f4bc8ac 273 * @param NumOfBlocks: Number of SD blocks to write
phungductung 0:4e245f4bc8ac 274 * @retval SD status
phungductung 0:4e245f4bc8ac 275 */
phungductung 0:4e245f4bc8ac 276 uint8_t BSP_SD_WriteBlocks(uint32_t *pData, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumOfBlocks)
phungductung 0:4e245f4bc8ac 277 {
phungductung 0:4e245f4bc8ac 278 if(HAL_SD_WriteBlocks(&uSdHandle, pData, WriteAddr, BlockSize, NumOfBlocks) != SD_OK)
phungductung 0:4e245f4bc8ac 279 {
phungductung 0:4e245f4bc8ac 280 return MSD_ERROR;
phungductung 0:4e245f4bc8ac 281 }
phungductung 0:4e245f4bc8ac 282 else
phungductung 0:4e245f4bc8ac 283 {
phungductung 0:4e245f4bc8ac 284 return MSD_OK;
phungductung 0:4e245f4bc8ac 285 }
phungductung 0:4e245f4bc8ac 286 }
phungductung 0:4e245f4bc8ac 287
phungductung 0:4e245f4bc8ac 288 /**
phungductung 0:4e245f4bc8ac 289 * @brief Reads block(s) from a specified address in an SD card, in DMA mode.
phungductung 0:4e245f4bc8ac 290 * @param pData: Pointer to the buffer that will contain the data to transmit
phungductung 0:4e245f4bc8ac 291 * @param ReadAddr: Address from where data is to be read
phungductung 0:4e245f4bc8ac 292 * @param BlockSize: SD card data block size, that should be 512
phungductung 0:4e245f4bc8ac 293 * @param NumOfBlocks: Number of SD blocks to read
phungductung 0:4e245f4bc8ac 294 * @retval SD status
phungductung 0:4e245f4bc8ac 295 */
phungductung 0:4e245f4bc8ac 296 uint8_t BSP_SD_ReadBlocks_DMA(uint32_t *pData, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumOfBlocks)
phungductung 0:4e245f4bc8ac 297 {
phungductung 0:4e245f4bc8ac 298 uint8_t sd_state = MSD_OK;
phungductung 0:4e245f4bc8ac 299
phungductung 0:4e245f4bc8ac 300 /* Read block(s) in DMA transfer mode */
phungductung 0:4e245f4bc8ac 301 if(HAL_SD_ReadBlocks_DMA(&uSdHandle, pData, ReadAddr, BlockSize, NumOfBlocks) != SD_OK)
phungductung 0:4e245f4bc8ac 302 {
phungductung 0:4e245f4bc8ac 303 sd_state = MSD_ERROR;
phungductung 0:4e245f4bc8ac 304 }
phungductung 0:4e245f4bc8ac 305
phungductung 0:4e245f4bc8ac 306 /* Wait until transfer is complete */
phungductung 0:4e245f4bc8ac 307 if(sd_state == MSD_OK)
phungductung 0:4e245f4bc8ac 308 {
phungductung 0:4e245f4bc8ac 309 if(HAL_SD_CheckReadOperation(&uSdHandle, (uint32_t)SD_DATATIMEOUT) != SD_OK)
phungductung 0:4e245f4bc8ac 310 {
phungductung 0:4e245f4bc8ac 311 sd_state = MSD_ERROR;
phungductung 0:4e245f4bc8ac 312 }
phungductung 0:4e245f4bc8ac 313 else
phungductung 0:4e245f4bc8ac 314 {
phungductung 0:4e245f4bc8ac 315 sd_state = MSD_OK;
phungductung 0:4e245f4bc8ac 316 }
phungductung 0:4e245f4bc8ac 317 }
phungductung 0:4e245f4bc8ac 318
phungductung 0:4e245f4bc8ac 319 return sd_state;
phungductung 0:4e245f4bc8ac 320 }
phungductung 0:4e245f4bc8ac 321
phungductung 0:4e245f4bc8ac 322 /**
phungductung 0:4e245f4bc8ac 323 * @brief Writes block(s) to a specified address in an SD card, in DMA mode.
phungductung 0:4e245f4bc8ac 324 * @param pData: Pointer to the buffer that will contain the data to transmit
phungductung 0:4e245f4bc8ac 325 * @param WriteAddr: Address from where data is to be written
phungductung 0:4e245f4bc8ac 326 * @param BlockSize: SD card data block size, that should be 512
phungductung 0:4e245f4bc8ac 327 * @param NumOfBlocks: Number of SD blocks to write
phungductung 0:4e245f4bc8ac 328 * @retval SD status
phungductung 0:4e245f4bc8ac 329 */
phungductung 0:4e245f4bc8ac 330 uint8_t BSP_SD_WriteBlocks_DMA(uint32_t *pData, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumOfBlocks)
phungductung 0:4e245f4bc8ac 331 {
phungductung 0:4e245f4bc8ac 332 uint8_t sd_state = MSD_OK;
phungductung 0:4e245f4bc8ac 333
phungductung 0:4e245f4bc8ac 334 /* Write block(s) in DMA transfer mode */
phungductung 0:4e245f4bc8ac 335 if(HAL_SD_WriteBlocks_DMA(&uSdHandle, pData, WriteAddr, BlockSize, NumOfBlocks) != SD_OK)
phungductung 0:4e245f4bc8ac 336 {
phungductung 0:4e245f4bc8ac 337 sd_state = MSD_ERROR;
phungductung 0:4e245f4bc8ac 338 }
phungductung 0:4e245f4bc8ac 339
phungductung 0:4e245f4bc8ac 340 /* Wait until transfer is complete */
phungductung 0:4e245f4bc8ac 341 if(sd_state == MSD_OK)
phungductung 0:4e245f4bc8ac 342 {
phungductung 0:4e245f4bc8ac 343 if(HAL_SD_CheckWriteOperation(&uSdHandle, (uint32_t)SD_DATATIMEOUT) != SD_OK)
phungductung 0:4e245f4bc8ac 344 {
phungductung 0:4e245f4bc8ac 345 sd_state = MSD_ERROR;
phungductung 0:4e245f4bc8ac 346 }
phungductung 0:4e245f4bc8ac 347 else
phungductung 0:4e245f4bc8ac 348 {
phungductung 0:4e245f4bc8ac 349 sd_state = MSD_OK;
phungductung 0:4e245f4bc8ac 350 }
phungductung 0:4e245f4bc8ac 351 }
phungductung 0:4e245f4bc8ac 352
phungductung 0:4e245f4bc8ac 353 return sd_state;
phungductung 0:4e245f4bc8ac 354 }
phungductung 0:4e245f4bc8ac 355
phungductung 0:4e245f4bc8ac 356 /**
phungductung 0:4e245f4bc8ac 357 * @brief Erases the specified memory area of the given SD card.
phungductung 0:4e245f4bc8ac 358 * @param StartAddr: Start byte address
phungductung 0:4e245f4bc8ac 359 * @param EndAddr: End byte address
phungductung 0:4e245f4bc8ac 360 * @retval SD status
phungductung 0:4e245f4bc8ac 361 */
phungductung 0:4e245f4bc8ac 362 uint8_t BSP_SD_Erase(uint64_t StartAddr, uint64_t EndAddr)
phungductung 0:4e245f4bc8ac 363 {
phungductung 0:4e245f4bc8ac 364 if(HAL_SD_Erase(&uSdHandle, StartAddr, EndAddr) != SD_OK)
phungductung 0:4e245f4bc8ac 365 {
phungductung 0:4e245f4bc8ac 366 return MSD_ERROR;
phungductung 0:4e245f4bc8ac 367 }
phungductung 0:4e245f4bc8ac 368 else
phungductung 0:4e245f4bc8ac 369 {
phungductung 0:4e245f4bc8ac 370 return MSD_OK;
phungductung 0:4e245f4bc8ac 371 }
phungductung 0:4e245f4bc8ac 372 }
phungductung 0:4e245f4bc8ac 373
phungductung 0:4e245f4bc8ac 374 /**
phungductung 0:4e245f4bc8ac 375 * @brief Initializes the SD MSP.
phungductung 0:4e245f4bc8ac 376 * @param hsd: SD handle
phungductung 0:4e245f4bc8ac 377 * @param Params
phungductung 0:4e245f4bc8ac 378 * @retval None
phungductung 0:4e245f4bc8ac 379 */
phungductung 0:4e245f4bc8ac 380 __weak void BSP_SD_MspInit(SD_HandleTypeDef *hsd, void *Params)
phungductung 0:4e245f4bc8ac 381 {
phungductung 0:4e245f4bc8ac 382 static DMA_HandleTypeDef dma_rx_handle;
phungductung 0:4e245f4bc8ac 383 static DMA_HandleTypeDef dma_tx_handle;
phungductung 0:4e245f4bc8ac 384 GPIO_InitTypeDef gpio_init_structure;
phungductung 0:4e245f4bc8ac 385
phungductung 0:4e245f4bc8ac 386 /* Enable SDIO clock */
phungductung 0:4e245f4bc8ac 387 __HAL_RCC_SDMMC1_CLK_ENABLE();
phungductung 0:4e245f4bc8ac 388
phungductung 0:4e245f4bc8ac 389 /* Enable DMA2 clocks */
phungductung 0:4e245f4bc8ac 390 __DMAx_TxRx_CLK_ENABLE();
phungductung 0:4e245f4bc8ac 391
phungductung 0:4e245f4bc8ac 392 /* Enable GPIOs clock */
phungductung 0:4e245f4bc8ac 393 __HAL_RCC_GPIOC_CLK_ENABLE();
phungductung 0:4e245f4bc8ac 394 __HAL_RCC_GPIOD_CLK_ENABLE();
phungductung 0:4e245f4bc8ac 395
phungductung 0:4e245f4bc8ac 396 /* Common GPIO configuration */
phungductung 0:4e245f4bc8ac 397 gpio_init_structure.Mode = GPIO_MODE_AF_PP;
phungductung 0:4e245f4bc8ac 398 gpio_init_structure.Pull = GPIO_PULLUP;
phungductung 0:4e245f4bc8ac 399 gpio_init_structure.Speed = GPIO_SPEED_HIGH;
phungductung 0:4e245f4bc8ac 400 gpio_init_structure.Alternate = GPIO_AF12_SDMMC1;
phungductung 0:4e245f4bc8ac 401
phungductung 0:4e245f4bc8ac 402 /* GPIOC configuration */
phungductung 0:4e245f4bc8ac 403 gpio_init_structure.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12;
phungductung 0:4e245f4bc8ac 404 HAL_GPIO_Init(GPIOC, &gpio_init_structure);
phungductung 0:4e245f4bc8ac 405
phungductung 0:4e245f4bc8ac 406 /* GPIOD configuration */
phungductung 0:4e245f4bc8ac 407 gpio_init_structure.Pin = GPIO_PIN_2;
phungductung 0:4e245f4bc8ac 408 HAL_GPIO_Init(GPIOD, &gpio_init_structure);
phungductung 0:4e245f4bc8ac 409
phungductung 0:4e245f4bc8ac 410 /* NVIC configuration for SDIO interrupts */
phungductung 0:4e245f4bc8ac 411 HAL_NVIC_SetPriority(SDMMC1_IRQn, 5, 0);
phungductung 0:4e245f4bc8ac 412 HAL_NVIC_EnableIRQ(SDMMC1_IRQn);
phungductung 0:4e245f4bc8ac 413
phungductung 0:4e245f4bc8ac 414 /* Configure DMA Rx parameters */
phungductung 0:4e245f4bc8ac 415 dma_rx_handle.Init.Channel = SD_DMAx_Rx_CHANNEL;
phungductung 0:4e245f4bc8ac 416 dma_rx_handle.Init.Direction = DMA_PERIPH_TO_MEMORY;
phungductung 0:4e245f4bc8ac 417 dma_rx_handle.Init.PeriphInc = DMA_PINC_DISABLE;
phungductung 0:4e245f4bc8ac 418 dma_rx_handle.Init.MemInc = DMA_MINC_ENABLE;
phungductung 0:4e245f4bc8ac 419 dma_rx_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
phungductung 0:4e245f4bc8ac 420 dma_rx_handle.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
phungductung 0:4e245f4bc8ac 421 dma_rx_handle.Init.Mode = DMA_PFCTRL;
phungductung 0:4e245f4bc8ac 422 dma_rx_handle.Init.Priority = DMA_PRIORITY_VERY_HIGH;
phungductung 0:4e245f4bc8ac 423 dma_rx_handle.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
phungductung 0:4e245f4bc8ac 424 dma_rx_handle.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
phungductung 0:4e245f4bc8ac 425 dma_rx_handle.Init.MemBurst = DMA_MBURST_INC4;
phungductung 0:4e245f4bc8ac 426 dma_rx_handle.Init.PeriphBurst = DMA_PBURST_INC4;
phungductung 0:4e245f4bc8ac 427
phungductung 0:4e245f4bc8ac 428 dma_rx_handle.Instance = SD_DMAx_Rx_STREAM;
phungductung 0:4e245f4bc8ac 429
phungductung 0:4e245f4bc8ac 430 /* Associate the DMA handle */
phungductung 0:4e245f4bc8ac 431 __HAL_LINKDMA(hsd, hdmarx, dma_rx_handle);
phungductung 0:4e245f4bc8ac 432
phungductung 0:4e245f4bc8ac 433 /* Deinitialize the stream for new transfer */
phungductung 0:4e245f4bc8ac 434 HAL_DMA_DeInit(&dma_rx_handle);
phungductung 0:4e245f4bc8ac 435
phungductung 0:4e245f4bc8ac 436 /* Configure the DMA stream */
phungductung 0:4e245f4bc8ac 437 HAL_DMA_Init(&dma_rx_handle);
phungductung 0:4e245f4bc8ac 438
phungductung 0:4e245f4bc8ac 439 /* Configure DMA Tx parameters */
phungductung 0:4e245f4bc8ac 440 dma_tx_handle.Init.Channel = SD_DMAx_Tx_CHANNEL;
phungductung 0:4e245f4bc8ac 441 dma_tx_handle.Init.Direction = DMA_MEMORY_TO_PERIPH;
phungductung 0:4e245f4bc8ac 442 dma_tx_handle.Init.PeriphInc = DMA_PINC_DISABLE;
phungductung 0:4e245f4bc8ac 443 dma_tx_handle.Init.MemInc = DMA_MINC_ENABLE;
phungductung 0:4e245f4bc8ac 444 dma_tx_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
phungductung 0:4e245f4bc8ac 445 dma_tx_handle.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
phungductung 0:4e245f4bc8ac 446 dma_tx_handle.Init.Mode = DMA_PFCTRL;
phungductung 0:4e245f4bc8ac 447 dma_tx_handle.Init.Priority = DMA_PRIORITY_VERY_HIGH;
phungductung 0:4e245f4bc8ac 448 dma_tx_handle.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
phungductung 0:4e245f4bc8ac 449 dma_tx_handle.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
phungductung 0:4e245f4bc8ac 450 dma_tx_handle.Init.MemBurst = DMA_MBURST_INC4;
phungductung 0:4e245f4bc8ac 451 dma_tx_handle.Init.PeriphBurst = DMA_PBURST_INC4;
phungductung 0:4e245f4bc8ac 452
phungductung 0:4e245f4bc8ac 453 dma_tx_handle.Instance = SD_DMAx_Tx_STREAM;
phungductung 0:4e245f4bc8ac 454
phungductung 0:4e245f4bc8ac 455 /* Associate the DMA handle */
phungductung 0:4e245f4bc8ac 456 __HAL_LINKDMA(hsd, hdmatx, dma_tx_handle);
phungductung 0:4e245f4bc8ac 457
phungductung 0:4e245f4bc8ac 458 /* Deinitialize the stream for new transfer */
phungductung 0:4e245f4bc8ac 459 HAL_DMA_DeInit(&dma_tx_handle);
phungductung 0:4e245f4bc8ac 460
phungductung 0:4e245f4bc8ac 461 /* Configure the DMA stream */
phungductung 0:4e245f4bc8ac 462 HAL_DMA_Init(&dma_tx_handle);
phungductung 0:4e245f4bc8ac 463
phungductung 0:4e245f4bc8ac 464 /* NVIC configuration for DMA transfer complete interrupt */
phungductung 0:4e245f4bc8ac 465 HAL_NVIC_SetPriority(SD_DMAx_Rx_IRQn, 6, 0);
phungductung 0:4e245f4bc8ac 466 HAL_NVIC_EnableIRQ(SD_DMAx_Rx_IRQn);
phungductung 0:4e245f4bc8ac 467
phungductung 0:4e245f4bc8ac 468 /* NVIC configuration for DMA transfer complete interrupt */
phungductung 0:4e245f4bc8ac 469 HAL_NVIC_SetPriority(SD_DMAx_Tx_IRQn, 6, 0);
phungductung 0:4e245f4bc8ac 470 HAL_NVIC_EnableIRQ(SD_DMAx_Tx_IRQn);
phungductung 0:4e245f4bc8ac 471 }
phungductung 0:4e245f4bc8ac 472
phungductung 0:4e245f4bc8ac 473 /**
phungductung 0:4e245f4bc8ac 474 * @brief Initializes the SD Detect pin MSP.
phungductung 0:4e245f4bc8ac 475 * @param hsd: SD handle
phungductung 0:4e245f4bc8ac 476 * @param Params
phungductung 0:4e245f4bc8ac 477 * @retval None
phungductung 0:4e245f4bc8ac 478 */
phungductung 0:4e245f4bc8ac 479 __weak void BSP_SD_Detect_MspInit(SD_HandleTypeDef *hsd, void *Params)
phungductung 0:4e245f4bc8ac 480 {
phungductung 0:4e245f4bc8ac 481 GPIO_InitTypeDef gpio_init_structure;
phungductung 0:4e245f4bc8ac 482
phungductung 0:4e245f4bc8ac 483 SD_DETECT_GPIO_CLK_ENABLE();
phungductung 0:4e245f4bc8ac 484
phungductung 0:4e245f4bc8ac 485 /* GPIO configuration in input for uSD_Detect signal */
phungductung 0:4e245f4bc8ac 486 gpio_init_structure.Pin = SD_DETECT_PIN;
phungductung 0:4e245f4bc8ac 487 gpio_init_structure.Mode = GPIO_MODE_INPUT;
phungductung 0:4e245f4bc8ac 488 gpio_init_structure.Pull = GPIO_PULLUP;
phungductung 0:4e245f4bc8ac 489 gpio_init_structure.Speed = GPIO_SPEED_HIGH;
phungductung 0:4e245f4bc8ac 490 HAL_GPIO_Init(SD_DETECT_GPIO_PORT, &gpio_init_structure);
phungductung 0:4e245f4bc8ac 491 }
phungductung 0:4e245f4bc8ac 492
phungductung 0:4e245f4bc8ac 493 /**
phungductung 0:4e245f4bc8ac 494 * @brief DeInitializes the SD MSP.
phungductung 0:4e245f4bc8ac 495 * @param hsd: SD handle
phungductung 0:4e245f4bc8ac 496 * @param Params
phungductung 0:4e245f4bc8ac 497 * @retval None
phungductung 0:4e245f4bc8ac 498 */
phungductung 0:4e245f4bc8ac 499 __weak void BSP_SD_MspDeInit(SD_HandleTypeDef *hsd, void *Params)
phungductung 0:4e245f4bc8ac 500 {
phungductung 0:4e245f4bc8ac 501 static DMA_HandleTypeDef dma_rx_handle;
phungductung 0:4e245f4bc8ac 502 static DMA_HandleTypeDef dma_tx_handle;
phungductung 0:4e245f4bc8ac 503
phungductung 0:4e245f4bc8ac 504 /* Disable NVIC for DMA transfer complete interrupts */
phungductung 0:4e245f4bc8ac 505 HAL_NVIC_DisableIRQ(SD_DMAx_Rx_IRQn);
phungductung 0:4e245f4bc8ac 506 HAL_NVIC_DisableIRQ(SD_DMAx_Tx_IRQn);
phungductung 0:4e245f4bc8ac 507
phungductung 0:4e245f4bc8ac 508 /* Deinitialize the stream for new transfer */
phungductung 0:4e245f4bc8ac 509 dma_rx_handle.Instance = SD_DMAx_Rx_STREAM;
phungductung 0:4e245f4bc8ac 510 HAL_DMA_DeInit(&dma_rx_handle);
phungductung 0:4e245f4bc8ac 511
phungductung 0:4e245f4bc8ac 512 /* Deinitialize the stream for new transfer */
phungductung 0:4e245f4bc8ac 513 dma_tx_handle.Instance = SD_DMAx_Tx_STREAM;
phungductung 0:4e245f4bc8ac 514 HAL_DMA_DeInit(&dma_tx_handle);
phungductung 0:4e245f4bc8ac 515
phungductung 0:4e245f4bc8ac 516 /* Disable NVIC for SDIO interrupts */
phungductung 0:4e245f4bc8ac 517 HAL_NVIC_DisableIRQ(SDMMC1_IRQn);
phungductung 0:4e245f4bc8ac 518
phungductung 0:4e245f4bc8ac 519 /* DeInit GPIO pins can be done in the application
phungductung 0:4e245f4bc8ac 520 (by surcharging this __weak function) */
phungductung 0:4e245f4bc8ac 521
phungductung 0:4e245f4bc8ac 522 /* Disable SDMMC1 clock */
phungductung 0:4e245f4bc8ac 523 __HAL_RCC_SDMMC1_CLK_DISABLE();
phungductung 0:4e245f4bc8ac 524
phungductung 0:4e245f4bc8ac 525 /* GPIO pins clock and DMA clocks can be shut down in the application
phungductung 0:4e245f4bc8ac 526 by surcharging this __weak function */
phungductung 0:4e245f4bc8ac 527 }
phungductung 0:4e245f4bc8ac 528
phungductung 0:4e245f4bc8ac 529 /**
phungductung 0:4e245f4bc8ac 530 * @brief Handles SD card interrupt request.
phungductung 0:4e245f4bc8ac 531 * @retval None
phungductung 0:4e245f4bc8ac 532 */
phungductung 0:4e245f4bc8ac 533 void BSP_SD_IRQHandler(void)
phungductung 0:4e245f4bc8ac 534 {
phungductung 0:4e245f4bc8ac 535 HAL_SD_IRQHandler(&uSdHandle);
phungductung 0:4e245f4bc8ac 536 }
phungductung 0:4e245f4bc8ac 537
phungductung 0:4e245f4bc8ac 538 /**
phungductung 0:4e245f4bc8ac 539 * @brief Handles SD DMA Tx transfer interrupt request.
phungductung 0:4e245f4bc8ac 540 * @retval None
phungductung 0:4e245f4bc8ac 541 */
phungductung 0:4e245f4bc8ac 542 void BSP_SD_DMA_Tx_IRQHandler(void)
phungductung 0:4e245f4bc8ac 543 {
phungductung 0:4e245f4bc8ac 544 HAL_DMA_IRQHandler(uSdHandle.hdmatx);
phungductung 0:4e245f4bc8ac 545 }
phungductung 0:4e245f4bc8ac 546
phungductung 0:4e245f4bc8ac 547 /**
phungductung 0:4e245f4bc8ac 548 * @brief Handles SD DMA Rx transfer interrupt request.
phungductung 0:4e245f4bc8ac 549 * @retval None
phungductung 0:4e245f4bc8ac 550 */
phungductung 0:4e245f4bc8ac 551 void BSP_SD_DMA_Rx_IRQHandler(void)
phungductung 0:4e245f4bc8ac 552 {
phungductung 0:4e245f4bc8ac 553 HAL_DMA_IRQHandler(uSdHandle.hdmarx);
phungductung 0:4e245f4bc8ac 554 }
phungductung 0:4e245f4bc8ac 555
phungductung 0:4e245f4bc8ac 556 /**
phungductung 0:4e245f4bc8ac 557 * @brief Gets the current SD card data status.
phungductung 0:4e245f4bc8ac 558 * @retval Data transfer state.
phungductung 0:4e245f4bc8ac 559 * This value can be one of the following values:
phungductung 0:4e245f4bc8ac 560 * @arg SD_TRANSFER_OK: No data transfer is acting
phungductung 0:4e245f4bc8ac 561 * @arg SD_TRANSFER_BUSY: Data transfer is acting
phungductung 0:4e245f4bc8ac 562 * @arg SD_TRANSFER_ERROR: Data transfer error
phungductung 0:4e245f4bc8ac 563 */
phungductung 0:4e245f4bc8ac 564 HAL_SD_TransferStateTypedef BSP_SD_GetStatus(void)
phungductung 0:4e245f4bc8ac 565 {
phungductung 0:4e245f4bc8ac 566 return(HAL_SD_GetStatus(&uSdHandle));
phungductung 0:4e245f4bc8ac 567 }
phungductung 0:4e245f4bc8ac 568
phungductung 0:4e245f4bc8ac 569 /**
phungductung 0:4e245f4bc8ac 570 * @brief Get SD information about specific SD card.
phungductung 0:4e245f4bc8ac 571 * @param CardInfo: Pointer to HAL_SD_CardInfoTypedef structure
phungductung 0:4e245f4bc8ac 572 * @retval None
phungductung 0:4e245f4bc8ac 573 */
phungductung 0:4e245f4bc8ac 574 void BSP_SD_GetCardInfo(HAL_SD_CardInfoTypedef *CardInfo)
phungductung 0:4e245f4bc8ac 575 {
phungductung 0:4e245f4bc8ac 576 /* Get SD card Information */
phungductung 0:4e245f4bc8ac 577 HAL_SD_Get_CardInfo(&uSdHandle, CardInfo);
phungductung 0:4e245f4bc8ac 578 }
phungductung 0:4e245f4bc8ac 579
phungductung 0:4e245f4bc8ac 580 /**
phungductung 0:4e245f4bc8ac 581 * @}
phungductung 0:4e245f4bc8ac 582 */
phungductung 0:4e245f4bc8ac 583
phungductung 0:4e245f4bc8ac 584 /**
phungductung 0:4e245f4bc8ac 585 * @}
phungductung 0:4e245f4bc8ac 586 */
phungductung 0:4e245f4bc8ac 587
phungductung 0:4e245f4bc8ac 588 /**
phungductung 0:4e245f4bc8ac 589 * @}
phungductung 0:4e245f4bc8ac 590 */
phungductung 0:4e245f4bc8ac 591
phungductung 0:4e245f4bc8ac 592 /**
phungductung 0:4e245f4bc8ac 593 * @}
phungductung 0:4e245f4bc8ac 594 */
phungductung 0:4e245f4bc8ac 595
phungductung 0:4e245f4bc8ac 596 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/