From 8eb61ef4ca584ae27278bc3bbae7f69d371114d8 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Thu, 14 Nov 2024 10:06:29 +0800 Subject: [PATCH] init --- .vscode/c_cpp_properties.json | 4 + .vscode/settings.json | 5 +- USB_HOST/App/usb_host.c | 9 ++ USB_HOST/Target/usbh_platform.c | 2 +- hand_acid_mainboard.ioc | 6 +- usrc/fileoperation/file_operate.c | 288 ++++++++++++++++++++++++++++++++++++++ usrc/fileoperation/file_operate.h | 27 ++++ usrc/service/app_core.cpp | 91 ++---------- 8 files changed, 348 insertions(+), 84 deletions(-) create mode 100644 usrc/fileoperation/file_operate.c create mode 100644 usrc/fileoperation/file_operate.h diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 25a42ae..87ff7e7 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -12,6 +12,10 @@ "./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F", "./Middlewares/ST/STM32_USB_Host_Library/Core/Inc/", "USB_HOST/Target/", + "USB_HOST/App/", + "FATFS/App/", + "FATFS/Target/", + "Middlewares/Third_Party/FatFs/src/", "Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc/", "./Drivers/CMSIS/Device/ST/STM32F4xx/Include", "./Drivers/CMSIS/Include", diff --git a/.vscode/settings.json b/.vscode/settings.json index 1c6c9fd..c8a3378 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -94,7 +94,10 @@ "usb_otg.h": "c", "stm32f4xx_hal_hcd.h": "c", "usb_host.h": "c", - "usbh_core.h": "c" + "usbh_core.h": "c", + "usbh_platform.h": "c", + "file_operate.h": "c", + "fatfs.h": "c" }, "files.autoGuessEncoding": false, "files.encoding": "gb2312" diff --git a/USB_HOST/App/usb_host.c b/USB_HOST/App/usb_host.c index dcbd273..f65ccb3 100644 --- a/USB_HOST/App/usb_host.c +++ b/USB_HOST/App/usb_host.c @@ -24,6 +24,8 @@ #include "usbh_core.h" #include "usbh_msc.h" +#include "fileoperation/file_operate.h" + /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ @@ -98,17 +100,24 @@ static void USBH_UserProcess (USBH_HandleTypeDef *phost, uint8_t id) switch(id) { case HOST_USER_SELECT_CONFIGURATION: + printf("+++++++++++++++++++++++++++++++++HOST_USER_SELECT_CONFIGURATION+++++++++++++++++++++++++++++\n"); break; case HOST_USER_DISCONNECTION: + printf("+++++++++++++++++++++++++++++++++HOST_USER_DISCONNECTION+++++++++++++++++++++++++++++\n"); Appli_state = APPLICATION_DISCONNECT; break; case HOST_USER_CLASS_ACTIVE: + printf("+++++++++++++++++++++++++++++++++HOST_USER_CLASS_ACTIVE+++++++++++++++++++++++++++++\n"); Appli_state = APPLICATION_READY; + Mount_FatFs(); + FatFs_GetDiskInfo(); + FatFs_WriteTXTFile("test.txt",2016,11,15); break; case HOST_USER_CONNECTION: + printf("+++++++++++++++++++++++++++++++++HOST_USER_CONNECTION+++++++++++++++++++++++++++++\n"); Appli_state = APPLICATION_START; break; diff --git a/USB_HOST/Target/usbh_platform.c b/USB_HOST/Target/usbh_platform.c index 24e5bc8..4112878 100644 --- a/USB_HOST/Target/usbh_platform.c +++ b/USB_HOST/Target/usbh_platform.c @@ -47,6 +47,6 @@ void MX_DriverVbusFS(uint8_t state) data = GPIO_PIN_SET; } /* USER CODE END PREPARE_GPIO_DATA_VBUS_FS */ - HAL_GPIO_WritePin(GPIOA,GPIO_PIN_15,(GPIO_PinState)data); + // HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,(GPIO_PinState)data); } diff --git a/hand_acid_mainboard.ioc b/hand_acid_mainboard.ioc index ea9142f..5575b46 100644 --- a/hand_acid_mainboard.ioc +++ b/hand_acid_mainboard.ioc @@ -211,7 +211,7 @@ ProjectManager.ToolChainLocation= ProjectManager.UAScriptAfterPath= ProjectManager.UAScriptBeforePath= ProjectManager.UnderRoot=true -ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_TIM3_Init-TIM3-false-HAL-true,5-MX_CRC_Init-CRC-false-HAL-true,6-MX_RNG_Init-RNG-false-HAL-true,7-MX_TIM7_Init-TIM7-false-HAL-true,8-MX_TIM6_Init-TIM6-false-HAL-true,9-MX_TIM1_Init-TIM1-false-HAL-true,10-MX_USART3_UART_Init-USART3-false-HAL-true,11-MX_SPI1_Init-SPI1-false-HAL-true,12-MX_USART2_UART_Init-USART2-false-HAL-true,13-MX_IWDG_Init-IWDG-false-HAL-true,14-MX_RTC_Init-RTC-false-HAL-true,15-MX_USB_OTG_FS_HCD_Init-USB_OTG_FS-false-HAL-true +ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_TIM3_Init-TIM3-false-HAL-true,5-MX_CRC_Init-CRC-false-HAL-true,6-MX_RNG_Init-RNG-false-HAL-true,7-MX_TIM7_Init-TIM7-false-HAL-true,8-MX_TIM6_Init-TIM6-false-HAL-true,9-MX_TIM1_Init-TIM1-false-HAL-true,10-MX_USART3_UART_Init-USART3-false-HAL-true,11-MX_SPI1_Init-SPI1-false-HAL-true,12-MX_USART2_UART_Init-USART2-false-HAL-true,13-MX_IWDG_Init-IWDG-false-HAL-true,14-MX_RTC_Init-RTC-false-HAL-true,15-MX_FATFS_Init-FATFS-false-HAL-false,16-MX_USB_HOST_Init-USB_HOST-false-HAL-false RCC.48MHZClocksFreq_Value=48000000 RCC.AHBFreq_Value=144000000 RCC.APB1CLKDivider=RCC_HCLK_DIV4 @@ -289,12 +289,12 @@ USB_HOST0.BSP.STBoard=false USB_HOST0.BSP.api=Unknown USB_HOST0.BSP.component= USB_HOST0.BSP.condition=SW_VBUS_DRIVE_MSC_FS \= false -USB_HOST0.BSP.instance=PA15 +USB_HOST0.BSP.instance=PD3 USB_HOST0.BSP.ip=GPIO USB_HOST0.BSP.mode=Output USB_HOST0.BSP.name=Drive_VBUS_FS USB_HOST0.BSP.semaphore= -USB_HOST0.BSP.solution=PA15 +USB_HOST0.BSP.solution=PD3 USB_OTG_FS.IPParameters=VirtualMode,phy_itface USB_OTG_FS.VirtualMode=Host_Only USB_OTG_FS.phy_itface=HCD_PHY_EMBEDDED diff --git a/usrc/fileoperation/file_operate.c b/usrc/fileoperation/file_operate.c new file mode 100644 index 0000000..8e42779 --- /dev/null +++ b/usrc/fileoperation/file_operate.c @@ -0,0 +1,288 @@ +#include "file_operate.h" + +//定义用于格式化的工作区缓存 +BYTE workBuffer[4*User_Sector]; + +/*挂载FatFs文件系统*/ +void Mount_FatFs(void) +{ + //挂载文件系统 + FRESULT retUSER = f_mount(&User_FatFs, User_SDPath, 1); + //发生错误 + if(retUSER != FR_OK) + { + //没有文件系统,需要格式化 + if(retUSER == FR_NO_FILESYSTEM) + { + printf("\r\n没有文件系统,开始格式化\r\n"); + //创建文件系统 + retUSER = f_mkfs(User_SDPath, FM_FAT32, 0, workBuffer, 4*User_Sector); + //格式化失败 + if(retUSER != FR_OK) + { + printf("格式化失败,错误代码 = %d\r\n", retUSER); + } + //格式化成功 + else + { + printf("格式化成功,开始重新挂载\r\n"); + //有文件系统后重新挂载 + retUSER = f_mount(&User_FatFs, User_SDPath, 1); + //挂载失败 + if(retUSER != FR_OK) + { + printf("发生错误,错误代码 = %d\r\n", retUSER); + } + //挂载成功 + else + { + printf("*** 文件系统挂载成功 ***\r\n"); + } + } + } + //不是没有文件系统,而是发生其他错误 + else + { + printf("发生其他错误,错误代码 = %d\r\n", retUSER); + } + } + //有文件系统直接挂在成功 + else + { + printf("文件系统挂载成功\r\n"); + } +} + +/*获取磁盘信息并在LCD上显示*/ +void FatFs_GetDiskInfo(void) +{ + FATFS *fs; + //定义剩余簇个数变量 + DWORD fre_clust; + //获取剩余簇个数 + FRESULT res = f_getfree("0:", &fre_clust, &fs); + //获取失败 + if(res != FR_OK) + { + printf("f_getfree() error\r\n"); + return; + } + printf("\r\n*** FAT disk info ***\r\n"); + + //总的扇区个数 + DWORD tot_sect = (fs->n_fatent - 2) * fs->csize; + + //剩余的扇区个数 = 剩余簇个数 * 每个簇的扇区个数 + DWORD fre_sect = fre_clust * fs->csize; + + //对于SD卡和U盘, _MIN_SS=512字节 +#if _MAX_SS == _MIN_SS + //SD卡的_MIN_SS固定为512,右移11位相当于除以2048 + //剩余空间大小,单位:MB,用于SD卡,U盘 + DWORD freespace= (fre_sect>>11); + //总空间大小,单位:MB,用于SD卡,U盘 + DWORD totalSpace= (tot_sect>>11); +#else + //Flash存储器,小容量 + //剩余空间大小,单位:KB + DWORD freespace= (fre_sect*fs->ssize)>>10; + //总空间大小,单位:KB + DWORD totalSpace= (tot_sect*fs->ssize)>>10; +#endif + + //FAT类型 + printf("FAT type = %d\r\n",fs->fs_type); + printf("[1=FAT12,2=FAT16,3=FAT32,4=exFAT]\r\n"); + + //扇区大小,单位字节 + printf("Sector size(bytes) = "); + //SD卡固定512字节 +#if _MAX_SS == _MIN_SS + printf("%d\r\n", _MIN_SS); +#else + //FLASH存储器 + printf("%d\r\n", fs->ssize); +#endif + + printf("Cluster size(sectors) = %d\r\n", fs->csize); + printf("Total cluster count = %ld\r\n", fs->n_fatent-2); + printf("Total sector count = %ld\r\n", tot_sect); + + //总空间 +#if _MAX_SS == _MIN_SS + printf("Total space(MB) = %ld\r\n", totalSpace); +#else + printf("Total space(KB) = %ld\r\n", totalSpace); +#endif + + //空闲簇数量 + printf("Free cluster count = %ld\r\n",fre_clust); + //空闲扇区数量 + printf("Free sector count = %ld\r\n", fre_sect); + + //空闲空间 +#if _MAX_SS == _MIN_SS + printf("Free space(MB) = %ld\r\n", freespace); +#else + printf("Free space(KB) = %ld\r\n", freespace); +#endif + + printf("Get FAT disk info OK\r\n"); +} + +/*创建文本文件*/ +void FatFs_WriteTXTFile(TCHAR *filename,uint16_t year, uint8_t month, uint8_t day) +{ + FIL file; + printf("\r\n*** Creating TXT file: %s ***\r\n", filename); + + FRESULT res = f_open(&file, filename, FA_CREATE_ALWAYS | FA_WRITE); + //打开/创建文件成功 + if(res == FR_OK) + { + //字符串必须有换行符"\n" + TCHAR str[]="Line1: Hello, FatFs***\n"; + //不会写入结束符"\0" + f_puts(str, &file); + + printf("Write file OK: %s\r\n", filename); + } + else + { + printf("Open file error,error code: %d\r\n", res); + } + //使用完毕关闭文件 + f_close(&file); +} + +/*读取一个文本文件的内容*/ +void FatFs_ReadTXTFile(TCHAR *filename) +{ + printf("\r\n*** Reading TXT file: %s ***\r\n", filename); + + FIL file; + //以只读方式打开文件 + FRESULT res = f_open(&file, filename, FA_READ); + //打开成功 + if(res == FR_OK) + { + //读取缓存 + TCHAR str[100]; + //没有读到文件内容末尾 + while(!f_eof(&file)) + { + //读取1个字符串,自动加上结束符”\0” + f_gets(str,100, &file); + printf("%s", str); + } + printf("\r\n"); + } + //如果没有该文件 + else if(res == FR_NO_FILE) + printf("File does not exist\r\n"); + //打开失败 + else + printf("f_open() error,error code: %d\r\n", res); + //关闭文件 + f_close(&file); +} + +/*扫描和显示指定目录下的文件和目录*/ +void FatFs_ScanDir(const TCHAR* PathName) +{ + DIR dir; //目录对象 + FILINFO fno; //文件信息 + //打开目录 + FRESULT res = f_opendir(&dir, PathName); + //打开失败 + if(res != FR_OK) + { + //关闭目录,直接退出函数 + f_closedir(&dir); + printf("\r\nf_opendir() error,error code: %d\r\n", res); + return; + } + + printf("\r\n*** All entries in dir: %s ***\r\n", PathName); + //顺序读取目录中的文件 + while(1) + { + //读取目录下的一个项 + res = f_readdir(&dir, &fno); + //文件名为空表示没有多的项可读了 + if(res != FR_OK || fno.fname[0] == 0) + break; + //如果是一个目录 + if(fno.fattrib & AM_DIR) + { + printf("DIR: %s\r\n", fno.fname); + } + //如果是一个文件 + else + { + printf("FILE: %s\r\n",fno.fname); + } + } + //扫描完毕,关闭目录 + printf("Scan dir OK\r\n"); + f_closedir(&dir); +} + +/*获取一个文件的文件信息*/ +void FatFs_GetFileInfo(TCHAR *filename) +{ + printf("\r\n*** File info of: %s ***\r\n", filename); + + FILINFO fno; + //检查文件或子目录是否存在 + FRESULT fr = f_stat(filename, &fno); + //如果存在从fno中读取文件信息 + if(fr == FR_OK) + { + printf("File size(bytes) = %ld\r\n", fno.fsize); + printf("File attribute = 0x%x\r\n", fno.fattrib); + printf("File Name = %s\r\n", fno.fname); + //输出创建/修改文件时的时间戳 + FatFs_PrintfFileDate(fno.fdate, fno.ftime); + } + //如果没有该文件 + else if (fr == FR_NO_FILE) + printf("File does not exist\r\n"); + //发生其他错误 + else + printf("f_stat() error,error code: %d\r\n", fr); +} + +/*删除文件*/ +void FatFs_DeleteFile(TCHAR *filename) +{ + printf("\r\n*** Delete File: %s ***\r\n", filename); + FIL file; + //打开文件 + FRESULT res = f_open(&file, filename, FA_OPEN_EXISTING); + if(res == FR_OK) + { + //关闭文件 + f_close(&file); + printf("open successfully!\r\n"); + } + //删除文件 + res = f_unlink(filename); + //删除成功 + if(res == FR_OK) + { + printf("The file was deleted successfully!\r\n"); + } + //删除失败 + else + { + printf("File deletion failed, error code:%d\r\n", res); + } +} + +/*打印输出文件日期*/ +void FatFs_PrintfFileDate(WORD date, WORD time) +{ + printf("File data = %d/%d/%d\r\n", ((date>>9)&0x7F)+1980, (date>>5)&0xF, date&0x1F); + printf("File time = %d:%d:%d\r\n", (time>>11)&0x1F, (time>>5)&0x3F, time&0x1F); +} \ No newline at end of file diff --git a/usrc/fileoperation/file_operate.h b/usrc/fileoperation/file_operate.h new file mode 100644 index 0000000..56549d8 --- /dev/null +++ b/usrc/fileoperation/file_operate.h @@ -0,0 +1,27 @@ +#ifndef FILE_OPERATE_H +#define FILE_OPERATE_H + +#include "main.h" +#include "FatFs.h" +#include "stdio.h" + +/*定义自己的存储设备*/ +/*用户存储设备扇区字节数*/ +#define User_Sector 512 +/*用户存储设备FatFs对象*/ +#define User_FatFs USBHFatFS +/*用户存储设备卷路径*/ +#define User_SDPath USBHPath +/*用户存储设备初始化类型*/ +#define User_FatType FM_FAT32 +/*函数声明*/ +void Mount_FatFs(void); +void FatFs_GetDiskInfo(void); +void FatFs_ScanDir(const TCHAR* PathName); +void FatFs_ReadTXTFile(TCHAR *filename); +void FatFs_WriteTXTFile(TCHAR *filename,uint16_t year, uint8_t month, uint8_t day); +void FatFs_GetFileInfo(TCHAR *filename); +void FatFs_DeleteFile(TCHAR *filename); +void FatFs_PrintfFileDate(WORD date, WORD time); + +#endif \ No newline at end of file diff --git a/usrc/service/app_core.cpp b/usrc/service/app_core.cpp index bbbf707..a373b4b 100644 --- a/usrc/service/app_core.cpp +++ b/usrc/service/app_core.cpp @@ -30,6 +30,8 @@ using namespace iflytop; // #define TEST_BLE_IF // #define TEST_EEPROM // #define TEST_TJC_SCREEN +// #define TEST_RTC +// #define TEST_USB static const char* zhex2str(uint8_t* data, size_t len) { static char buf[256]; @@ -43,7 +45,9 @@ static const char* zhex2str(uint8_t* data, size_t len) { extern "C" { void umain() { AppCore::ins()->initialize(); } } - +extern "C" { +extern void MX_USB_HOST_Init(void); +} void AppCore::test() { osDelay(1000); /*********************************************************************************************************************** @@ -176,6 +180,7 @@ void AppCore::test() { #endif +#ifdef TEST_RTC AppHal::rtc_init(); RTC_DateTypeDef GetData; // 获取日期结构体 RTC_TimeTypeDef GetTime; // 获取时间结构体 @@ -195,89 +200,17 @@ void AppCore::test() { osDelay(1000); } +#endif - extern void MX_USB_HOST_Init(void); +#ifdef TEST_USB + + ZGPIO USB_PWR; + USB_PWR.initAsOutput(PA15, kxs_gpio_nopull, false, true); MX_USB_HOST_Init(); while (true) { osDelay(1000); } - - // // 配置初始化 - // ConfigService::ins()->initialize(); - - // if (!AppHardware::ins()->isHardInitOk()) { - // FrontEndControler::ins()->initialize(); // 前端控制器,对屏幕的消息进行解析,发送消息给屏幕 - // FrontEndControler::ins()->startSchedule(); - // FrontEndControler::ins()->alertNoConfirm("设备异常:\r\n 存储异常,请尝试重新上电"); - // while (true) { - // osDelay(1); - // } - // } - - // // hardInit - // AppHardware::ins()->initialize(); // 基础硬件初始化 - // RemoteControlerUpper::ins()->initialize(); // 遥控器初始化 - // FrontEndControler::ins()->initialize(); // 前端控制器,对屏幕的消息进行解析,发送消息给屏幕 - // ValveStateSyncService::ins()->initialize(ZCAN1::ins()); - - // // BaseServiceInit - // PUMPCS->initialize(); - // RemoteControlerStateSyncService::ins()->initialize(); - - // // Page - // Page_login::ins()->initialize(); // - // Page_main::ins()->initialize(); // - // Page_keybAcidCh::ins()->initialize(); - // Page_muAcidType::ins()->initialize(); - // Page_menu::ins()->initialize(); - // Page_muInterval::ins()->initialize(); - // Page_changePasswd::ins()->initialize(); - // Page_muSettings::ins()->initialize(); - // Page_muUsrMgr::ins()->initialize(); - // Page_muDeviceInfo::ins()->initialize(); - // // Page_muAudit::ins()->initialize(); - // Page_muPumpTest::ins()->initialize(); - // // EventProcesser - // Page_muPumpSett::ins()->initialize(); - // Page_muBleHandSett::ins()->initialize(); - // Page_muMotorSett::ins()->initialize(); - - // RemoteControlerEventProcesser::ins()->initialize(); - // /*********************************************************************************************************************** - // * REG_EVENT_HANDLER * - // ***********************************************************************************************************************/ - - // // - - // /*********************************************************************************************************************** - // * START * - // ***********************************************************************************************************************/ - // FrontEndControler::ins()->startSchedule(); - // RCTRL->startSchedule(); - // RemoteControlerStateSyncService::ins()->startSync(); - // ValveStateSyncService::ins()->startSync(); - - // // dim - // UIS->chpage(pg_login); - - // osDelay(100); - // CfgItermCache bleNameCache; - // const char* bleName = CS->getStr(kcfg_bleClientName, &bleNameCache); - // if (strlen(bleName) != 0) { - // ZLOGI(TAG, "start scan :%s", bleName); - // for (size_t i = 0;; i++) { - // if (i != 0) ZLOGI(TAG, "re start scan %s %d", bleName, i); - // bool suc = RCTRL->startScan(bleName, true); - // if (suc) break; - // } - // } else { - // ZLOGI(TAG, "start scan %s", "XXXXXXXXX"); - // for (size_t i = 0;; i++) { - // if (i != 0) ZLOGI(TAG, "re start scan %s %d", "XXXXXXXX", i); - // bool suc = RCTRL->startScan("XXXXXXXXX", false); // 输入一个错误的设备名,当作不扫描 - // if (suc) break; - // } - // } +#endif } static ZThread ledthread;