STM32F407之SD卡读数据介绍

来源:本站2019-07-29196 次

STM32F407之SD卡读数据介绍

具体执行流程如下:(1)配置NVIC,SD卡通信用到SDIO中断,如果用到DMA传输还需要配置DMA中断。 注意中断服务函数不是定义在stm32f4xx_文件的,是直接定义在bsp_sdio_文件中,中断服务函数定义在个文件问题都不大,只要定义正确就可以的,编译器会自动寻找。 (2)执行SD_LowLevel_Init函数,其功能是对底层SDIO引脚进行初始化以及开启相关时钟,该函数在之前已经讲解。 (3)SDIO_DeInit函数用于解除初始化SDIO接口,它只是简单调用SD_LowLevel_DeInit函数。

而SD_LowLevel_DeInit函数是与SD_LowLevel_Init函数相反功能,关闭相关时钟,关闭SDIO电源,让SDIO接近上电复位状态。 恢复复位状态后再进行相关配置,可以防止部分没有配置的参数采用非默认值而导致错误,这是ST官方驱动常用的一种初始化方式。 (4)调用SD_PowerON函数,它用于查询卡的工作电压和时钟控制配置,并返回SD_Error类型错误。 卡读操作从SD卡读取数据可分为单块读取和多块读取。

这里介绍单块读操作流程。 SD_ReadBlock函数执行流程如下:(1)将SDIO外设的数据控制寄存器(SDIO_DCTRL)清理,复位之前的传输设置。

(2)调用SDIO_ITConfig函数使能相关中断,包括数据CRC失败中断、数据超时中断、数据结束中断等等。 然后调用SD_LowLevel_DMA_RxConfig函数,配置使能SDIO从SD卡的读取数据的DMA请求。

为使SDIO发送DMA请求,需要调用SDIO_DMACmd函数使能。

对于高容量的SD卡要求块大小必须为512字节,程序员有责任保证目标读取地址与块大小的字节对齐问题。 (3)对SD卡进行数据读写之前,都必须发送CMD16指定块的大小,对于标准卡,读取BlockSize长度字节的块;对于SDHC卡,读取512字节的块。

(4)利用SDIO_DataInitTypeDef结构体类型变量配置数据传输的超时、块数量、数据块大小、数据传输方向等参数并使用SDIO_DataConfig函数完成数据传输环境配置。 (5)最后控制器向SD卡发送单块读数据命令CMD17,SD卡在接收到命令后就会通过数据线把数据传输到控制器数据FIFO内,并自动生成DMA传输请求。 (6)SD_WaitReadOperation函数用于等待数据读取操作完成,只有在确保数据读取完成了,我们就可以放心使用数据。

  • A+
所属分类:儿童文学