第37章 基于SD卡的FatFs文件系统—零死角玩转STM32-F429系列

从零实现 FATFS+SD卡 cubemx软件版本是V4.23.0,芯片型号是STM32F103ZET6、STM32F429IGT6;SD卡是闪迪的64G tf卡,然后用了转大卡的卡槽,exFAT。 该篇为调试过程,所以阅读时一定要看到尾,中间的判断是有误的!!!中间会涉及到F429是因为一直失败,我拿两个板子来回尝试。 调试过程: 注意,//在生成fatfs代码后,一定要在初始化SDIO时或者FATFS初始化... 阅读详情
 

第37章     基于SD卡的FatFs文件系统

全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn

野火视频教程优酷观看网址:http://i.youku.com/firege

 

 

 

上一章我们已经全面介绍了SD卡的识别和简单的数据读写,也进行了简单的读写测试,不过像这样直接操作SD卡存储单元,在实际应用中是不现实的。SD卡一般用来存放文件,所以都需要加载文件系统到里面。类似于串行Flash芯片,我们移植FatFs文件系统到SD卡内。

对于FatFs文件系统的介绍和具体移植过程参考"基于串行Flash的FatFs文件系统",这里就不做过多介绍,重点放在SD卡与FatFs接口函数编写上。与串行Flash的FatFs文件系统移植例程相比,FatFs文件系统部分的代码只有diskio.c文件有所不同,其他的不用修改,所以一个简易的移植方法是利用原来工程进行修改。下面讲解利用原来工程实现SD卡的FatFs文件系统。

37.1 FatFs移植步骤

上一章我们已经完成了SD卡驱动程序以及进行了简单的读写测试。该工程有很多东西是现在可以使用的,所以我们先把上一章的工程文件完整的拷贝一份,并修改文件夹名为"SDIO-FatFs移植与读写测试",如果此时使用KEIL软件打开该工程,应该是编译无错误并实现上一章的测试功能。

接下来,我们到串行Flash文件系统移植工程文件的"\SPI—FatFs移植与读写测试\User"文件夹下拷贝"FATFS"整个文件夹到现在工程文件的"\SDIO—FatFs移植与读写测试\User"文件夹下,如图 371。该文件夹是FatFs文件系统的所有代码文件,在串行Flash移植FatFs文件系统时我们对部分文件做了修改,这里主要是想要保留之前的配置,而不是使用FatFs官方源码还需要重新配置。

图 371 拷贝FatFs文件夹

现在就可以使用KEIL软件打开"SDIO-FatFs移植与读写测试"工程文件,并把FatFs相关文件添加到工程内,同时把sdio_test.c文件移除,参考图 372。

图 372 FatFs工程文件结构

添加文件之后还必须打开工程选项对话框添加相关路径,参考图 373。

图 373 添加FatFs路径到工程

操作到这来,工程文件结构就算完整了,接下来就是修改文件代码了。这来有两个文件需要修改,为diskio.c文件和main.c文件。main.c文件内容可以参考"SPI—FatFs移植与读写测试"工程中的main.c文件,只有做小细节修改而已。这来重点讲解diskio.c文件,也是整个移植的重点。

37.2 FatFs接口函数

FatFs文件系统与存储设备的连接函数在diskio.c文件中,主要有5个函数需要我们编写的。

宏定义和存储设备状态获取函数

代码清单 371 宏定义和disk_status函数

1 //宏定义

2 #define ATA 0 // SD卡

3 #define SPI_FLASH 1 // 预留外部SPI Flash使用

4 // SD卡块大小

5 #define SD_BLOCKSIZE 512

6

7 //存储设备状态获取

8 DSTATUS disk_status (

9 BYTE pdrv /* 物理编号 */

10 )

11 {

12 DSTATUS status = STA_NOINIT;

13 switch (pdrv) {

14 case ATA: /* SD CARD */

15 status &= ~STA_NOINIT;

16 break;

17

18 case SPI_FLASH: /* SPI Flash */

19 break;

20

21 default:

22 status = STA_NOINIT;

23 }

24 return status;

25 }

FatFs支持同时挂载多个存储设备,通过定义为不同编号以区别。SD卡一般定义为编号0,编号1预留给串行Flash芯片使用。使用宏定义方式给出SD卡块大小,方便修改。实际上,SD卡块大小一般都是设置为512字节的,不管是标准SD卡还是高容量SD卡。

