一 配置STM32CubeMX
1.配置Parameter Settings。(Tips:由于各种卡的品质有区别,有时候可以适当增加clock divide的值)
2 .配置DMA Settings。(Tips:使用FatFs必须开启DMA,在FATFS的Advanced Settings页面,Use dma template只有Enabled)
3. NVIC Settings 与 GPIO Settings
4. 勾选FATFS,一帮情况只需要配置Set Defines下的CODE_PAGE
二 编写测试代码
在自动生成的MX_FATFS_Init函数中添加测试代码。能够正常输出SD容量,则表示SD卡初始化成功。
- void MX_FATFS_Init(void)
- {
- /*## FatFS: Link the SD driver ###########################*/
- retSD = FATFS_LinkDriver(&SD_Driver, SDPath);
- /* USER CODE BEGIN Init */
- /* additional user code for init */
- retSD = f_mount(&SDFatFS, SDPath, 1); //挂载SD卡
- if(retSD)
- {
- Error_Handler();
- }
- sd_total_size = (hsd1.SdCard.BlockNbr >> 20) * hsd1.SdCard.BlockSize;
- sd_total_size = (SDFatFS.csize * (SDFatFS.n_fatent - 2) / 2) >> 10;
- sd_free_size = (SDFatFS.csize * SDFatFS.free_clst / 2) >> 10;
- printf("SD Capacity: = %d M", (hsd1.SdCard.BlockNbr >> 20) * hsd1.SdCard.BlockSize);
- printf("SD Total Size = %d M", sd_total_size);
- printf("SD Free Size = %d M", sd_free_size);
- /* USER CODE END Init */
- }
复制代码
三 将cc936.c文件中的uni2oem与oem2uni数组转换成bin文件
由于cc936中的有700k左右,该文件主要是数组uni2oem与oem2uni占用空间大,我们可以将该数组转换成bin格式,烧录进SPI Flash,调用数组中的值改为调用对应SPI Flash中的值,这样可以节省大量的空间。
操作方式如下:
下载C2B转换助手V1.1软件
新建 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 文件的首地址。):
- WCHAR ff_convert ( /* Converted code, 0 means conversion error */
- WCHAR src, /* Character code to be converted */
- UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */
- )
- {
- WCHAR t[2];
- WCHAR c;
- uint32_t i, li, hi;
- uint16_t n;
- uint32_t gbk2uni_offset=0;
-
- if (src < 0x80)c = src;//ASCII,直接不用转换.
- else
- {
- if(dir) //GBK 2 UNICODE
- {
- gbk2uni_offset= ftinfo.ugbksize/2;
- }else //UNICODE 2 GBK
- {
- gbk2uni_offset=0;
- }
- /* Unicode to OEMCP */
- hi = ftinfo.ugbksize/2;//对半开.
- hi = hi / 4 - 1;
- li = 0;
- for (n = 16; n; n--)
- {
- i = li + (hi - li) / 2;
- W25QXX_Read((uint8_t*)&t,ftinfo.ugbkaddr+i*4+gbk2uni_offset,4);//读出4个字节
- if (src == t[0]) break;
- if (src > t[0])li = i;
- else hi = i;
- }
- c = n ? t[1] : 0;
- }
- return c;
- }
复制代码
|