<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[wenchm的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/wenchm</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; wenchm]]></copyright><item><title><![CDATA[细说STM32F407指定地址范围按字节、半字、字、双字读、写片内Flash的方法]]></title><link>https://blog.youkuaiyun.com/wenchm/article/details/157904628</link><guid>https://blog.youkuaiyun.com/wenchm/article/details/157904628</guid><author>wenchm</author><pubDate>Mon, 09 Feb 2026 17:15:56 +0800</pubDate><description><![CDATA[这里有一段被注释掉的用于格式化的代码，通过定义了一个结构体实例的指针进行初始化，理论化应该和通过定义结构体实例的变量进行初始化获得一样的结果，但是程序运行以后，结果是不一样的，通过指针初始化后，再调用HAL_FLASHEx_Erase(eraseinit, SectorError)，其进行的擦除操作，是不完全的，开始的16个数据（16*4=64字节）的空间没有被成功擦除，因而写入这16个地址也不会成功，读出的数据也是错的，检查后记录的错误数据=16（0x10)。通过串口助手显示写入和读出的数据。]]></description><category></category></item><item><title><![CDATA[细说STM32F407读写片内Flash和创建USBD_MSC_FlashInChip虚拟U盘接口的方法]]></title><link>https://blog.youkuaiyun.com/wenchm/article/details/157392668</link><guid>https://blog.youkuaiyun.com/wenchm/article/details/157392668</guid><author>wenchm</author><pubDate>Mon, 26 Jan 2026 14:09:14 +0800</pubDate><description><![CDATA[STORAGE_BLK_NBR的数值，只能为7，无论小于7，还是大于7，得到的U盘设备要么不能被识别，要么识别为不可读写的U盘；并且，当为7是，系统虽然识别到了U盘，格式化的时候也显示了是4K*7=28K大小的U盘，也能够格式化，可是一旦格式化完毕后识别到的U盘大小为0可用为0的U盘，在这个U盘里能创建一个大小为0的空文件，但不能写入，能打开读。进一步地，分析为，作为U盘的flash，哪怕只是flash的一部分空间，也不应该固定的扇区，应该是动态的；函数，动态分配U盘的地址和大小。]]></description><category></category></item><item><title><![CDATA[3种STM32单片机USBD_MSC_FlashInChip虚拟U盘接口usbd_storage_if.c的创建方法]]></title><link>https://blog.youkuaiyun.com/wenchm/article/details/156766124</link><guid>https://blog.youkuaiyun.com/wenchm/article/details/156766124</guid><author>wenchm</author><pubDate>Fri, 09 Jan 2026 16:19:38 +0800</pubDate><description><![CDATA[本文目的：分享总结到的3种U盘接口usbd_storage_if.c的创建方法。，接口函数中设计的buffer，其起始地址是由IDE自动、随机划分的，并没有固定使用某个地址作为buffer的起始地址，比如0x0801 0000。在该文章里曾经给出了利用片内FLASH的部分空间创建USBD_MSC时的一种usbd_storage_if.c的创建方法。test1、test2、test3需要在读、写接口函数里成对开启、注销。usbd_storage_if.c，其它部分详见参考文章。与参考文章存在相同的思考。]]></description><category></category></item><item><title><![CDATA[细说STM32H743XIH6单片机通过FMC访问片外NAND Flash的方法及实例]]></title><link>https://blog.youkuaiyun.com/wenchm/article/details/155983861</link><guid>https://blog.youkuaiyun.com/wenchm/article/details/155983861</guid><author>wenchm</author><pubDate>Wed, 17 Dec 2025 09:31:27 +0800</pubDate><description><![CDATA[本文通过实例旨在进一步介绍STM32H743单片机通过FMC扩展NAND FLASH的方法。本文作者通过编写NAND FLASH的驱动，实现了NAND_AddressTypeDef实例的逻辑盘符与物理地址的映射方法。进一步地，通过此驱动，本文可以放心确认逻辑盘符的编号只在同一个block里连续排列，跨block时，逻辑page编号从0开始重新排列。通过这样的驱动定义，NAND_AddressTypeDef实例的含义一目了然，便于读者和编程人员阅读和理解。]]></description><category></category></item><item><title><![CDATA[细说STM32F407单片机通过FSMC访问片外NAND Flash的方法及实例]]></title><link>https://blog.youkuaiyun.com/wenchm/article/details/155067571</link><guid>https://blog.youkuaiyun.com/wenchm/article/details/155067571</guid><author>wenchm</author><pubDate>Thu, 20 Nov 2025 16:40:32 +0800</pubDate><description><![CDATA[完成上述的设置以后，IDE自动生成代码，自动生成的代码里，根据本例NAND FLASH的需要，最重要的是介绍一下驱动函数stm32f4xx_hal_nand.h，这是针对NAND FLASH生成的非常完整的驱动，并且其内自动生成的针对访问NAND FLASH的函数，能够满足绝大多数的应用。这类用途及解决办法网络上有很多，但是，网络里的资源都太旧了，使用的开发环境落后了，那时候，片外的NAND FLASH的驱动还需要自己写。但必要的情况下，需要修改一些重要的定义，但是，遗憾的是每次生成都需要过来重写一次。]]></description><category></category></item><item><title><![CDATA[细说STM32单片机USBD_MSC_SPI Flash虚拟U盘接口项目创建及编程方法]]></title><link>https://blog.youkuaiyun.com/wenchm/article/details/154696790</link><guid>https://blog.youkuaiyun.com/wenchm/article/details/154696790</guid><author>wenchm</author><pubDate>Tue, 11 Nov 2025 17:13:07 +0800</pubDate><description><![CDATA[在USBD中间件众多的IP类中，可以把MCU中片外的SPI FLASH创建成虚拟的U盘，并在电脑端自动识别、驱动U盘，然后通过接口操作U盘。继续使用旺宝红龙开发板STM32F407ZGT6 KIT V1.0，使用STM32CubeIDE 1.19.0。细说STM32单片机USBD_MSC_FlashInChip虚拟U盘接口项目创建及编程方法-优快云博客。本文旨在演示如何把MCU片外的SPI FLASH创建成一个虚拟U盘，然后通过U盘接口创建文件、读写文件。3、中间件USB_DEVICE。]]></description><category></category></item><item><title><![CDATA[细说STM32单片机USBD_MSC_FlashInChip虚拟U盘接口项目创建及编程方法]]></title><link>https://blog.youkuaiyun.com/wenchm/article/details/153679144</link><guid>https://blog.youkuaiyun.com/wenchm/article/details/153679144</guid><author>wenchm</author><pubDate>Tue, 21 Oct 2025 11:07:44 +0800</pubDate><description><![CDATA[在这里，把STORAGE_BLK_SIZ解释为FLASH页更好，F407的手册里并没有FLASH页的说法，但有扇区的说法，并且各个扇区的大小还不相等，区分为16K、64K、128K。在创建U盘接口时，不能把全部的页用于创建U盘，到底需要把到少数量的页用于创建U盘，需要尝试，编译一次，就会知道是否超过了存储空间的允许。在USBD中间件众多的IP类中，可以把MCU中片内的FLASH的一部分空间创建成虚拟的U盘，并在电脑端自动识别、驱动U盘，然后通过接口操作U盘。选择Device_Only，参数默认；]]></description><category></category></item><item><title><![CDATA[细说STM32单片机USBD_MSC_SD_FATFS项目创建及编程方法]]></title><link>https://blog.youkuaiyun.com/wenchm/article/details/152117586</link><guid>https://blog.youkuaiyun.com/wenchm/article/details/152117586</guid><author>wenchm</author><pubDate>Sat, 04 Oct 2025 15:00:06 +0800</pubDate><description><![CDATA[但是，不是没有办法，IDE在usbd_storage_if.h里声明了一个接口操作函数fops，如此，通过在其他.c文件里包含usbd_storage_if.h，就可以通过调用。在其他的位置，比如在main.c无法直接调用这些函数，因为，对应的usbd_storage_if.h里没有声明这些函数，因此main.c无法通过include包含这些函数。下载后，在电脑端自动识别和驱动U盘，通过鼠标操作该U盘，比如创建1个123.txt的文件，打开这个文件，在其内写入文字，存盘。（这不具有普遍性，理应选择4线的。]]></description><category></category></item><item><title><![CDATA[细说STM32单片机USBD_HID项目创建及编程方法]]></title><link>https://blog.youkuaiyun.com/wenchm/article/details/152002392</link><guid>https://blog.youkuaiyun.com/wenchm/article/details/152002392</guid><author>wenchm</author><pubDate>Wed, 24 Sep 2025 16:38:52 +0800</pubDate><description><![CDATA[的值为 0 或 1， 为1表示HID设备是一个启动设备（BootDevice， 一般对PC机有意义，意思是BIOS启动时能识别您使用的HID设备，切只有标准鼠标或者键盘才能称为BootDevice），为0表示HID设备是操作系统启动厚才能识别使用的设备。HID设备描述符主要描述HID规范的版本号, HID通信所使用的额外描述符，报告描述符的长度等。IDE配置完毕后，自动生成USBD_HID类设备的驱动代码，无论HID是标准键盘、鼠标还是游戏杆（JoyStick），所有驱动都是自动生成的，并且默认生成的。]]></description><category></category></item><item><title><![CDATA[细说STM32单片机USBD_CDC项目创建及编程方法]]></title><link>https://blog.youkuaiyun.com/wenchm/article/details/151826741</link><guid>https://blog.youkuaiyun.com/wenchm/article/details/151826741</guid><author>wenchm</author><pubDate>Thu, 18 Sep 2025 14:16:09 +0800</pubDate><description><![CDATA[USBD_CDC与其他设备，比如串口助手的收发操作，代码都要写在这个文件里。使用单片机多功能调试助手作作为USBD_CDC的收发测试软件，开启连续发送，开启发送新行。VCP_V1.5.0_Setup_W8_x64_64bits.exe，最新版本V1.5.0。里设计了2路内容相同但通信手段不同的对比测试，一路通过USBD_CDC收发，另一路通过USART6收发。usbd_cdc_if.c为USB的CDC类应用层文件，里面包含虚拟串口的接收，发送和控制等函数。其中，CDC_Transmit_FS()负责发送；]]></description><category></category></item><item><title><![CDATA[细说STM32单片机USBD_Custom_HID项目创建及编程方法]]></title><link>https://blog.youkuaiyun.com/wenchm/article/details/151577222</link><guid>https://blog.youkuaiyun.com/wenchm/article/details/151577222</guid><author>wenchm</author><pubDate>Thu, 11 Sep 2025 15:02:16 +0800</pubDate><description><![CDATA[无论接收到还是发送出去的，都有两种格式，一种ASCII字符，一种ASCII 16进制值。本例，作者通过创建一个USBD_Custom_HID的键盘项目，并提供一套软件DEMO，向读者介绍此类项目的开发经验、编程入口。接收区，1帧，64字节数据，数据内容是程序赋值的，帧头、1、2、...、63，共64个字节。一共发了2次数据，发送的是字符，ASCII字符，64字节，1个字符占一个字节，空格也占一个字节。编译后下载到开发板上。USB分析仪上，也接收到了2次数值，只能显示16进制数值，不能显示字符。]]></description><category></category></item><item><title><![CDATA[细说STM32单片机用FatFS管理USBH_MSC项目中调库函数的规则和使用方法]]></title><link>https://blog.youkuaiyun.com/wenchm/article/details/150524666</link><guid>https://blog.youkuaiyun.com/wenchm/article/details/150524666</guid><author>wenchm</author><pubDate>Tue, 19 Aug 2025 16:26:53 +0800</pubDate><description><![CDATA[私有App里调用USBH_前缀专用函数时，私有函数在main.h里声明，在usbh_diskio.c里定义，能否在其他的位置定义，需要读者去尝试，定义的位置不对，会引起百编译错误，按做这个方法声明和定义，没有编译错误。本文的目的是，向读者介绍在用FatFS管理USB-OTG FS HOST项目中，在自己的App里，当需要管理U盘文件（如：读、写、查询信息、检查U盘状态，初始化，等）时，既可以调用第三方提供的通用驱动函数（f_前缀），也可以调用。的专用驱动函数（USBH_前缀，2个中间件共同作用的结果）。]]></description><category></category></item><item><title><![CDATA[细说STM32单片机配置为USBH_FS并用FatFS管理U盘文件系统的方法与实例]]></title><link>https://blog.youkuaiyun.com/wenchm/article/details/150212784</link><guid>https://blog.youkuaiyun.com/wenchm/article/details/150212784</guid><author>wenchm</author><pubDate>Fri, 15 Aug 2025 01:00:00 +0800</pubDate><description><![CDATA[函数MX_FATFS_Init()用于FatFS初始化，函数MX_USB_HOST_Init()用于USB Host的初始化，这是在文件usb_host.h中定义的一个函数。在main()函数的外设初始化部分，调用函数MX_USB_HOST_Init()进行USB Host初始化，这个函数是在文件usb_host.h中定义的，这个文件同时还定义了USBH背景任务函数MX_USB_HOST_Process()。第3个变量是USB的ID，宏常数HOST_FS的值为1，表示USB-OTG FS。]]></description><category></category></item><item><title><![CDATA[细说STM32单片机在应用SD卡的项目中调用不同路径的库函数的规则和使用方法]]></title><link>https://blog.youkuaiyun.com/wenchm/article/details/149663645</link><guid>https://blog.youkuaiyun.com/wenchm/article/details/149663645</guid><author>wenchm</author><pubDate>Sat, 26 Jul 2025 14:34:56 +0800</pubDate><description><![CDATA[本文旨在详细介绍STM32单片机访问（阻塞模式、非阻塞模式）SD卡，和STM32单片机开启文件系统FATFS后访问SD卡，在私有应用函数里调用STM32CubeIDE自动生成的各类驱动函数的最佳路径和方法。选择不同的驱动函数，编程的路径和方法是不一样的，但正确编程的结果是一样的。为了发布本文，本文作者已经发布相关文章4篇，为的是证明，选择不同的驱动函数，编程的路径和方法是不一样的。但一定有一种方法是最简单和最实用的。]]></description><category></category></item><item><title><![CDATA[细说STM32单片机SD卡的FatFS文件系统并使用DMA模式访问SD卡的方法及其应用]]></title><link>https://blog.youkuaiyun.com/wenchm/article/details/149643115</link><guid>https://blog.youkuaiyun.com/wenchm/article/details/149643115</guid><author>wenchm</author><pubDate>Sat, 26 Jul 2025 10:55:33 +0800</pubDate><description><![CDATA[文件sd_diskio.c中定义的函数BSP_SD_WriteCpltCallback()和BSP_SD_ReadCpltCallback()，实际上是文件bsp_driver_sd.c中两个同名的弱函数的重新实现。经过测试， FATFS文件系统针对SD卡的专用函数为sd_diskio.c/h和bsp_driver_sd.c/.h，在自己的应用里调用这些专用函数，比如SD_write()，需要把私有函数写在sd_diskio.c的沙箱里。两个示例的主程序大致功能，也就是应用层的功能，是相同的。]]></description><category></category></item><item><title><![CDATA[细说STM32单片机SD卡的FatFS文件系统并使用轮询模式访问SD卡的方法及其应用]]></title><link>https://blog.youkuaiyun.com/wenchm/article/details/149288991</link><guid>https://blog.youkuaiyun.com/wenchm/article/details/149288991</guid><author>wenchm</author><pubDate>Mon, 14 Jul 2025 11:33:05 +0800</pubDate><description><![CDATA[检测SD卡状态在SD卡的应用程序里很重要，为了提高程序的鲁棒性IDE自动生成的程序代码里多次出现检查SD卡的状态，因此，如果使用者忽略了对SD卡状态的检查（检查是否插入、检查是否装载），程序的容错能力就会很弱，就会发生意想不到的失误，比如，不能装载、不能写入、不能读出，偏偏有的时候还能装载或写入或读出。此处，声明了5个Disk IO函数，即SD_initialize()、SD_status()、SD_read()、SD_write()、SD_ioctl()。系统中只有一个驱动器，驱动器号是“0:”。]]></description><category></category></item><item><title><![CDATA[细说STM32单片机使用DMA模式直接访问SD卡的方法及其应用]]></title><link>https://blog.youkuaiyun.com/wenchm/article/details/149242997</link><guid>https://blog.youkuaiyun.com/wenchm/article/details/149242997</guid><author>wenchm</author><pubDate>Thu, 10 Jul 2025 11:28:58 +0800</pubDate><description><![CDATA[阅读本文需要的基本知识可以参考本文作者发布的文章：细说STM32单片机使用轮询模式直接访问SD卡的方法及其应用-优快云博客SD的HAL驱动程序提供了DMA方式读写SD卡的函数，即HAL_SD_WriteBlocks_DMA()和HAL_SD_ReadBlocks_DMA()。当SD卡读写数据量比较大时，使用DMA方式可以减少处理器负荷，提高运行效率。本文用一个示例演示DMA方式读写SD卡的操作。一、示例：以DMA方式读写SD卡1示例功能与CubeMX项目设置。]]></description><category></category></item><item><title><![CDATA[细说STM32单片机使用轮询模式直接访问SD卡的方法及其应用]]></title><link>https://blog.youkuaiyun.com/wenchm/article/details/149218456</link><guid>https://blog.youkuaiyun.com/wenchm/article/details/149218456</guid><author>wenchm</author><pubDate>Thu, 10 Jul 2025 08:37:38 +0800</pubDate><description><![CDATA[某些寄存器可以由函数直接读取，例如，函数HAL_SD_GetCardCID()可读取CD的内容，函数HAL_SD_GetCardCSD()可读取CSD的内容，函数HAL_SD_GetCardStatus()可读取SSR的内容。按下开发板的复位键后，能显示正确的菜单，接着，可以操作各个菜单。上述代码的主要功能就是调用函数HAL_SD_GetCardInfo()获取SD卡的信息，并将返回的信息存储在结构体HAL_SD_CardInfoTypeDef类型的变量cardInfo里，这个结构体各成员变量的意义如下。]]></description><category></category></item><item><title><![CDATA[细说STM32单片机SPI-Flash芯片的FatFS移植及其应用实例详解]]></title><link>https://blog.youkuaiyun.com/wenchm/article/details/148624464</link><guid>https://blog.youkuaiyun.com/wenchm/article/details/148624464</guid><author>wenchm</author><pubDate>Mon, 16 Jun 2025 17:16:23 +0800</pubDate><description><![CDATA[本文以开发板上的SPI-Flash芯片W25Q16为媒介详细介绍CubeMX中FatFS各个参数的意义和设置，分析生成的代码中FatFS各个文件的作用和关联，完成针对W25Q16的硬件访问层的移植。继续使用旺宝红龙开发板STM32F407ZGT6 KITV1.0。]]></description><category></category></item><item><title><![CDATA[细说STM32单片机FatFS文件系统基础知识和函数详解]]></title><link>https://blog.youkuaiyun.com/wenchm/article/details/148609013</link><guid>https://blog.youkuaiyun.com/wenchm/article/details/148609013</guid><author>wenchm</author><pubDate>Mon, 16 Jun 2025 09:00:00 +0800</pubDate><description><![CDATA[目录一、FatFS概述1、FatFS的作用（1）用户应用程序（2）FatFS通用程序（3）FatFS底层设备控制（4）存储介质和RTC2、文件系统的一些基本概念（1）文件系统（2）FAT卷（3）扇区（4）簇（5）数据存储形式3、FatFS的功能特点和参数4、FatFS的文件组成（1）用户应用程序（2）FatFS应用接口5、FatFS通用硬件接口（1）具体硬件访问层（2）具体硬件6、FatFS的基本数据类型定义二、 FatFS的应用程序接口函数1、卷管理和系统配置相关函数（1）函数f_mkfs()（2）函数f]]></description><category></category></item></channel></rss>