disk_status函数要求返回存储设备的当前状态,对于SD卡一般返回SD卡插入状态,这里直接返回正常状态。

存储设备初始化函数

代码清单 372 disk_initialize函数

1 DSTATUS disk_initialize (

2 BYTE pdrv /* 物理编号 */

3 )

4 {

5 DSTATUS status = STA_NOINIT;

6 switch (pdrv) {

7 case ATA: /* SD CARD */

8 if (SD_Init()==SD_OK) {

9 status &= ~STA_NOINIT;

10 } else {

11 status = STA_NOINIT;

12 }

13

14 break;

15

16 case SPI_FLASH: /* SPI Flash */

17 break;

18

19 default:

20 status = STA_NOINIT;

21 }

22 return status;

23 }

该函数用于初始化存储设备,一般包括相关GPIO初始化、外设环境初始化、中断配置等等。对于SD卡,直接调用SD_Init函数实现对SD卡初始化,如果函数返回SD_OK说明SD卡正确插入,并且控制器可以与之正常通信。

存储设备数据读取函数

代码清单 373 disk_read函数

1 DRESULT disk_read (

2 BYTE pdrv, /* 设备物理编号(0..) */

3 BYTE *buff, /* 数据缓存区 */

4 DWORD sector, /* 扇区首地址 */

5 UINT count /* 扇区个数(1..128) */

6 )

7 {

8 DRESULT status = RES_PARERR;

9 SD_Error SD_state = SD_OK;

10

11 switch (pdrv) {

12 case ATA: /* SD CARD */

13 if ((DWORD)buff&3) {

14 DRESULT res = RES_OK;

15 DWORD scratch[SD_BLOCKSIZE / 4];

16

17 while (count--) {

18 res = disk_read(ATA,(void *)scratch, sector++, 1);

19

20 if (res != RES_OK) {

21 break;

22 }

23 memcpy(buff, scratch, SD_BLOCKSIZE);

24 buff += SD_BLOCKSIZE;

25 }

26 return res;

27 }

28

29 SD_state=SD_ReadMultiBlocks(buff,sector*SD_BLOCKSIZE,

30 SD_BLOCKSIZE,count);

31 if (SD_state==SD_OK) {

32 /* Check if the Transfer is finished */

33 SD_state=SD_WaitReadOperation();

34 while (SD_GetStatus() != SD_TRANSFER_OK);

35 }

36 if (SD_state!=SD_OK)

37 status = RES_PARERR;

38 else

39 status = RES_OK;

40 break;

41

42 case SPI_FLASH:

43 break;

44

45 default:

46 status = RES_PARERR;

47 }

48 return status;

49 }

disk_read函数用于从存储设备指定地址开始读取一定的数量的数据到指定存储区内。对于SD卡,最重要是使用SD_ReadMultiBlocks函数读取多块数据到存储区。这里需要注意的地方是SD卡数据操作是使用DMA传输的,并设置数据尺寸为32位大小,为实现数据正确传输,要求存储区是4字节对齐。在某些情况下,FatFs提供的buff地址不是4字节对齐,这会导致DMA数据传输失败,所以为保证数据传输正确,可以先判断存储区地址是否是4字节对齐,如果存储区地址已经是4字节对齐,无需其他处理,直接使用SD_ReadMultiBlocks函数执行多块读取即可。如果判断得到地址不是4字节对齐,则先申请一个4字节对齐的临时缓冲区,即局部数组变量scratch,通过定义为DWORD类型可以使得其自动4字节对齐,scratch所占的总存储空间也是一个块大小,这样把一个块数据读取到scratch内,然后把scratch存储器内容拷贝到buff地址空间上就可以了。

SD_ReadMultiBlocks函数用于从SD卡内读取多个块数据,它有四个形参,分别为存储区地址指针、起始块地址、块大小以及块数量。为保证数据传输完整,还需要调用SD_WaitReadOperation函数和SD_GetStatus函数检测和保证传输完成。

存储设备数据写入函数

代码清单 374 disk_write函数

1 #if _USE_WRITE

2 DRESULT disk_write (

3 BYTE pdrv, /* 设备物理编号(0..) */

4 const BYTE *buff, /* 欲写入数据的缓存区 */

5 DWORD sector, /* 扇区首地址 */

6 UINT count /* 扇区个数(1..128) */

7 )

