打印

HAL库源文件stm32h7xx_hal_sd.c学习笔记,SD卡驱动(2018-09-27 V1.0)

[复制链接]
368|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
石头张|  楼主 | 2018-8-10 13:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
说明:
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);

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

446

主题

446

帖子

0

粉丝