STM32F407 Discovery Board
インターフェースに使用していますUSB OTG FS
。CubeMx and Keil
開発に使用しています。
まず最初に、PC0 - USB_Power (Discovery Board 用) を有効にしました。USB が適切に動作するように、状態は RESET です。
PA9 - VBUS を GPIO 入力として有効にしました。
私のシステムは 168MHz で動作しています。
MAX_SS(Max Sector size) - 4096 を使用しました (このオプションは Cube Mx で使用できます)。
ホストとして USB を有効にし、CubeMX が提供する FATFS を使用しました。
MSC(Mass Storage Class)を有効化。
コード:
#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_START
とAPPLICATION_IDLE
は 2 つの異なるものだと確信しています。コードのこの部分にコメントすると、ストレージが終わらない限り、すべて問題なくファイルを作成できます。
これが問題であることを理解するのに数時間(2日程度)かかりました。
最小ヒープ サイズ - 0x2000 および最小スタック サイズ - 0x4000 を増やしてみました (このオプションは、cubeMx のリンカー設定で使用できます。ファイルの生成中に、プロジェクト名、場所、およびすべてを指定する場所のみ)
私はアイデアがないので、どんな提案も役に立ちます。