8 {

9 DRESULT status = RES_PARERR;

10 SD_Error SD_state = SD_OK;

11

12 if (!count) {

13 return RES_PARERR; /* Check parameter */

14 }

15

16 switch (pdrv) {

17 case ATA: /* SD CARD */

18 if ((DWORD)buff&3) {

19 DRESULT res = RES_OK;

20 DWORD scratch[SD_BLOCKSIZE / 4];

21

22 while (count--) {

23 memcpy( scratch,buff,SD_BLOCKSIZE);

24 res = disk_write(ATA,(void *)scratch, sector++, 1);

25 if (res != RES_OK) {

26 break;

27 }

28 buff += SD_BLOCKSIZE;

29 }

30 return res;

31 }

32

33 SD_state=SD_WriteMultiBlocks((uint8_t *)buff,sector*SD_BLOCKSIZE,

34 SD_BLOCKSIZE,count);

35 if (SD_state==SD_OK) {

36 /* Check if the Transfer is finished */

37 SD_state=SD_WaitReadOperation();

38

39 /* Wait until end of DMA transfer */

40 while (SD_GetStatus() != SD_TRANSFER_OK);

41 }

42 if (SD_state!=SD_OK)

43 status = RES_PARERR;

44 else

45 status = RES_OK;

46 break;

47

48 case SPI_FLASH:

49 break;

50

51 default:

52 status = RES_PARERR;

53 }

54 return status;

55 }

56 #endif

disk_write函数用于向存储设备指定地址写入指定数量的数据。对于SD卡,执行过程与disk_read函数是非常相似,也必须先检测存储区地址是否是4字节对齐,如果是4字节对齐则直接调用SD_WriteMultiBlocks函数完成多块数据写入操作。如果不是4字节对齐,申请一个4字节对齐的临时缓冲区,先把待写入的数据拷贝到该临时缓冲区内,然后才写入到SD卡。

SD_WriteMultiBlocks函数是向SD卡写入多个块数据,它有四个形参,分别为存储区地址指针、起始块地址、块大小以及块数量,它与SD_ReadMultiBlocks函数执行相互过程。最后也是需要使用相关函数保存数据写入完整才退出disk_write函数。

其他控制函数

代码清单 375 disk_ioctl函数

1 #if _USE_IOCTL

2 DRESULT disk_ioctl (

3 BYTE pdrv, /* 物理编号 */

4 BYTE cmd, /* 控制指令 */

5 void *buff /* 写入或者读取数据地址指针 */

6 )

7 {

8 DRESULT status = RES_PARERR;

9 switch (pdrv) {

10 case ATA: /* SD CARD */

11 switch (cmd) {

12 // Get R/W sector size (WORD)

13 case GET_SECTOR_SIZE :

14 *(WORD * )buff = SD_BLOCKSIZE;

15 break;

16 // Get erase block size in unit of sector (DWORD)

17 case GET_BLOCK_SIZE :

18 *(DWORD * )buff = SDCardInfo.CardBlockSize;

19 break;

20

21 case GET_SECTOR_COUNT:

22 *(DWORD*)buff = SDCardInfo.CardCapacity/SDCardInfo.CardBlockSize;

23 break;

24 case CTRL_SYNC :

25 break;

26 }

27 status = RES_OK;

28 break;

29

30 case SPI_FLASH:

31 break;

32

33 default:

34 status = RES_PARERR;

35 }

36 return status;

37 }

38 #endif

disk_ioctl函数有三个形参,pdrv为设备物理编号,cmd为控制指令,包括发出同步信号、获取扇区数目、获取扇区大小、获取擦除块数量等等指令,buff为指令对应的数据指针。

对于SD卡,为支持格式化功能,需要用到获取扇区数量(GET_SECTOR_COUNT)指令和获取块尺寸(GET_BLOCK_SIZE)。另外,SD卡扇区大小为512字节,串行Flash芯片一般设置扇区大小为4096字节,所以需要用到获取扇区大小(GET_SECTOR_SIZE)指令。

至此,基于SD卡的FatFs文件系统移植就已经完成了,最重要就是diskio.c文件中5个函数的编写。接下来就编写FatFs基本的文件操作检测移植代码是否可以正确执行。

37.3 FatFs功能测试

主要的测试包括格式化测试、文件写入测试和文件读取测试三个部分,主要程序都在main.c文件中实现。

变量定义

