Uso de FatFS en el flash interno del microcontrolador STM32f303

2

Quiero usar la biblioteca FatFS usando la memoria flash interna STM32F303. Creé el archivo user_diskio.c y describí las funciones necesarias USER_write , USER_read y USER_ioctl para leer y escribir datos en / desde flash interno

  if (FATFS_LinkDriver(&USER_Driver, USER_Path) == 0)
  { 
    result = f_mount(&FATFS_Obj,(TCHAR const*)USER_Path, 1);
    ...
  }

f_mount obtiene el error FR_NO_FILESYSTEM. El uso de la función f_mkfs((TCHAR const*)USER_Path, 0, 512); obtiene FR_NOT_ENABLED de error. No entiendo, ¿cómo debo formatear el sector del disco para usar la biblioteca FatFS?

    
pregunta Igor1488

2 respuestas

1
  

Quiero usar la biblioteca FatFS usando la memoria flash interna STM32F303.

Eso no va a funcionar muy bien. Te recomendaría que lo reconsideres.

FatFS espera trabajar con un dispositivo de bloque donde es posible escribir cualquier sector de 512 bytes del disco en cualquier momento. No es así como funciona la memoria flash en los dispositivos STM32: en la serie STM32F3, la memoria flash se organiza como un conjunto de sectores de 2 KB (no los sectores de 512 bytes asumidos por FAT), cada uno de los cuales solo se puede escribir como parte de un ciclo de programa / borrado.

Escribir en un solo subsector de 512 bytes del sector flash de 2 KB requerirá una operación lenta y costosa en la que borre todo el sector flash y luego vuelva a escribirlo con un sector modificado. Esto desgastará la memoria flash muy rápidamente, lo que provocará un fallo prematuro del dispositivo.

Habiendo dicho todo, según el código FatFS que miré, FR_NOT_ENABLED no parece ser un valor de retorno válido de f_mkfs() . O has leído mal el código de error, o te encuentras con un error en la versión de FatFS que estás usando.

    
respondido por el duskwuff
0

Debes formatear tu flash como FAT32 o exFAT. Ya que su flash es interno de la MCU, tendrá que recibir esa llamada f_mkfs correctamente (de lo contrario, podría haberlo formateado externamente).

En este momento parece que el recuento de argumentos es incorrecto (consulte este ejemplo ) y FR_NOT_ENABLED no es un código de retorno válido para esta función de todos modos, por lo que probablemente ni siquiera lo llames en tu código.

    
respondido por el Dmitry Grigoryev

Lea otras preguntas en las etiquetas