# STM32F103_ch376_uart **Repository Path**: lvyuanqing88/stm32f103_ch376_uart ## Basic Information - **Project Name**: STM32F103_ch376_uart - **Description**: stm32f103移植ch376 读写U盘 - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 8 - **Created**: 2024-04-02 - **Last Updated**: 2024-04-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # CH376s U盘 读写程序 **@think3r** ---- ## **V5.0 2017-04-21 11:47:40** ### ----------------校验状态:`已校验` 1. **修订 `README_Frame.pdf`** 。编写了移植文档 **`移植.pdf`** 2. 通过标志位 `Udsk.alreadyinit` 优化 LCD 显示。每次 U盘 插入,只显示一次相关信息。 3. 通过在 定时器5 的中断处理函数中调用 `Ch376_UdiskMount()` 函数 与 `Ch376_QuireUdiskInfo()` 函数,加快 U盘 信息显示时间。 4. 精简 `host()` 函数, 只保留文件操作相关函数。 5. 修改 `mFlushBufferToDisk()` 函数, 并在 `HAL.H` 中增添 开启 `mFlushBufferToDisk()` 函数 debug 的宏定义开关 `__mFlushBufferToDisk_DEBUG_`。 可关闭可提高 数据写入速度。 6. 在函数 **`Ch376_WriteData()`** 中增添移植帮助。 7. 打包整理 移植所需 头文件 8. **添加函数 `static UINT8 SetFileCreateTime()` 用以修改文件的创建时间、修改时间** 8. **测试函数运行的典型时间** - `host()` 数据写入函数 - 无数据写入时 ```` Function Run Time:6.7ms ```` - 写入数据 (开启了 `printf` debug) ```` Current file size is 1279 Function Run Time:562.8ms ```` - `Ch376_SetFileName()` (开启了 `printf` debug) ``` Ch376_SetFileName()设置短文件名为: /03301002.CSV 设置长文件名为: KS-3 2017-03-30 10-02.CSV Function Run Time:7.2ms ``` - `Ch376_set_usb_mode()` (开启了 `printf` debug) ```` Ch376_set_usb_mode()函数 设置为U盘主机模式 06 成功!接收数据为:0X51 Udisk.hostmode == 1 mInitCH376Host() 函数初始化 CH376 成功。 Function Run Time:22.8ms ```` - `Ch376_UdiskMount()` (开启了 `printf` debug) ```` Ch376_UdiskMount()Ready ? CH376DiskMount() 函数检测到 磁盘就绪。返回值为:0X14 Udisk.mount == 1 Function Run Time:228.5ms ```` - `Check_UdiskConnect()` (开启了 `printf` debug) ```` Check_UdiskConnect()CH376DiskConnect() 函数 检测到 U盘插入。 Udisk.disk == 1 Function Run Time:6.3ms ```` - `SafeRemoveDisk()` (开启了 `printf` debug) ``` SafeRemoveDisk()可以安全移除 U盘。 Function Run Time:180.9ms ``` - `Ch376_QuireUdiskInfo()` (开启了 `printf` debug) ```` Ch376_QuireUdiskInfo()磁盘信息---UdiskInfo: KingstonDataTraveler 3.0PMAP Udisk.freespace == 1 DiskQuery: 正在查询磁盘剩余空间。free cap = 12183 MB Udisk.nowriteprotect == 1 Function Run Time:95.4ms ```` ---- ## **V4.0 2017-04-20 21:54:23** ### -----------------校验状态:`已校验` 1. **使用 `115200` 波特率,提高了文件读写速度。** 注意 ch376 模块引脚电平的配合(需要 `D5` 引脚接地)。 2. 整理优化 头文件包含关系、宏定义包含关系。 - `HAL.H` 头文件中 可设置与 `CH376S` 通讯的波特率 - `HAL.H` 头文件中 可设置 `printf` 函数 **debug 功能的开启** - `HAL.H` 头文件中 可设置向 `CH376S` 写入数据的数据缓冲区的大小 3. 增添并封装了以下函数: - `UINT8 Ch376_WriteData(void)` - `UINT8 Ch376_CloseFile(void)` - `void Ch376_DisplayMusk(void)` 4. 完善 **`HOST.C`** 文件中函数的封装。使用 `static` 关键字,修饰只在文件内部使用的函数,提高代码内聚性。 - `static void mFlushBufferToDisk( UINT8 force )` - `static UINT8 Check_Ch376sUart2Connect(void)` - `static UINT8 Quire_UdiskInform(void)` - `static UINT16 Quire_UdiskFreeVolume(void)` - `static UINT8 IsDiskWriteProtect( void )` - **`Ch376_QuireUdiskInfo()`** 5. 代码中添加 ****LCD** 代码添加 提示** , 通过 `Udisk.alreadyinit` 标志位,避免了每次大循环中显示一次 U盘信息。 方便代码移植。 6. 增加 **`Udisk`** 中的标志位,优化程序设计。 7. 通过标志位 `Udisk.datawriting` 重新编写了 `SafeRemoveDisk()` 函数。 8. 去掉代码中多余的延时函数,提升了代码运行速度。 9. 修改并优化 **`void host(void)`** 函数。 - 精简 `host()` 函数中的代码,使之全部变成函数的调用。清晰明了。 - 修改 `host()` 函数中的调用函数顺序,使之直接在主循环中调用。 ## **附,V4.0 版本代码使用注意事项:** - 代码初始化时,调用 函数 `mInitCH376Host()` - 若`mInitCH376Host()` 函数返回 `USB_INT_SUCCESS` - 开启 定时器5 定时扫描 U盘插入状态 - 建议在进行 **每轮数据采集** 时,调用`Ch376_SetFileName()` 函数,为准备向 U盘 中写入的文件设置文件名。(文件名与调用`Ch376_SetFileName()`函数时的实时时钟有关) - 若一直未调用本函数,在向创建文件时,会出现: 创建长文件名失败,且不会向 U盘中写入任何数据。 - 在创建文件时,若存在相同文件名,则不会进行数据追加,也不会进行数据覆盖。 - 在数据按照 **`*.CSV`** 格式,完全写入缓冲区后,可调用 **`host()`** 函数向U盘中写入数据。 ---- ## **V3.0 2017-04-19 22:00:10** ### ------------------校验状态:`已校验` - **完成碳硅分析仪的项目整体设计。包括: U盘全局状态标志、操作顺序等。详见 `README_Frame.pdf`** - 完成项目中的大部分函数移植,包括: - `UINT8 Check_Ch376sUart2Connect (void);` - `UINT8 Check_UdiskConnect (void);` - `UINT8 Ch376_UdiskMount (void);` - `UINT8 Quire_UdiskInform (void);` - `UINT8 mInitCH376Host (void );` - `UINT16 Quire_UdiskFreeVolume (void);` - `UINT8 IsDiskWriteProtect (void);` - **`void Ch376_SetFileName(void);`** - **`UINT8 Ch376_CreatFile(void);`** - 实现 **`*.CSV`** 文件的创建。具体文件文件格式,详见`README_Frame.pdf` - **参考 EXAM11 ,添加了 长文件名文件的支持。** 通过函数 `Ch376_SetFileName()` 设置要写入文件的 长短文件名。文件名由调用函数时的 `RTC` 时钟构成。 ------ ## **V2.0 2017-04-09 22:47:16** ### ------------------校验状态:`已校验` **完成 EXAM8 到STM32 的整体移植**。 以下为: EXAM8 功能。 1. 本范例演示在扇区模式下处理零碎数据读写,用于将 RTC 实时时钟数据 添加到U盘或者SD卡文件MY_RTC.TXT中. 2. 如果文件存在那么将数据添加到文件末尾,如果文件不存在那么新建文件后添加数据. 3. 本范例演示在扇区模式下处理零碎数据,同时兼顾操作方便和较高速度,需要单片机系统提供足够的RAM作为文件数据缓冲区FILE_DATA_BUF >### **已知问题 :** > - ~~与 CH376S 芯片通讯波特率较低,造成操作延时较高。~~ > - ~~**代码现通过 `void host(void)` 函数中 `while(1)` 大循环操作U盘。不支持自动检测U盘插入断开。**~~ > - **`0x42`** 版本芯片若用 win7 以上系统格式化,看不到创建的文件。 > - **`0x45`** 版本芯片测试成功。 最终测试时间: **2017-04-18 15:57:09** --- ## **V1.1 2017-04-08 20:16:34** ## >### -------------校验状态: `已校验` >### 解决的问题: >> 1. 完成CH376S `UART_HW.C`底层通讯的移植 >> 2. 修改 `Debug.C ` `Debug.h`中对printf的支持。删除两个文件在工程中的使用。改用 `/SYSTEM/USART/UART.C` 中串口1对 printf 的重定向。 >> 3. 修改 `HAL_BASE.C` 中对 delay 函数的支持。改用 `/SYSTEM/delay/delay.c` 中滴答定时器对 delay 函数的支持。 --- ## V1.0 2017-04-07 17:08:36 >### 解决的问题: >### -------------校验状态:`已校验` >> 1. 空项目工程整体创建。