代码清单 376 变量定义

1 FATFS fs; /* FatFs文件系统对象 */

2 FIL fnew; /* 文件对象 */

3 FRESULT res_sd; /* 文件操作结果 */

4 UINT fnum; /* 文件成功读写数量 */

5 BYTE ReadBuffer[1024]= {0}; /* 读缓冲区 */

6 BYTE WriteBuffer[] = /* 写缓冲区*/

7 "欢迎使用野火STM32 F429开发板今天是个好日子,新建文件系统测试文件\r\n";

FATFS是在ff.h文件定义的一个结构体类型,针对的对象是物理设备,包含了物理设备的物理编号、扇区大小等等信息,一般我们都需要为每个物理设备定义一个FATFS变量。

FIL也是在ff.h文件定义的一个结构体类型,针对的对象是文件系统内具体的文件,包含了文件很多基本属性,比如文件大小、路径、当前读写地址等等。如果需要在同一时间打开多个文件进行读写,才需要定义多个FIL变量,不然一般定义一个FIL变量即可。

FRESULT是也在ff.h文件定义的一个枚举类型,作为FatFs函数的返回值类型,主要管理FatFs运行中出现的错误。总共有19种错误类型,包括物理设备读写错误、找不到文件、没有挂载工作空间等等错误。这在实际编程中非常重要,当有错误出现是我们要停止文件读写,通过返回值我们可以快速定位到错误发生的可能地点。如果运行没有错误才返回FR_OK。

fnum是个32位无符号整形变量,用来记录实际读取或者写入数据的数组。

buffer和textFileBuffer分别对应读取和写入数据缓存区,都是8位无符号整形数组。

主函数

代码清单 377 main函数

1 int main(void)

2 {

3 /* 禁用WiFi模块 */

4 BL8782_PDN_INIT();

5

6 /* 初始化LED */

7 LED_GPIO_Config();

8 LED_BLUE;

9

10 /* 初始化调试串口,一般为串口1 */

11 Debug_USART_Config();

12 printf("\r\n****** 这是一个SD卡文件系统实验 ******\r\n");

13

14 //在外部SPI Flash挂载文件系统,文件系统挂载时会对SPI设备初始化

15 res_sd = f_mount(&fs,"0:",1);

16

17 /*----------------------- 格式化测试 ---------------------------*/

18 /* 如果没有文件系统就格式化创建创建文件系统 */

19 if (res_sd == FR_NO_FILESYSTEM) {

20 printf("》SD卡还没有文件系统,即将进行格式化...\r\n");

21 /* 格式化 */

22 res_sd=f_mkfs("0:",0,0);

23

24 if (res_sd == FR_OK) {

25 printf("》SD卡已成功格式化文件系统。\r\n");

26 /* 格式化后,先取消挂载 */

27 res_sd = f_mount(NULL,"0:",1);

28 /* 重新挂载 */

29 res_sd = f_mount(&fs,"0:",1);

30 } else {

31 LED_RED;

32 printf("《《格式化失败。》》\r\n");

33 while (1);

34 }

35 } else if (res_sd!=FR_OK) {

36 printf("!!SD卡挂载文件系统失败。(%d)\r\n",res_sd);

37 printf("!!可能原因:SD卡初始化不成功。\r\n");

38 while (1);

39 } else {

40 printf("》文件系统挂载成功,可以进行读写测试\r\n");

41 }

42

43 /*--------------------- 文件系统测试:写测试 -----------------------*/

44 /* 打开文件,如果文件不存在则创建它 */

45 printf("\r\n****** 即将进行文件写入测试... ******\r\n");

46 res_sd=f_open(&fnew,"0:FatFs读写测试文件.txt",FA_CREATE_ALWAYS|FA_WRITE);

47 if ( res_sd == FR_OK ) {

48 printf("》打开/创建FatFs读写测试文件.txt文件成功,向文件写入数据。\r\n");

49 /* 将指定存储区内容写入到文件内 */

50 res_sd=f_write(&fnew,WriteBuffer,sizeof(WriteBuffer),&fnum);

51 if (res_sd==FR_OK) {

52 printf("》文件写入成功,写入字节数据:%d\n",fnum);

53 printf("》向文件写入的数据为:\r\n%s\r\n",WriteBuffer);

54 } else {

55 printf("!!文件写入失败:(%d)\n",res_sd);

56 }

57 /* 不再读写,关闭文件 */

58 f_close(&fnew);

59 } else {

60 LED_RED;

61 printf("!!打开/创建文件失败。\r\n");

62 }

63

64 /*------------------ 文件系统测试:读测试 --------------------------*/

65 printf("****** 即将进行文件读取测试... ******\r\n");

66 res_sd=f_open(&fnew,"0:FatFs读写测试文件.txt",FA_OPEN_EXISTING|FA_READ);

67 if (res_sd == FR_OK) {

68 LED_GREEN;

69 printf("》打开文件成功。\r\n");

70 res_sd = f_read(&fnew, ReadBuffer, sizeof(ReadBuffer), &fnum);

71 if (res_sd==FR_OK) {

72 printf("》文件读取成功,读到字节数据:%d\r\n",fnum);

73 printf("》读取得的文件数据为:\r\n%s \r\n", ReadBuffer);

74 } else {

75 printf("!!文件读取失败:(%d)\n",res_sd);

76 }

77 } else {

78 LED_RED;

79 printf("!!打开文件失败。\r\n");

80 }

81 /* 不再读写,关闭文件 */

82 f_close(&fnew);

83

84 /* 不再使用文件系统,取消挂载文件系统 */

85 f_mount(NULL,"0:",1);

86

87 /* 操作完成,停机 */

88 while (1) {

89 }

90 }

