- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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_START
和 APPLICATION_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/
我想从设备读取/写入 OTG USB 存储。为此,我编写了下面的代码,但它只显示了 SD 卡。 HashSet out = new HashSet(); String reg = "(?i).*vol
我有一台运行 Linux 3.0.35 内核的 Variscite VAR-SOM-MX6,带有两个 USB 端口。第一个端口是连接到外部迷你 OTG 插孔的 OTG 端口。第二个是连接到集线器芯片的
我想在 Android 11 上读取 OTG USB我可以在 Android 9 上列出这样的文件: val path = File("/storage") 我可以在 Android 11 中列出外部
我正在寻找支持 USB OTG 的 Symbian/Android/Windows Phone。我有一个简单的设备,可以通过 USB 发送非常基本的 ascii 数据,我需要在手机应用程序中读取数据。
这是我的 Activity 代码。 public class MainActivity extends AppCompatActivity { ListView lv; @Override prote
当我使用串口运行谷歌珊瑚时,我可以运行演示应用程序,但是当我尝试运行时 谷歌珊瑚使用数据端口(c 型电缆)我无法连接到开发板 rahul@ubuntu:~$ mdt shell 正在等待设备... 1
我有一个像鼠标一样的 USB OTG 设备,在中国购买,关于所用 Controller 的信息不多。当我将它连接到我的 android 时,有一个鼠标光标,并且该设备有 5 个硬按钮(左、右、上、下、
我想构建一个 android 应用程序,其中我想检测到设备的 otg 电缆连接。例如。我想在这样的检测中显示 toast ,这可能吗?我的意思是有同样的 Intent 吗?任何帮助将不胜感激谢谢你 最
我正在开发一个使用了 OTG 笔式驱动器的应用程序,因此从 OTG 笔式驱动器读取数据这样的概念,但所有用户都可能不是同一个设备。 我已经在 5-6 台设备上进行了测试,这些设备给我提供了不同的 US
我正在开发一个 android 项目,我在该项目中使用手机为外部设备供电。通过 USB-OTG 连接,我可以为外部设备供电。 我想知道我是否可以在 android studio 上编写一个程序,我可以
我有一个连接到 Android 设备的外部大容量存储设备。我需要将根目录中的几个 .BIN 文件读入我的应用程序。我能够连接到设备并使用 UsbDeviceConnection 接收 usb 权限。
在我的应用程序中,我需要检测空的 otg 插入。系统通过此检测到空的 USB 连接器并显示如下图所示的通知 Notification Image 我需要接收它的 Intent 。我尝试了以下代码
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我想为以太网卡分配一个静态 IP,通过 OTG 电缆连接到 Android 设备。它应该以编程方式完成,但我在 android 中找不到有关以太网卡的任何引用。 有什么想法吗? 谢谢 最佳答案 如果是
我知道如何做以下事情: 监听usb设备的attach和detach事件 获取所有连接的设备 获取设备权限 所以最后我有一个 UsbDevice 并且我有读/写它的权限。如何从这里继续? 我可以打开设备
设备支持 USB OTG。以下是场景: 当设备连接到 PC 时,该设备充当从设备。 (设备如何知道它必须充当奴隶?) 当设备连接到打印机时,该设备充当主机。(设备如何知道它必须充当主机?) 当设备连接
设备支持 USB OTG。以下是场景: 当设备连接到 PC 时,该设备充当从设备。 (设备如何知道它必须充当奴隶?) 当设备连接到打印机时,该设备充当主机。(设备如何知道它必须充当主机?) 当设备连接
我正在开发一项正在进行的服务,该服务监听与 radio 的 USB 接口(interface)连接。当找到这样的连接时,此服务会更新其通知以反射(reflect)所述连接;当连接丢失时(例如通过拔出事
在过去的一个月里,我使用以下简单配置将我的 LG G3 同时连接到网络摄像头和电源。 Picture of Phone charging and OTG connection to webcam wi
我有两部通过 OTG 数据线连接的安卓手机。显然,电缆迫使一部电话进入主机模式,另一部成为外围设备。我希望能够动态切换设备的主机/外围设备状态,而无需切换电缆,OTG HNP 规范似乎表明这是可能的。
我是一名优秀的程序员,十分优秀!