ST意法半导体
直播中

陈秀英

7年用户 1147经验值
私信 关注
[问答]

NVIC中断是否会导致FatFS库出现问题呢?

你好!
我将 FatFS R0.11 与 STM32F373 一起使用,有时可以使用 FATFS,有时则不能。
这些是我遇到的问题,我不知道为什么。
NVIC 中断是否会导致 FatFS 库出现问题?
挂载SD卡:
安装 SD 卡 -> 卸载 SD 卡 -> 拔出 SD 卡 -> 插入 SD 卡 -> 安装 SD 卡。这将为我创建一个错误。我无法卸载 SD 卡并拔下它,然后重新插入并安装它。然后我得到一个 FR_DISK_ERR。
请注意,如果我重新刷新 STM32 处理器或进入调试模式,那么我不会收到 FR_DISK_ERR。但是如果我取出卡,重新插入,重新启动 STM32 处理器,那么我仍然得到 FR_DISK_ERR。
写垃圾值:
例如,如果我写一个文本字符串
  • STM32_PLC_SD_Write_File("Hour,Minute,Second,Millisecond,");
  • STM32_PLC_SD_Write_File("ADC0,ADC1,ADC2,ADC3,ADC4,ADC5,ADC6,ADC7,ADC8,ADC9,ADC10,ADC11,");
  •         STM32_PLC_SD_Write_File("DADC0,DADC1,DADC2,DADC3,DADC4,");
  •         STM32_PLC_SD_Write_File("I0,I1,I2,I3,I4,I5,I6,I7,");
  •         STM32_PLC_SD_Write_File("E0,E1,");
  •         STM32_PLC_SD_Write_File("IC0,IC1,IC2,");
  •         STM32_PLC_SD_Write_File("DAC0,DAC1,DAC2,");
  •         STM32_PLC_SD_Write_File("PMW0,PWM1,PWM2,PWM3,PWM4,PWM5,PWM6,PWM7
    ");
  • /* Return -1 with End of File (EOF) */
  • static FIL *fil;
  • int STM32_PLC_SD_Write_File(char text[]) {
  •         return f_puts(text, fil);
  • }
然后我得到了这个
  • $� ADC ��� DADC4 I0 I1 I2 I3 I4 I5 I6 I7 E0 E1 IC0 IC1 IC2 DAC0 DAC1 DAC2 PMW0 PWM1 PWM2 PWM3 PWM4 PWM5 PWM6 PWM7
硬故障:
有时,当我尝试写这篇文章时,我会遇到严重的错误。从一开始,它工作正常。然后几秒钟后,我遇到了严重的错误。文本数组的长度为 200 个字节。
此代码每毫秒循环一次。
  • sprintf(text, "%i,%i,%i,%i,",
  •                                         hours,
  •                                         minutes,
  •                                         seconds,
  •                                         milliseconds);
  •                         STM32_PLC_SD_Write_File(text);
  •                         sprintf(text, "%0.2f,%0.2f,%0.2f,%0.2f,%0.2f,%0.2f,%0.2f,%0.2f,%0.2f,%0.2f,%0.2f,%0.2f,",
  •                                         STM32_PLC_Analog_Input_ADC_Get(0),
  •                                         STM32_PLC_Analog_Input_ADC_Get(1),
  •                                         STM32_PLC_Analog_Input_ADC_Get(2),
  •                                         STM32_PLC_Analog_Input_ADC_Get(3),
  •                                         STM32_PLC_Analog_Input_ADC_Get(4),
  •                                         STM32_PLC_Analog_Input_ADC_Get(5),
  •                                         STM32_PLC_Analog_Input_ADC_Get(6),
  •                                         STM32_PLC_Analog_Input_ADC_Get(7),
  •                                         STM32_PLC_Analog_Input_ADC_Get(8),
  •                                         STM32_PLC_Analog_Input_ADC_Get(9),
  •                                         STM32_PLC_Analog_Input_ADC_Get(10),
  •                                         STM32_PLC_Analog_Input_ADC_Get(11));
  •                         STM32_PLC_SD_Write_File(text);
  •                         sprintf(text, "%0.2f,%0.2f,%0.2f,%0.2f,%0.2f,",
  •                                         STM32_PLC_Analog_Input_DADC_Get(0),
  •                                         STM32_PLC_Analog_Input_DADC_Get(1),
  •                                         STM32_PLC_Analog_Input_DADC_Get(2),
  •                                         STM32_PLC_Analog_Input_DADC_Get(3),
  •                                         STM32_PLC_Analog_Input_DADC_Get(4));
  •                         STM32_PLC_SD_Write_File(text);
  •                         sprintf(text, "%i,%i,%i,%i,%i,%i,%i,%i,",
  •                                         STM32_PLC_Digital_Input_Get(0),
  •                                         STM32_PLC_Digital_Input_Get(1),
  •                                         STM32_PLC_Digital_Input_Get(2),
  •                                         STM32_PLC_Digital_Input_Get(3),
  •                                         STM32_PLC_Digital_Input_Get(4),
  •                                         STM32_PLC_Digital_Input_Get(5),
  •                                         STM32_PLC_Digital_Input_Get(6),
  •                                         STM32_PLC_Digital_Input_Get(7));
  •                         STM32_PLC_SD_Write_File(text);
  •                         sprintf(text, "%i,%i",
  •                                         STM32_PLC_Encoder_Get(0),
  •                                         STM32_PLC_Encoder_Get(1));
  •                         STM32_PLC_SD_Write_File(text);
  •                         sprintf(text, "%0.2f,%0.2f,%0.2f,",
  •                                         STM32_PLC_Input_Capture_Get(0),
  •                                         STM32_PLC_Input_Capture_Get(1),
  •                                         STM32_PLC_Input_Capture_Get(2));
  •                         STM32_PLC_SD_Write_File(text);
  •                         sprintf(text, "%i,%i,%i,",
  •                                         STM32_PLC_Analog_Output_Get(0),
  •                                         STM32_PLC_Analog_Output_Get(1),
  •                                         STM32_PLC_Analog_Output_Get(2));
  •                         STM32_PLC_SD_Write_File(text);
  •                         sprintf(text, "%i,%i,%i,%i,%i,%i,%i,%i
    ",
  •                                         STM32_PLC_PWM_Get(0),
  •                                         STM32_PLC_PWM_Get(1),
  •                                         STM32_PLC_PWM_Get(2),
  •                                         STM32_PLC_PWM_Get(3),
  •                                         STM32_PLC_PWM_Get(4),
  •                                         STM32_PLC_PWM_Get(5),
  •                                         STM32_PLC_PWM_Get(6),
  •                                         STM32_PLC_PWM_Get(7));
  •                         STM32_PLC_SD_Write_File(text);
这是我执行“成功”日志记录过程时的结果。

我的 SPI 设置:
我正在使用 SPI 写入和读取 SD 卡。

这是我的 FATFS 配置
/* 用户代码开始头 *//** ****************************************** **** - Pastebin.com
编辑:
使用这个库后
kiwih/cubeide-sd-card:CubeIDE/CubeMX 兼容的 MMC/SD 存储卡 FatFs 驱动程序 (github.com)
现在情况开始好转。
我写作时不会犯严重错误。所以这是个好消息。
但我现在收到两个错误代码。这两个。
        FR_DISK_ERR, /* (1) 底层磁盘I/O层发生硬错误 */
        FR_NOT_READY, /* (3) 物理驱动器不能工作 */
当我拔下 SD 卡并重新插入以进行挂载时,我会得到 FR_DISK_ERR。
如果我关闭 STM32 处理器的电源然后再次关闭电源,我会得到 FR_NOT_READY。
要“解决”FR_NOT_READY,我需要再次刷新 STM32 处理器。但是在我为我的STM32处理器重新插上电源(USB电压)后,问题就出现了。

回帖(1)

胡楚翘

2022-12-28 14:55:14
我现在解决了。
第 1 步:使用与 GitHub 链接提供的代码完全相同的代码。
第 2 步:使用我的代码。


  • /*
  • * SD_Card.c
  • *
  • *  Created on: Jun 15, 2021
  • *      Author: Daniel Mårtensson
  • */
  • #include "Functions.h"
  • #include "user_diskio_spi.h"
  • #include "fatfs.h"

  • /* These are extern inside fatfs.h */
  • FATFS USERFatFS;
  • FIL USERFile;

  • void STM32_PLC_Start_SD(SPI_HandleTypeDef *hspi, GPIO_TypeDef *SD_CS_PORT, uint16_t SD_CS_PIN) {
  •         SD_init(hspi, SD_CS_PORT, SD_CS_PIN);
  • }

  • FRESULT STM32_PLC_SD_Mont_Card() {
  •         FRESULT status;
  •         uint8_t attempt = 0;
  •         while(attempt < 255) {
  •                 MX_FATFS_Init();
  •                 status = f_mount(&USERFatFS, "", 1);
  •                 if(status == FR_OK){
  •                         break;
  •                 } else {
  •                         STM32_PLC_SD_Unmount_Card();
  •                         attempt++;
  •                 }
  •         }
  •         return status;
  • }

  • FRESULT STM32_PLC_SD_Unmount_Card() {
  •         FRESULT status = f_mount(NULL, "", 0);
  •         MX_FATFS_DeInit();
  •         return status;
  • }

  • FRESULT STM32_PLC_SD_Open_Existing_File_With_Read_Write(char filename[]) {
  •         return f_open(&USERFile, filename, FA_READ | FA_WRITE); /* Posix "r+" */
  • }

  • FRESULT STM32_PLC_SD_Create_New_File_With_Read_Write(char filename[], char initial_string[], bool overwrite) {
  •         FRESULT status;
  •         if(overwrite){
  •                 /* Will always create a new file, so status will always be FR_OK */
  •                 status = f_open(&USERFile, filename, FA_CREATE_ALWAYS | FA_READ | FA_WRITE); /* Posix "w+" */
  •         }else {
  •                 /* If filename exist, then status will be FR_EXIST, else FR_OK if not exist */
  •                 status = f_open(&USERFile, filename, FA_CREATE_NEW | FA_READ | FA_WRITE); /* Posix "w+x" */
  •         }
  •         /* If status is FR_OK, then write the initial string */
  •         if(status == FR_OK) {
  •                 STM32_PLC_SD_Write_File(initial_string);
  •                 STM32_PLC_SD_Close_File();
  •         }
  •         return status;
  • }

  • FRESULT STM32_PLC_SD_Close_File() {
  •         return f_close(&USERFile);
  • }

  • FRESULT STM32_PLC_SD_Check_Space(uint32_t *total_space, uint32_t *free_space) {
  •         FATFS *pfs;
  •         DWORD fre_clust;
  •         FRESULT status = f_getfree("", &fre_clust, &pfs);
  •         *total_space = (uint32_t) ((pfs->n_fatent - 2) * pfs->csize * 0.5);
  •         *free_space = (uint32_t) (fre_clust * pfs->csize * 0.5);
  •         return status;
  • }

  • /* Return text "error" or "eof" if it's end of file (eof) */
  • char* STM32_PLC_SD_Read_File(char text[], int len) {
  •         return f_gets(text, len, &USERFile);
  • }

  • /* Return -1 with End of File (EOF) */
  • int STM32_PLC_SD_Write_File(char text[]) {
  •         return f_puts(text, &USERFile);
  • }

也将其添加到 user_diskio_spi.c 文件中


  • static SPI_HandleTypeDef*   SD_SPI_HANDLE;
  • static GPIO_TypeDef*                SD_SPI_CS_Port;
  • static uint16_t                         SD_SPI_CS_Pin;

  • void SD_init(SPI_HandleTypeDef *hspi, GPIO_TypeDef *SD_CS_PORT, uint16_t SD_CS_PIN) {
  •         SD_SPI_HANDLE = hspi;
  •         SD_SPI_CS_Port = SD_CS_PORT;
  •         SD_SPI_CS_Pin = SD_CS_PIN;
  • }

完毕!
非常坚固。关键的想法是安装 SD 卡直到它被安装。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分