首先,调用BL8782_PDN_INIT函数禁用WiFi模块,接下来初始化RGB彩灯和调试串口,用来指示程序进程。

FatFs的第一步工作就是使用f_mount函数挂载工作区。f_mount函数有三个形参,第一个参数是指向FATFS变量指针,如果赋值为NULL可以取消物理设备挂载。第二个参数为逻辑设备编号,使用设备根路径表示,与物理设备编号挂钩,在代码清单 371中我们定义SD卡物理编号为0,所以这里使用"0:"。第三个参数可选0或1,1表示立即挂载,0表示不立即挂载,延迟挂载。 f_mount函数会返回一个FRESULT类型值,指示运行情况。

如果f_mount函数返回值为FR_NO_FILESYSTEM,说明SD卡没有FAT文件系统。我们就必须对SD卡进行格式化处理。使用f_mkfs函数可以实现格式化操作。f_mkfs函数有三个形参,第一个参数为逻辑设备编号;第二参数可选0或者1,0表示设备为一般硬盘,1表示设备为软盘。第三个参数指定扇区大小,如果为0,表示通过代码清单 375中disk_ioctl函数获取。格式化成功后需要先取消挂载原来设备,再重新挂载设备。

在设备正常挂载后,就可以进行文件读写操作了。使用文件之前,必须使用f_open函数打开文件,不再使用文件必须使用f_close函数关闭文件,这个跟电脑端操作文件步骤类似。f_open函数有三个形参,第一个参数为文件对象指针。第二参数为目标文件,包含绝对路径的文件名称和后缀名。第三个参数为访问文件模式选择,可以是打开已经存在的文件模式、读模式、写模式、新建模式、总是新建模式等的或运行结果。比如对于写测试,使用FA_CREATE_ALWAYS和FA_WRITE组合模式,就是总是新建文件并进行写模式。

f_close函数用于不再对文件进行读写操作关闭文件,f_close函数只要一个形参,为文件对象指针。f_close函数运行可以确保缓冲区完全写入到文件内。

成功打开文件之后就可以使用f_write函数和f_read函数对文件进行写操作和读操作。这两个函数用到的参数是一致的,只不过一个是数据写入,一个是数据读取。f_write函数第一个形参为文件对象指针,使用与f_open函数一致即可。第二个参数为待写入数据的首地址,对于f_read函数就是用来存放读出数据的首地址。第三个参数为写入数据的字节数,对于f_read函数就是欲读取数据的字节数。第四个参数为32位无符号整形指针,这里使用fnum变量地址赋值给它,在运行读写操作函数后,fnum变量指示成功读取或者写入的字节个数。

最后,不再使用文件系统时,使用f_mount函数取消挂载。

下载验证

