备案网站建设方案书,wordpress主题fzzz,中信建设有限责任公司阿尔及利亚,做网站需要用什么开发软件最近在使用FreeRTOS操作U盘数据读取#xff0c;与裸机开发区别不大#xff0c;只要注意默认分配的栈大小就行
FATFS简介
FATFS 是一个完全免费开源的 FAT 文件系统模块#xff0c;专门为小型的嵌入式系统而设计。它完全用标准 C 语言编写#xff0c;所以具有良好的硬件平…最近在使用FreeRTOS操作U盘数据读取与裸机开发区别不大只要注意默认分配的栈大小就行
FATFS简介
FATFS 是一个完全免费开源的 FAT 文件系统模块专门为小型的嵌入式系统而设计。它完全用标准 C 语言编写所以具有良好的硬件平台独立性可以移植到 8051、 PIC、 AVR、 SH、Z80、 H8、 ARM 等系列单片机上而只需做简单的修改。它支持 FATl2、 FATl6 和 FAT32支持多个存储媒介有独立的缓冲区可以对多个文件进行读写并特别对 8 位单片机和 16 位单片机做了优化还支持RTOS。
使用者无需理会 FATFS 的内部结构和复杂的 FAT 协议只需要调用FATFS 模块提供给用户的一系列应用接口函数如 f_open f_read f_write 和 f_close 等就可以像在 PC 上读写文件那样简单。
FATFS 模块提供的是 ff.c 和 ff.h。除非有必要使用者一般不用修改使用时将头文件直接包含进去即可。
ff.h里面有各种函数
硬件配置
采用的是STM32F767IGT6型号PCB绘制了一个USB-A口用来插连U盘
HAL库配置
除了基础的配置外需要对USB_OTG_FS进行配置配置为Host_Only模式 配置FATS文件操作参数 配置U盘
在FreeRTOS操作系统下要注意分配的堆栈大小否则插入U盘时堆栈溢出会使得程序会卡死usbh_conf.h中的USBH_PROCESS_STACK_SIZE大小至少要为128 *11 bytes才能正常运行建议设置为128 *16 bytes。 这与裸机开发不一样裸机开发不需要分配堆栈
程序操作
所有功能测试程序
uint8_t retUSBH; /* Return value for USBH */
char USBHPath[4]; /* USBH logical drive path */
FATFS USBHFatFS; /* File system object for USBH logical drive */
FIL USBHFile; /* File object for USBH */uint8_t w_buf[5]{b,a,c,n,n};
uint8_t w_buf1[5]{ ,e,g,n,m};
uint8_t r_buf[5]{0};UINT br,bw;
void test_usb(void)
{printf(---------\r\n);retUSBH f_mount(USBHFatFS,(TCHAR const*)USBHPath,1); //挂载if(retUSBH FR_OK)printf(UP U is ok\r\n);retUSBH f_open(USBHFile,(const char*)测试.txt,FA_WRITE|FA_CREATE_ALWAYS);//创建打开if(retUSBHFR_OK){HAL_UART_Transmit(huart1,(uint8_t*)打开文件\测试.txt\成功!\r\n,25,100);}retUSBH f_lseek(USBHFile,f_size(USBHFile));if(retUSBHFR_OK){HAL_UART_Transmit(huart1,(uint8_t*)指针移动到文件末尾成功\r\n,25,100);}retUSBH f_write(USBHFile,w_buf,18,bw);if(retUSBHFR_OK){HAL_UART_Transmit(huart1,(uint8_t*)写入文件成功!\r\n,15,100);}retUSBH f_close(USBHFile);if(retUSBHFR_OK){HAL_UART_Transmit(huart1,(uint8_t*)关闭文件成功!\r\n\r\n,17,100);}//读取文件测试HAL_UART_Transmit(huart1,(uint8_t*)读取文件测试!\r\n,15,100);retUSBH f_open(USBHFile,(const char*)测试.txt,FA_OPEN_EXISTING|FA_READ);//打开文件if(retUSBHFR_OK){HAL_UART_Transmit(huart1,(uint8_t*)打开文件\测试.txt\成功!\r\n,25,100);}retUSBH f_read(USBHFile,r_buf,18,bw);if(retUSBHFR_OK){HAL_UART_Transmit(huart1,(uint8_t*)读取文件成功!文件内容,23,100);HAL_UART_Transmit(huart1,r_buf,bw,100);}retUSBH f_close(USBHFile);if(retUSBHFR_OK){HAL_UART_Transmit(huart1,(uint8_t*)关闭文件成功!\r\n,15,100);}
}有个小问题就是中文命名文件名会乱码显示用英文和数字就没有这个问题。 根目录下就会有生成的文件这里只有15个字符多次写入是因为程序只让写15个
Upan 状态检测实际程序
void USB_Disk_Process(void)
{USBH_Process(hUsbHostFS); //USB Core的后台进程函数,检测USB热插拔的状态本来裸机开发下应该自动生成的Up_SaveDate_Screen_Process();
}ApplicationTypeDef Appli_state_tempAPPLICATION_DISCONNECT;
void Up_SaveDate_Screen_Process(void)
{if(Appli_state_temp!Appli_state){Appli_state_tempAppli_state;if(Appli_state APPLICATION_READY) //U盘插入{............}if(Appli_state APPLICATION_DISCONNECT) //U盘拔出{.....................}}
}U盘文件夹创建程序 //USBHPath为例如 0:/xxx 这样格式字符串
retUSBH f_mount(USBHFatFS,(TCHAR const*)USBHPath,1); //挂载
retUSBH f_mkdir(GPR_Path_char);//创建文件夹
if(retUSBH FR_OK) //创建成功....
else....U盘文件创建及写入程序
//GPR_Path_char 字符串格式例如 0:/文件名xxx/xxx.txt
retUSBH f_open(USBHFile,(const char*)GPR_Path_char,FA_WRITE|FA_OPEN_APPEND); //打开文件赋予写权限并且把指针移动到文件的末尾
retUSBH f_write(USBHFile,SPI_AD_DATA.RX_DATA_BUF,sizeof(SPI_AD_DATA.RX_DATA_BUF),bw); //写入SPI数据
if(retUSBH FR_OK)....
else.......
f_close(USBHFile);这里直接写入SPI数组里面的数据电脑打开格式不对要用特定的软件打开