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

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 评论5 发布时间:2015-8-11 21:40

举报

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

所属标签

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