首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用FATfs的STMF4和using

使用FATfs的STMF4和using
EN

Stack Overflow用户
提问于 2018-08-21 19:53:47
回答 2查看 1.8K关注 0票数 0

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

首先,我已经启用了PC0 -USB_Power(用于Discovery Board),并且状态被重置为正常运行。

我已经启用了PA9 - VBUS作为GPIO输入。

我的系统运行速度是168 My。

我使用了MAX_SS(最大扇区大小)-4096(此选项在多维数据集Mx中可用)。

已启用U盘作为主机并已使用CubeMX提供的FATFS。

Enbaled MSC(大容量存储类)

代码:

代码语言:javascript
复制
#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文件。

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

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

代码语言:javascript
复制
    else if (Appli_state == APPLICATION_IDLE)
    {
        GREEN_High;
        ORANGE_High;
        HAL_Delay(100);
        GREEN_Low;
        ORANGE_Low;
        HAL_Delay(100);
    }

我不能理解这个函数是如何影响工作代码的。我确信APPLICATION_STARTAPPLICATION_IDLE是两个不同的东西。当我注释这部分代码时,只要我的存储没有结束,一切都很好,我可以制作文件。

我花了几个小时(大概两天)才弄明白这就是问题所在。

我尝试增加最小堆大小- 0x2000和最小堆栈大小- 0x4000 (此选项在cubeMx中的链接器设置中可用。在生成文件时,您只需在其中提供项目名称、位置和所有内容)

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

EN

回答 2

Stack Overflow用户

发布于 2018-08-24 06:13:35

我找到了一种不使用RTOS来解决这个问题的方法。因为我以前从来没有尝试过RTOS,所以很难在几天内完成这个项目。

想法很简单。我们需要等待,直到MX_USB_HOST_Process()不将Appli_state作为空闲返回。

这不是我的功劳。

您可以查看此LINK

因此,我在usb_host.c中添加了一个返回Appli_state的新函数

代码语言:javascript
复制
uint8_t IsUSB_Busy(void)
{
    return Appli_state;
}

main.c中,我一直等到它返回0以外的任何值。作为APPLICATION_IDLE=0

代码语言:javascript
复制
typedef enum {
  APPLICATION_IDLE = 0,
  APPLICATION_START,
  APPLICATION_READY,
  APPLICATION_DISCONNECT
}ApplicationTypeDef;

在主文件中添加了这段代码,一切工作正常

代码语言:javascript
复制
while (!IsUSB_Busy())
{
    MX_USB_HOST_Process();
}

我希望有人发现它是有帮助的。

谢谢你的帮助。

票数 0
EN

Stack Overflow用户

发布于 2018-08-21 20:10:39

你可以用CubeMX创建两个任务(FreeRTOS),把USB的东西和发光二极管的东西分开。taskLED()和taskUSB()

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51948099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档