gpt4 book ai didi

c - 使用 FATfs 的 STMF4 和 USB OTG

转载 作者:行者123 更新时间:2023-11-30 18:11:06 31 4
gpt4 key购买 nike

我正在使用 STM32F407 Discovery Board 来连接 USB OTG FS。我使用 CubeMx 和 Keil 进行开发。

首先,我已启用 PC0 - USB_Power(用于 Discovery Board),并且状态为 RESET 以确保 USB 正常运行。
我已启用 PA9 - VBUS 作为 GPIO 输入。
我的系统正在运行频率为 168MHz。
已使用 MAX_SS(最大扇区大小)- 4096(Cube Mx 中提供此选项)。
启用 USB 作为主机并使用 CubeMX 提供的 FATFS。
启用 MSC(Mass)存储类)。

代码:

#include "main.h"
#include "stm32f4xx_hal.h"
#include "fatfs.h"
#include "usb_host.h"

#define GREEN_High HAL_GPIO_WritePin(GREEN_GPIO_Port,GREEN_Pin,GPIO_PIN_SET)
#define GREEN_Low HAL_GPIO_WritePin(GREEN_GPIO_Port,GREEN_Pin,GPIO_PIN_RESET)

#define ORANGE_High HAL_GPIO_WritePin(ORANGE_GPIO_Port,ORANGE_Pin,GPIO_PIN_SET)
#define ORANGE_Low HAL_GPIO_WritePin(ORANGE_GPIO_Port,ORANGE_Pin,GPIO_PIN_RESET)

extern USBH_HandleTypeDef hUsbHostFS;
extern ApplicationTypeDef Appli_state;
FATFS USBDISKFatFs;
FIL MyFile;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
void MX_USB_HOST_Process(void);

void Green_Blink(uint16_t ms);
void Orange_Blink(uint16_t ms);
void USB_Write_Demo(char* fileName);

int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USB_HOST_Init();
MX_FATFS_Init();
Green_Blink(100);
Orange_Blink(100);
while (1)
{
MX_USB_HOST_Process();
if (Appli_state == APPLICATION_START)
{
USB_Write_Demo("myCSV.csv");

}
*THIS IS THE AREA OF PROBLEM*
// else if (Appli_state == APPLICATION_IDLE)
// {
// GREEN_High;
// ORANGE_High;
// HAL_Delay(100);
// GREEN_Low;
// ORANGE_Low;
// HAL_Delay(100);
// }
}
}

void USB_Write_Demo(char *fileName)
{
FRESULT fres;
uint32_t bytesWritten;
uint8_t w_text[] = {"Hello, I, AM, STM32, Discovery\r\n"};
if (f_mount(&USBDISKFatFs,(TCHAR const*)USBHPath,0) != FR_OK)
{
Orange_Blink(1000);
Error_Handler();
}
else
{
Green_Blink(100);
if (open_append(&MyFile,fileName) != FR_OK)
{
Orange_Blink(100);
Error_Handler();
}
else
{
Green_Blink(100);
fres = f_write(&MyFile,w_text,sizeof(w_text),(void*)bytesWritten);
if (bytesWritten == 0 || fres != FR_OK)
{
Orange_Blink(100);
Error_Handler();
}
else
{
f_close(&MyFile);
Green_Blink(100);
}
}
}
}

void Green_Blink(uint16_t ms)
{
GREEN_High;
HAL_Delay(ms);
GREEN_Low;
HAL_Delay(ms);
}

void Orange_Blink(uint16_t ms)
{
ORANGE_High;
HAL_Delay(ms);
ORANGE_Low;
HAL_Delay(ms);
}

所以这里发生的是我正在创建一个 CSV 文件,并且在每个循环中我都会在其中附加新数据。我确实成功地做到了这一点。我使用此特定代码创建了一个非常长(500KB 不是那么长)的 csv 文件。

但是我在这里发现了一个我无法理解的异常。

当我将这部分添加到代码中时,没有创建文件,并且控件的每次迭代都会到达此函数。

    else if (Appli_state == APPLICATION_IDLE)
{
GREEN_High;
ORANGE_High;
HAL_Delay(100);
GREEN_Low;
ORANGE_Low;
HAL_Delay(100);
}

我无法理解这个函数如何影响工作代码。我确信 APPLICATION_STARTAPPLICATION_IDLE 是两个不同的东西。当我评论这部分代码时,一切都很好,只要我的存储空间没有结束,我就可以创建文件。

我花了几个小时(比如 2 天)才弄清楚这就是问题所在。
我尝试增加最小堆大小 - 0x2000 和最小堆栈大小 - 0x4000(此选项在cubeMx中的链接器设置上可用。在生成文件时,您仅在其中指定项目名称、位置和所有内容)

任何建议都会有帮助,因为我没有想法。

最佳答案

我找到了一种无需使用 RTOS 即可解决此问题的方法。由于我以前从未尝试过 RTOS,因此很难在几天内完成该项目。

这个想法很简单。我们需要等到 MX_USB_HOST_Process() 不会将 Appli_state 返回为 Idle。

这不是我的功劳。

您可以查看这个LINK

所以我在usb_host.c中添加了一个新函数,它重新调整Appli_state

uint8_t IsUSB_Busy(void)
{
return Appli_state;
}

main.c 中,我一直等到它返回除 0 之外的任何内容。如 APPLICATION_IDLE=0

typedef enum {
APPLICATION_IDLE = 0,
APPLICATION_START,
APPLICATION_READY,
APPLICATION_DISCONNECT
}ApplicationTypeDef;

在主文件中添加了这段代码,一切都按预期工作

while (!IsUSB_Busy())
{
MX_USB_HOST_Process();
}

我希望有人觉得它有帮助。

感谢您的帮助。

关于c - 使用 FATfs 的 STMF4 和 USB OTG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51948099/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com