保证开发板相关硬件连接正确,用USB线连接开发板"USB TO UART"接口跟电脑,在电脑端打开串口调试助手,把编译好的程序下载到开发板。程序开始运行后,RGB彩灯为蓝色,在串口调试助手可看到格式化测试、写文件检测和读文件检测三个过程;最后如果所有读写操作都正常,RGB彩灯会指示为绿色,如果在运行中FatFs出现错误RGB彩灯指示为红色。正确执行例程程序后可以使用读卡器将SD卡在电脑端打开,我们可以在SD卡根目录下看到"FatFs读写测试文件.txt"文件,这与程序设计是相吻合的。

37.4 每课一问

3.    根据"基于串行Flash的FatFs文件系统"章节内容,将FatFs功能使用实验移植到SD卡上运行。

 

STM32开发者必看:手把手教你用FatFS在SD卡上实现文件读写(附完整代码) 本文为STM32开发者提供了在SD卡上实现FatFS文件系统移植与文件读写的完整实战指南。文章详细解析了FatFS的层次架构,手把手指导底层驱动适配、关键配置优化以及文件操作实践,并附有完整代码示例,帮助开发者高效管理嵌入式系统中的数据存储。 阅读详情

相关推荐

STM32F429DISCOVERY外接SD卡使用SDIO4BIT方式加载FATFS系统

STM32F429DISCOVERY外接SD卡使用SDIO4BIT方式加载FATFS系统 平台:STM32CubeF4,版本1.3.0 第三方:FATFS0.10版本 说明:解决了用STM32CubeMX生成的代码无法加载FATFS系统的问题,源代码中有重要参数有详细说明,在测试过程中我遇到的问题以及解决方案都有注释(main文件开头)。如果硬件接线等没有问题,本示例一定能正常测试通过。

STM32的FATFS文件系统移植笔记

STM32的FATFS文件系统移植笔记 一、序言 经常在网上、群里看到很多人问关于STM32的FATFS文件系统移植的问题,刚好自己最近也在调试这个程序,为了让大家少走弯路,我把我的调试过程和方法也贡献给大家。二、FATFS简介 FatFs Module是一种完全免费开源的FAT文件系统模块,专门为小型的嵌入式系统而设计。它完全用标准C语言编写,所以具有良好的硬件平台...

diruan7614的博客 2623

SDIO—FatFs移植与读写测试-野火挑战者F429_V2最新版文件系统-R0.14.rar

FatFs移植与读写测试-野火挑战者F429_V2最新版文件系统-2020-4-24.rar R0.14文件版本说明: R0.14 (October 14, 2019) Added support for 64-bit LBA and GUID partition table (FF_LBA64 = 1) Changed some API functions, f_mkfs() and f_fdisk(). Fixed f_open() function cannot find the file with file name in length of FF_MAX_LFN characters. Fixed f_readdir() function cannot retrieve long file names in length of FF_MAX_LFN - 1 characters. Fixed f_readdir() function returns file names with wrong case conversion. (appeared at R0.12) Fixed f_mkfs() function can fail to create exFAT volume in the second partition. (appeared at R0.12)

【正点原子STM32连载】 第五十章 FATFS实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

FATFS是一个完全免费开源的FAT/exFAT文件系统模块,专门为小型的嵌入式系统而设计。它完全用标准C语言(ANSI C C89)编写,所以具有良好的硬件平台独立性,只需做简单的修改就可以移植到8051、PIC、AVR、ARM、Z80、RX等系列单片机上。它支持FATl2、FATl6和FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对8位单片机和16位单片机做了优化。FATFS的特点有:。Windows/dos系统兼容的FAT/exFAT文件系统。

weixin_55796564的博客 1103

告别仿真失败!用Sigrity 2022 SystemSI搞定DDR4信号质量仿真的保姆级流程

本文详细介绍了如何使用Sigrity 2022 SystemSI工具进行DDR4信号完整性仿真,提供了一套避免仿真失败、提高仿真精度和加速仿真流程的保姆级方法。从模型验证、设计数据预处理到拓扑构建和参数提取,再到高级调试技巧和仿真加速方案,帮助硬件工程师系统性地解决DDR4信号质量仿真中的常见问题。

weixin_42537499的博客 342

Power BI财销一体分析——KPI分析应用实践

第九步:插入三个散点图,行拖入分销商表分销商字段,将度量值中的销量拖入X轴,将利润拖入Y轴,大小拖入度量值总销售额,将分销商表业务类型字段作为筛选条件添加给散点图,分别选择专业自行车店、增值经销商、仓库,使视觉对象固定显示不同业务类型的散点分布。这个公式其实是不需要我们自己写的,依赖于快度量值功能星级评分,基值选择度量值总销售额,星数选择5,最低星值评分选择0,最高星级评分值选择100,点击添加,星级评分度量值就建立好了,接下来我们理解一下公式。好的,今天的讲解就到这里。

