我正在使用STM32F407 Discovery Board
进行接口USB OTG FS
。我正在使用CubeMx and Keil
进行开发。
首先,我启用了PC0 - USB_Power(用于探索板(,并且状态为重置以正常运行USB运行。
我已经启用了PA9 - VBUS作为GPIO输入。
我的系统以 168MHz 运行。
已使用 MAX_SS(最大扇区大小( - 4096(此选项在多维数据集 Mx 中可用(。
启用USB作为主机,并使用CubeMX提供的FATFS。
封装 MSC(大容量存储类(。
法典:
#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, Discoveryrn"};
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_START
和APPLICATION_IDLE
是两回事。当我注释这部分代码时,一切都很好,只要我的存储没有结束,我就可以制作文件。
我花了几个小时(比如 2 天(才弄清楚这就是问题所在。
我尝试增加最小堆大小 - 0x2000 和最小堆栈大小 - 0x4000(此选项在 cubeMx 中的链接器设置中可用。生成文件时,您提供项目名称,位置和所有
位置的地方(任何建议都会有所帮助,因为我没有想法。
我找到了一种不使用RTOS来处理这个问题的方法。由于我以前从未尝试过RTOS,因此很难在几天内完成该项目。
这个想法很简单。我们需要等到MX_USB_HOST_Process()
不返回Appli_state
为空闲。
我不相信功劳。
你可以检查这个链接
所以我在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();
}
我希望有人觉得它有帮助。
并感谢您的帮助。
您可以使用CubeMX创建两个任务(FreeRTOS(,将USB内容与LED内容分开。 taskLED(( 和 taskUSB((