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

【经验分享】STM32CubeMX 5.2配置使用STM32F7 的 SD与FatFs

[复制链接]
STMCU小助手 发布时间:2021-12-14 10:38
一  配置STM32CubeMX
1.配置Parameter Settings。(Tips:由于各种卡的品质有区别,有时候可以适当增加clock divide的值)

201907250945024.png


2 .配置DMA Settings。(Tips:使用FatFs必须开启DMA,在FATFS的Advanced Settings页面,Use dma template只有Enabled)

20190725094828888.png


20190725095305743.png


3. NVIC Settings 与 GPIO Settings

2019072509505771.png


20190725095038643.png


4. 勾选FATFS,一帮情况只需要配置Set Defines下的CODE_PAGE

20190725095528492.png


二 编写测试代码

在自动生成的MX_FATFS_Init函数中添加测试代码。能够正常输出SD容量,则表示SD卡初始化成功。

  1. void MX_FATFS_Init(void)
  2. {
  3.     /*## FatFS: Link the SD driver ###########################*/
  4.     retSD = FATFS_LinkDriver(&SD_Driver, SDPath);

  5.     /* USER CODE BEGIN Init */

  6.     /* additional user code for init */
  7.     retSD = f_mount(&SDFatFS, SDPath, 1);                                         //挂载SD卡
  8.     if(retSD)
  9.     {
  10.         Error_Handler();
  11.     }
  12.     sd_total_size = (hsd1.SdCard.BlockNbr >> 20) *  hsd1.SdCard.BlockSize;
  13.     sd_total_size = (SDFatFS.csize * (SDFatFS.n_fatent - 2) / 2) >> 10;
  14.     sd_free_size  = (SDFatFS.csize * SDFatFS.free_clst / 2) >> 10;
  15.     printf("SD Capacity: = %d M", (hsd1.SdCard.BlockNbr >> 20) *  hsd1.SdCard.BlockSize);
  16.     printf("SD Total Size = %d M", sd_total_size);
  17.     printf("SD Free  Size = %d M", sd_free_size);

  18.     /* USER CODE END Init */
  19. }
复制代码

三  将cc936.c文件中的uni2oem与oem2uni数组转换成bin文件

     由于cc936中的有700k左右,该文件主要是数组uni2oem与oem2uni占用空间大,我们可以将该数组转换成bin格式,烧录进SPI Flash,调用数组中的值改为调用对应SPI Flash中的值,这样可以节省大量的空间。

操作方式如下:

下载C2B转换助手V1.1软件

20190807170029936.png


新建 UNIGBK.TXT文档,将两个数组 oem2uni 和 uni2oem 存放在该文档中
使用C2B转换助手V1.1软件打开UNIGBK.TXT文档,点击转换生成UNIGBK.BIN文件
将UNIGBK.BIN烧录进SPI FLASH(此过程省略,可参考博客:)
修改cc936文件中的ff_convert函数如下(代码中的 ftinfo.ugbksize 为我们刚刚生成的 UNIGBK.bin 的大小,而 ftinfo.ugbkaddr 是我们存放 UNIGBK.bin 文件的首地址。):
  1. WCHAR ff_convert (        /* Converted code, 0 means conversion error */
  2.         WCHAR        src,        /* Character code to be converted */
  3.         UINT        dir                /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */
  4. )
  5. {
  6.         WCHAR t[2];
  7.         WCHAR c;
  8.         uint32_t i, li, hi;
  9.         uint16_t n;                        
  10.         uint32_t gbk2uni_offset=0;                  
  11.                                                   
  12.         if (src < 0x80)c = src;//ASCII,直接不用转换.
  13.         else
  14.         {
  15.                  if(dir)        //GBK 2 UNICODE
  16.                 {
  17.                         gbk2uni_offset= ftinfo.ugbksize/2;         
  18.                 }else        //UNICODE 2 GBK  
  19.                 {   
  20.                         gbk2uni_offset=0;        
  21.                 }   
  22.                 /* Unicode to OEMCP */
  23.                 hi = ftinfo.ugbksize/2;//对半开.
  24.                 hi = hi / 4 - 1;
  25.                 li = 0;
  26.                 for (n = 16; n; n--)
  27.                 {
  28.                         i = li + (hi - li) / 2;        
  29.                         W25QXX_Read((uint8_t*)&t,ftinfo.ugbkaddr+i*4+gbk2uni_offset,4);//读出4个字节  
  30.                         if (src == t[0]) break;
  31.                         if (src > t[0])li = i;  
  32.                         else hi = i;   
  33.                 }
  34.                 c = n ? t[1] : 0;              
  35.         }
  36.         return c;
  37. }

复制代码


收藏 评论0 发布时间:2021-12-14 10:38

举报

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