说明:
SD(Secure Digital)卡驱动,实现SD卡的读,写和擦除操作。
==============================================================================
##### 驱动如何使用 #####
==============================================================================
1、底层初始化HAL_SD_MspInit。
(1)__HAL_RCC_SDMMC_CLK_ENABLE
(2)__HAL_RCC_GPIOx_CLK_ENABLE
(3)HAL_GPIO_Init配置复用模式(复用推挽?)
(4)使用DMA传输时,如果需要中断处理,需要配置NVIC
a、HAL_NVIC_SetPriority
b、HAL_NVIC_EnableIRQ
c、SDMMC的中断使能和禁止函数__HAL_SD_ENABLE_IT,__HAL_SD_DISABLE_IT
d、中断标志位处理__HAL_SD_GET_IT和__HAL_SD_CLEAR_IT
e、SDMCC不需要通用的DMA,因为内部自带一个DMA。
2、驱动文件stm32h7xx_hal_sd.c主要实现SD卡的读,写和操作操作。
3、SD卡的初始化和配置
(1)使用函数HAL_SD_Init初始化SD卡,初始化完毕后,将其至于待机模式(随时可以进行数据传输)。
(2)初始阶段配置速度是400KHz并检查是标准容量卡还是高容量卡, 初始阶段的时钟可以通过参数ClockDiv配置
SDMMC_CK = SDMMCCLK / (2 * ClockDiv)
但初始阶段的速度不可操作400KHz。
(3)获取CID和CSD数据,所有相关的信息都是存储在结构体变量SDCardInfo里面,像SD卡容量和块大小都有记录。
SD卡的句柄结构体链接了SDCardInfo。
(4)重新配置参数ClockDiv,进入数据传输状态后,默认速度不可操作25MHz,高速不可超过100MHz。
(5)根据步骤2中读取的地址选择相应的SD卡。
(6)配置SD卡的带宽为4bit。
4、SD卡读操作
(1)通过函数HAL_SD_ReadBlocks读取,块大小仅支持512字节,而块个数可以通过形参NumberOfBlocks配置。
(2)DMA方式的话,通过函数HAL_SD_ReadBlocks_DMA读取,块大小仅支持512字节,而块个数可以通过形参NumberOfBlocks配置。
5、SD卡写操作
(1)通过函数HAL_SD_WriteBlocks写入,块大小仅支持512字节,而块个数可以通过形参NumberOfBlocks配置。
(2)DMA方式的话,通过函数HAL_SD_WriteBlocks_DMA写入,块大小仅支持512字节,而块个数可以通过形参NumberOfBlocks配置。
6、状态获取函数HAL_SD_GetStatusInfo
随时随地都可以调用,此函数会首先检测是否还在连接状态,然后获取状态信息。
7、四个宏定义函数
__HAL_SD_ENABLE_IT: 使能中断
__HAL_SD_DISABLE_IT: 禁止中断
__HAL_SD_GET_FLAG: 获取标志位
__HAL_SD_CLEAR_FLAG: 清楚标志位
相关的API。
初始化和复位初始化函数
HAL_StatusTypeDef HAL_SD_Init(SD_HandleTypeDef *hsd);
HAL_StatusTypeDef HAL_SD_InitCard(SD_HandleTypeDef *hsd);
HAL_StatusTypeDef HAL_SD_DeInit (SD_HandleTypeDef *hsd);
void HAL_SD_MspInit(SD_HandleTypeDef *hsd);
void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd);
/* 查询方式 */
HAL_StatusTypeDef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout);
HAL_StatusTypeDef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout);
HAL_StatusTypeDef HAL_SD_Erase(SD_HandleTypeDef *hsd, uint32_t BlockStartAdd, uint32_t BlockEndAdd);
/* 中断方式 */
HAL_StatusTypeDef HAL_SD_ReadBlocks_IT(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks);
HAL_StatusTypeDef HAL_SD_WriteBlocks_IT(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks);
/* DMA方式 */
HAL_StatusTypeDef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks);
HAL_StatusTypeDef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks);
void HAL_SD_IRQHandler(SD_HandleTypeDef *hsd);
/* DMA方式的回调函数 */
void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd);
void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd);
void HAL_SD_ErrorCallback(SD_HandleTypeDef *hsd);
void HAL_SD_AbortCallback(SD_HandleTypeDef *hsd);
配置是否使用了电平转换芯片,3.3V到1.8V
#if (USE_SD_TRANSCEIVER != 0U)
void HAL_SD_DriveTransceiver_1_8V_Callback(FlagStatus status);
#endif
配置操作SD卡的位宽
HAL_StatusTypeDef HAL_SD_ConfigWideBusOperation(SD_HandleTypeDef *hsd, uint32_t WideMode);
SD卡信息的相关函数
HAL_StatusTypeDef HAL_SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus);
HAL_SD_CardStateTypedef HAL_SD_GetCardState(SD_HandleTypeDef *hsd);
HAL_StatusTypeDef HAL_SD_GetCardCID(SD_HandleTypeDef *hsd, HAL_SD_CardCIDTypedef *pCID);
HAL_StatusTypeDef HAL_SD_GetCardCSD(SD_HandleTypeDef *hsd, HAL_SD_CardCSDTypedef *pCSD);
HAL_StatusTypeDef HAL_SD_GetCardStatus(SD_HandleTypeDef *hsd, HAL_SD_CardStatusTypedef *pStatus);
HAL_StatusTypeDef HAL_SD_GetCardInfo(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypeDef *pCardInfo);
状态和错误信息获取
HAL_SD_StateTypeDef HAL_SD_GetState(SD_HandleTypeDef *hsd);
uint32_t HAL_SD_GetError(SD_HandleTypeDef *hsd);
终止操作
HAL_StatusTypeDef HAL_SD_Abort(SD_HandleTypeDef *hsd);
HAL_StatusTypeDef HAL_SD_Abort_IT(SD_HandleTypeDef *hsd); |