BI瓶子的博客 1552

STM32 串行FLASH文件系统FatFs

FatFs文件系统源码:doc文件夹里面是一些使用帮助文档;在src是FatFs文件系统的源代码。integer.h:文件中包含了一些数值类型定义(typedef)。diskio.c:包含底层存储介质的操作函数,这些函数需要用户自己实现,主要添加底层驱动函数。ff.c: FatFs核心文件,文件管理的实现方法。该文件独立于底层介质操作文件的函数,利用这些函数实现文件的读写。

ChenWenHaoHaoHao的博客 3337

拖动无标题栏的cef3窗口

拖动嵌入了cef3的无标题栏win32窗口,本质上就是拖动子窗口移动父窗口这么个事情,这个在自己创建窗口的程序上处理非常简单,cef封装较多,想修改的完善点步骤较多。         cef所用版本3.2623。         就用cefclient来做测试工程,首先建议在cefclient_win.cc的RunMain函数中的app = new ClientAppRenderer();前面

loveyong1990的专栏 6160

USB2.0挂载FatFs文件系统

一、前期准备 1、协议栈 USB协议栈 FatFs文件系统协议栈 2、物理芯片 W25Q64的8M大小的flash芯片 二、描述 文件系统fatfs、USB协议栈、物理层flash存储芯片关系。 1、单独使用flash芯片,开发flash芯片的响应的驱动即可进行按照 绝对地址 的读写方式进行数据的存储和读取。一般的单片机只做存储的可以这么做。 void W25

Ryze的博客 3409

STM32F4驱动ADS1220高精度ADC:从SPI配置到数据校准的完整实战指南

本文详细介绍了如何使用STM32F4微控制器驱动ADS1220高精度ADC,涵盖从SPI接口配置、寄存器设置到数据采集与校准的全过程。通过实战代码示例和硬件设计要点,帮助开发者快速构建高精度数据采集系统,适用于工业测量和精密仪器等应用场景。

weixin_26918763的博客 224

文本纠错项目代码调试

文本纠错项目调试

m0_67084346的博客 868

SD卡文件系统移植

我们使用一个现成的SDIO-读写测试文件(1)拷贝FatFs文件系统源文件到user目录下,并重命名为fatfs(2)创建工作目录FATFS,并添加文件系统底层文件和中间层文件添加头文件路径。

qq_25218501的博客 910

【教程4>第1章>第12节】通过Verilog读取txt格式数据进行测试并将结果导入到matlab

我们在verilog的testbench中,调用txt文件,将上述正弦样本数据作为测试激励输入到verilog模块中。通过这个方法,可以将一些较为复杂的数据导入到verilog中,进行FPGA数据处理模块的开发。即通过w方式打开一个新的txt文件,然后将verilog的输出保存到XY1.txt文件中。这个部分是txt文件的路径,实际使用时,修改为您自己的路径,或者将txt文件放在和我一样的路径中。这个是数据长度,matlab产生的txt多少长度,这个参数就修改为多少长度。这个txt就是保存这段数据的文件。

FPGA/MATLAB学习教程/源码/项目合作开发 1376

修改Fatfs文件系统让它在操作4G以上的SD卡时,不会出错

内容转自:http://www.openedv.com/forum.php?mod=viewthread&tid=36644&extra=page%3D1 以前用FatFS的时候有没有发现在使用大容量卡(4G以上)的时候,卡里存了4G以上的东西,新存的文件就不能被正确读取了呢?! 这是因为大家移植的FatFS都是32位寻址的,只能读到4G以下地址的东西,4G以上的东西虽然文件分配...

奋斗的菜鸟博客 4572

uniapp 如何封装实现任意页面都能使用的全局弹窗

项目内容场景全局监听消息提示难点uniapp 无法全局挂载组件解决方案动态创建 DOM + 动态 Vue 实例优势跨页面 / 不依赖页面组件树 / 灵活调用如果你使用的是小程序平台,DOM 操作可能受限,需要用或方式兼容处理。想支持多个弹窗堆叠?你可以扩展,加个弹窗队列管理器。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 944

i.MX6ULL系统移植 | 使用busybox制作根文件系统(1.29.0)

