0

我只是一个卑微的实习生,被扔进了固件开发的无情之火中。我的任务是通过 SPI 使用 w25qxx 在 STM32 芯片上实现文件系统。我已经能够通过 SPI 成功读取和写入 w25q,并创建了一个类来处理芯片的基本 i/o。

我决定使用 FatFS,因为它部分内置于 STM32CubeID 中,而且它似乎最适合我们的需求。我见过很多人通过 SD 卡实现 FatFS,但是 SD 卡会比我们需要的更复杂。在我看到的所有教程中,您需要编辑user_diskio.c的方法以与您使用的存储保持一致。但是,当我这样做时,我发现我的代码实际上从未使用user_diskio.c,也没有使用diskio.c。我在其中设置了一行代码来设置一个 LED 来判断程序是否真的到达了代码中的这些点,但似乎没有。

来自我的user_diskio.cpp的方法

DRESULT USER_read (
    BYTE pdrv,      /* Physical drive nmuber to identify the drive */
    BYTE *buff,     /* Data buffer to store read data */
    DWORD sector,   /* Sector address in LBA */
    UINT count      /* Number of sectors to read */
)
{
  /* USER CODE BEGIN READ */
    HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_SET); // 
    w25->sectorRead(sector, (char*)buff, count);
    return RES_OK;
  /* USER CODE END READ */
}

在我的main.cpp中,我试图创建一个文件,向其中写入一个字符串,关闭它,然后再次打开它以读取字符串。

  f_getfree("", &fre_clust, &pfs);

  total = (uint32_t)((pfs->n_fatent - 2) * pfs->csize * 0.5);
  free_space = (uint32_t)(fre_clust * pfs->csize * 0.5);

  fresult = f_open(&fil, "file67.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE);
  f_puts("This data is from the FILE1.txt. And it was written using ...f_puts... ", &fil);
  fresult = f_close(&fil);

  fresult = f_open(&fil, "file67.txt", FA_READ);
  f_gets(buffer, f_size(&fil), &fil);
  f_close(&fil);

fresultFR_NOT_ENABLED当我打开文件时返回,FR_INVALID_OBJECT当我关闭时返回。尝试将文件读入缓冲区会导致缓冲区中的第一个字节被读取为空字符。我应该添加任何其他信息吗?

4

1 回答 1

0

FR_NOT_ENABLE可能是由于在执行其他任何操作之前没有先 f_mount 磁盘造成的。

于 2022-02-03T16:16:24.753 回答