This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C123FH6PM:TIRTOS - FatFs Raw、创建新文件会中止程序

Guru**** 2813875 points

Other Parts Discussed in Thread: SYSBIOS, TM4C123FH6PM, TM4C123GH6PM, EK-TM4C123GXL

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/995987/tm4c123fh6pm-tirtos---fatfs-raw-creating-a-new-file-aborts-program

器件型号:TM4C123FH6PM
主题中讨论的其他器件:SYSBIOSTM4C123GH6PMEK-TM4C123GXLDK-TM4C129X

大家好、  

我正在尝试端口 FatSDRaw 示例以使用 USB 大容量存储设备。  

没有直接使用 fatfs 的 USB 示例、因此我首先将 USB 示例从129移植到123。

我可以读取 USB 记忆棒并打开文件、并使用 fatfs 调用读取其内容。

这让我相信我所面临的问题与 USB 无关。  

但是、当我尝试创建一个新文件时、我会得到一个系统中止。  

为了测试我是否做了错误、我用了一个针对129的 FatSDRaw 示例并将 SPI 部件更改为 USBMscFat、我可以创建新文件而不会出现任何问题。

我也在我的 cfg 文件中启用了 FatFS。  

我使用调试器将中止跟踪到以下函数调用。  

ff.c -> f_open ->第2509行"dw = get_FATTIME ();"  

get_FATTIME();是调用 get_fattime()的定义;

diskio.c get_fattime 调用 ti_mw_fatfs_getFatTime();

在由 XDC 工具创建的 pem4f.c 文件中实现。  

该函数的内容如下:

Int32 ti_mw_fatfs_getFatTime(Void)
{
    time_t seconds;
    UInt32 fatTime;
    struct tm *pTime;

    seconds = time(NULL);

    pTime = localtime(&seconds);

    /*
     *  localtime() sets pTime->tm_year to number of years
     *  since 1900, so subtract 80 from tm_year to get FAT time
     *  offset from 1980.
     */
    fatTime = ((UInt32)(pTime->tm_year - 80) << 25) |
        ((UInt32)(pTime->tm_mon) << 21) |
        ((UInt32)(pTime->tm_mday) << 16) |
        ((UInt32)(pTime->tm_hour) << 11) |
        ((UInt32)(pTime->tm_min) << 5) |
        ((UInt32)(pTime->tm_sec) >> 1);

    return ((Int32)fatTime);
}

在 seconds = time (NULL);行上调用 time 函数。  

time_t ATTRIBUTE time(time_t *tout)
{
    UInt32 t;

    /* Seconds_get() returns number of seconds since Jan 1, 1970 00:00:00 GMT. */
    t = ti_sysbios_hal_Seconds_get();

#if defined(__ti__)
    /*
     *  TI time() function returns seconds since 1900, so add the number
     *  of seconds from 1900 to 1970 (2208988800).
     */
    t += 2208988800;
#endif

    if (tout) {
        *tout = t;
    }

    return (t);
}

第  t 行= ti_sysbios_hal_dseconds_get ();  

seconds_get();seconds.c 文件中的函数被调用。

UInt32 Seconds_get(Void)
{
    UInt32            curSeconds;
    UInt32 seconds = 0;

    curSeconds = HWREG(HIB_RTCC);

    seconds = curSeconds - Seconds_module->refSeconds +
        Seconds_module->setSeconds;

    return (seconds);
}

这是我获取中止的位置。  

它访问休眠 RTC 寄存器、因此我的直觉是 RTC 未启用、并会发生硬故障。

是否有人曾遇到过类似的问题、他们可以帮助我?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果您在 TM4C123FH6PM 器件上运行、则会出现此问题。 该型号没有休眠模块。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bob、您好、感谢您的回复。

    tm4c123gh下午6点是否有休眠模块?  

    由于 ff 代码调用生成的 RTOS 库而调用 RTOS 第二个库、因此没有硬件检查并不奇怪?   

    有一个 sdcard fatfs 原始示例必须调用相同的东西、但我无法真正对其进行测试、因为我没有 SD 卡分线板。  

    如果我从.cfg 文件 fatfs 菜单中提供我自己的函数、并在不生成文件时返回0。 我想它可能会认为时间是零的。 我将尝试返回非零值。  

    编辑:尝试返回1而不是0。 文件已正确创建。  

    您能否查看 fatsd 原始示例以查看对 seconds 函数的调用是否返回正确的值?  

    谢谢、

    金枪鱼

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、TM4C123GH6PM 具有休眠模块。 遗憾的是、我没有在 EK-TM4C123GXL LaunchPad 上运行该示例的正确硬件。 我能够在 DK-TM4C129X 开发板上运行示例。 HIB_RTCC 寄存器为零并保持为零。 当我将 SD 卡放回 PC 时、它没有显示两个新文件的文件创建日期。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bob、您好、感谢您的回复。

    浏览数据表后、似乎唯一的区别是两个芯片之间的休眠模块。 很不幸,但这是嵌入式的,所以我不会惊讶于选择给我带来问题的处理器:D  

    提供虚拟函数可解决此问题。 至少这个问题很容易调试。  

    再次感谢您的所有帮助、

    金枪鱼