一. 下载BusyBox BusyBox是一个继承了大量Linux命令核工具的软件,像常用的ls、cp、mv、ifconfig等命令。一般下载BusyBox的源码,然后配置Busybox,选择自己想要的功能,最后编译即可。 BusyBox在官方可以直接下载:https://www.busybox.net/。目前最新是1.35.0,这里我使用1.29.0版本。 axel https://www.busybox.net/downloads/busybox-1.29.0.tar.bz2 下载之后解压: tar

Mculover666的博客(嵌入式) 1145

SD卡实验源码讲解

SD卡实验源码讲解

qq_64531765的博客 1272

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

基于STM32F407平台实现FATFS读写大容量(128G)SD卡的心得

本人是沈阳大学的一名小白,之前,无论是STM32,还是FATFS,都是小白一个,甚至不理解那是什么东西,但是据说这种技术目前为止好像是读写大容量卡挺费劲,只能64G,就到头了,但是最近接到一个任务就是做一个数据记录仪而且要把这个东西做成128G的。废话不多说,直接来把。 首先你要知道FATFS是一个文件管理系统,看他的手册,分为应用层,底层驱动等等,但是对于我们嵌入式开发者来说,移植他,

weixin_39169857的博客 2万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

HAL库 CubeMX STM32基于FatFs文件系统在SDIO模式下读写SD卡

1、前言 上一篇文章我讲述了在SDIO模式下读取SD卡,在文章最后说了需要注意的地方,同时也是裸机下利用SDIO模式的不足,今天给大家讲一讲在FatFs文件系统下读取SD卡的该如何做,以及相比于裸机下SDIO模式的优势。 2、FatFs系统简介 FatFs文件系统是用于嵌入式的文件系统, ...

Deheng_Kong的博客 4078

SD卡应用总结(Fatfs)

转载自:SD卡应用总结(FatFs)   对于SD卡的应用,想必大家都尝试多。不过,很多网友恐怕只停留在实验的基础上吧。对于SD卡在文件系统下或者不带文件系统下,对SD卡的操作都是很简单的。是的,只是简单的文件读写确实不难。但是,如果每秒钟不停的写数据,而且是不停的工作,恐怕SD卡的应用就没有这么简单了吧,有时总会出现一些莫名其妙的问题。  不知道大家是否遇到过这些问题?本人开发了几个关于...

weixin_30436101的博客 424

详解SD协议与FatFs文件系统中的Block、Sector的差异,与FatFs中底层驱动disk_ioctl的编写及思路

目录:1. SD2.0协议中的sector与blockSD协议中AU size2. FatFs中的sector与block3. FatFs中底层驱动disk_ioctl的编写及思路 1. SD2.0协议中的sector与block 点我下载SD2.0协议 或 git clone https://github.com/TTowFive/SD2.0-protocol-pdf 在SD协议中,我们可以看到这样的原话: 大意是讲,在高容量卡(SDHC)中,卡的block size是512字节(bytes),这里指

TTOWFIVE 8423

SD卡与fatfs文件系统(1)

SD的优势之一是它的便携性,它可以自由插拔,可以在嵌入式设备和PC机之间交换数据。如果使用FAT(File Allocation Table)文件系统,它便可以方便在安装windows的PC和嵌入式设备之间交换数据。一个完整的FAT文件系统代码量非常庞大,不适合资源较少的嵌入式系统,于是就需要一个微型的FAT文件系统,FatFs就是基于这样的目的而开发的。     FatFS是一个专为小型嵌入式

xgbing 1万+

FATFS 0.13 f_mount(&fs,““,1)挂载失败的原因

这两天学着用了一下FATS文件系统,虽然工作中没用到,但是对个人的经验积累还是有用的。看了一下,代码并不多,但是精简啊,指针跳来跳去的一不小心就晕了。 所以也遇到了不少问题啊。 这里就讲一下我遇到的第一步就懵逼的问题。 那就是 FRESULT f_mount ( FATFS* fs, /* Pointer to the filesystem object (NULL:unmount)*/ const TCHAR* ...

ba_wang_mao的专栏 1万+
上一篇: 第36章 SDIO—SD卡读写测试—零死角玩转STM32-F429系列
下一篇: 第38章 I2S—音频播放与录音输入—零死角玩转STM32-F429系列
0木木0
博客等级 码龄17年 458粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值