你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

F7-DISCO笔记之三:SD和FATFS 精华

[复制链接]
netlhx 发布时间:2015-8-11 21:40
感觉在F7上尽是些比较复杂的东西了。
板载一个TF卡接口,忍不住就塞了块TF卡进去,得配置一下。以前看别人的教程,光一个SD卡驱动流程就晕了,但总得试一下。实际上如果使用HAL库的话,驱动流程要简单得多。

  1. uint8_t BSP_SD_Init(void)
  2. {
  3.   uint8_t sd_state = MSD_OK;
  4.   
  5.   /* uSD device interface configuration */
  6.   uSdHandle.Instance = SDMMC1;

  7.   uSdHandle.Init.ClockEdge           = SDMMC_CLOCK_EDGE_RISING;
  8.   uSdHandle.Init.ClockBypass         = SDMMC_CLOCK_BYPASS_DISABLE;
  9.   uSdHandle.Init.ClockPowerSave      = SDMMC_CLOCK_POWER_SAVE_DISABLE;
  10.   uSdHandle.Init.BusWide             = SDMMC_BUS_WIDE_1B;
  11.   uSdHandle.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
  12.   uSdHandle.Init.ClockDiv            = SDMMC_TRANSFER_CLK_DIV;
  13.   
  14.   /* Msp SD Detect pin initialization */
  15.   BSP_SD_Detect_MspInit(&uSdHandle, NULL);
  16.   if(BSP_SD_IsDetected() != SD_PRESENT)   /* Check if SD card is present */
  17.   {
  18.     return MSD_ERROR_SD_NOT_PRESENT;
  19.   }
  20.   
  21.   /* Msp SD initialization */
  22.   BSP_SD_MspInit(&uSdHandle, NULL);

  23.   /* HAL SD initialization */
  24.   if(HAL_SD_Init(&uSdHandle, &uSdCardInfo) != SD_OK)
  25.   {
  26.     sd_state = MSD_ERROR;
  27.   }
  28.   
  29.   /* Configure SD Bus width */
  30.   if(sd_state == MSD_OK)
  31.   {
  32.     /* Enable wide operation */
  33.     if(HAL_SD_WideBusOperation_Config(&uSdHandle, SDMMC_BUS_WIDE_4B) != SD_OK)
  34.     {
  35.       sd_state = MSD_ERROR;
  36.     }
  37.     else
  38.     {
  39.       sd_state = MSD_OK;
  40.     }
  41.   }
  42.   
  43.   return  sd_state;
  44. }
复制代码
这是从官方例程里截取的驱动SD卡的代码片段,实际上并不怎么复杂。主要的工作流程
  • 设置SD接口的基本参数
  • BSP_SD_IsDetected()检测TF卡是否插上
  • 初始化SD相关的GPIO
  • HAL_SD_Init(&uSdHandle, &uSdCardInfo) 初始化SD
  • 将总线宽度设置为4

重头戏在第4步,也就是传统意义上的SD外设驱动过程,仔细一看,原来这个调用的是库函数!ST把初始化工作都作完了,你就调用就行,有没欢喜得晕过去!

当然泼冷水的来了,这样子不利于理解外设的工作原理,其实只要你真想了解SD驱动原理,把这个函数反复啃上八遍,不就理解了么?关键还是你自己的态度,哈哈。

代码就不上了,自己用CUBEMX创建一个工程,设置好参数,好好研究吧。

这样子驱动的TF卡停留在底层,要想像在电脑上一样访问TF卡的内容,得另外一个组件:FATFS。

FATFS就是一个文件系统,配置好后,使用FOPEN, FREAD类的函数就可以访问SD卡上的内容,实际上FATFS是一个硬件无关组件,配置好底层的驱动,可以驱动USB、SPI FLASH等许多存储设备。

HAL做了大量的工作,帮助我们更好的使用FATFS。

首先在工程里面添加FATFS组件,最简单的办法就是将FATFS整个拷到目标工程下面,然后将相应的支持文件加入到工程当中。

QQ截图20150811204114.png

这些都是要加入到工程中必不可少的文件。

注意最后面的那个文件sd_diskio.c,这个文件就是FATFS与SD接口的桥梁,FATFS执行读写操作,实际上要调用SD的读写函数,下面以读操作为例,

QQ截图20150811204732.png

接着看

QQ截图20150811213006.png

disk是一个结构体变量,其定义如下

QQ截图20150811213241.png

其中的Diskio_drvTypeDef结构定义如下

QQ截图20150811213051.png


将SD卡的读写与FATFS的读写连接到一起的是下面这个定义

QQ截图20150811213457.png

这样,一个f_read操作就被链接到了SD_Read操作,下面就是SD_Read的代码,可以看到该函数执行SD的块读写操作。


QQ截图20150811213519.png

嗯,有点乱,该好好捋一捋思路了!

下面是做实验的结果,将点阵字库放到SD卡上,读写点阵字库输出的效果!

IMG_20150811_213804.jpg


评分

参与人数 1 ST金币 +30 收起 理由
沐紫 + 30 赞一个!

查看全部评分

收藏 2 评论6 发布时间:2015-8-11 21:40

举报

6个回答
netlhx 回答时间:2015-8-11 21:42:55
怎么看点阵字库有点VFD的效果,有么有
shanji 回答时间:2015-8-12 00:02:19
社区图片有logo了
苏柚 回答时间:2015-8-12 08:55:53
鼓掌
yanhaijian 回答时间:2015-8-12 10:08:47
楼主有心人。
沐紫 回答时间:2015-8-12 10:31:33
谢谢楼主
moyanming2013 回答时间:2015-8-12 11:08:23
学习了。。。

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版