直接使用官方例程,有如下注意点:
1、USB的时钟是48MHz,需要根据自己的系统主频来分频。否则时钟频率不对,USB会枚举失败,电脑提示设备描述符获取失败。
在如下文件和位置设置宏定义来选择系统主频。

然后根据自己的主频来设置分频:

/*!\brief      configure the different system clocks\param[in]  none\param[out] none\retval     none
*/
void rcu_config(void)
{/* enable USB pull-up pin clock */ rcu_periph_clock_enable(RCU_GPIOA);/* enable the power clock */rcu_periph_clock_enable(RCU_PMU);/* configure USB model clock from PLL clock */rcu_usb_clock_config(RCU_CKUSB_CKPLL_DIV2);  //主频96M,二分频就是48M/* enable USB APB1 clock */rcu_periph_clock_enable(RCU_USBD);
}

如上,主频是96M,二分频就是48M。
如果主频是72M,就是1.5分频。

/* use HXTAL (XD series CK_HXTAL = 8M, CL series CK_HXTAL = 25M) */
//#define __SYSTEM_CLOCK_HXTAL                    (uint32_t)(__HXTAL)
//#define __SYSTEM_CLOCK_24M_PLL_HXTAL            (uint32_t)(24000000)
//#define __SYSTEM_CLOCK_36M_PLL_HXTAL            (uint32_t)(36000000)
//#define __SYSTEM_CLOCK_48M_PLL_HXTAL            (uint32_t)(48000000)
//#define __SYSTEM_CLOCK_56M_PLL_HXTAL            (uint32_t)(56000000)
#define __SYSTEM_CLOCK_72M_PLL_HXTAL            (uint32_t)(72000000)
//#define __SYSTEM_CLOCK_96M_PLL_HXTAL            (uint32_t)(96000000)
//#define __SYSTEM_CLOCK_108M_PLL_HXTAL           (uint32_t)(108000000)
    /* enable USB pull-up pin clock */ rcu_periph_clock_enable(RCC_AHBPeriph_GPIO_PULLUP);/* enable the power clock */rcu_periph_clock_enable(RCU_PMU);/* configure USB model clock from PLL clock */rcu_usb_clock_config(RCU_CKUSB_CKPLL_DIV1_5);/* enable USB APB1 clock */rcu_periph_clock_enable(RCU_USBD);

2、需要根据自己的芯片型号更改Flash页面大小,比如GD32F103C8T6的页面大小为1K,GD32F103VCT6的页面大小为2K

#define PAGE_SIZE                     ((uint32_t)(1024))
#define NAND_FLASH_BASE_ADDRESS       ((uint32_t)(0x08000000 + 0x04000))
#define NAND_FLASH_END_ADDRESS        ((uint32_t)(0x08000000 + 0x10000))

修改了页面大小,同时还需要修改写扇区函数

比如页面大小为1K,那么写函数修改为:

/*!\brief      write data to multiple blocks of flash\param[in]  pBuf: pointer to user buffer\param[in]  write_addr: address to be write\param[in]  block_size: block size\param[in]  block_num: number of block\param[out] none\retval     status
*/
uint32_t flash_write_multi_blocks (uint8_t *pBuf,uint32_t write_addr,uint16_t block_size,uint32_t block_num)
{uint32_t i, page;uint32_t start_page = (write_addr / PAGE_SIZE) * PAGE_SIZE + NAND_FLASH_BASE_ADDRESS;uint32_t *ptrs = (uint32_t *)pBuf;page = block_num;for(; page > 0; page--){fmc_page_erase(start_page);i = 0;do{fmc_word_program(start_page, *ptrs++);start_page += 4;}while(++i < 256);}return 0;
}

实验结果:

和普通的U盘效果一样,可以读写、格式化。

GD32F103内部Flash做虚拟U盘相关推荐

  1. STM32F103C8用内部Flash做一个优盘(USB+MSC+FATFS)

    STM32F103C8用内部Flash做一个优盘(USB+MSC+FATFS),轻松实现APP升级.数据存储. 基本工程生成 直接使用STM32CubeMX生成基本的工程,省得我们去调底层. 时钟配置 ...

  2. 2.ESP32-S2 USB 挂载内部Flash,当作U盘使用,无线U盘

    使用的 IDF_4.4 C语言开发 1.ESP32-S2 USB烧录 输出日志 2.ESP32-S2 USB 挂载内部Flash,当作U盘使用,无线U盘 3.ESP32-S2 USB 挂载SPI-SD ...

  3. stm32L152 使用内部内部flash做EEPROM 出FLASH_ERROR_WRP问题及解决办法

    最近做个modbus网关,用到的MCU是stm32L152,这个项目是和别人合作,我做顶层的算法和从机协议,从机读回来的数据要存到外部flash中,而外部flash的索引地址要保存到内部的eeprom ...

  4. 使用cubemx建立一个内部flash虚拟一个U盘的工程

    序言 使用软件版本 建立一个基础工程 添加flash操作代码 工程链接 可以注意到的是,大部分的stm32芯片是支持usb从机的,当然这类的标准库例程也有,比如野火的例程就有,只要将例程稍做修改就可以 ...

  5. 【单片机笔记】基于STM32F103C8的 USB 外部flash虚拟U盘

    学习stm32已经很长时间了,但是一直没有过多的学习stm32的USB部分,因为实际工作还是用的比较少.说起USB那就有的说了,因为USB的功能很强大,这里主要重点记录一下STM32的USB部分,这个 ...

  6. STM32F103VET6利用片内FLASH虚拟U盘,使用文件复制方式实现IAP

    在原子论坛偶尔搜到一篇 利用STM32片内FLASH虚拟U盘,使用文件复制方式实现IAP的帖子http://www.openedv.com/forum.php?mod=viewthread&t ...

  7. U盘GPIO文件系统映射-STM32利用内置FLASH做U盘

    受到linux对一切设备的控制都当成文件对待的启发 于是便有了这个将GPIO映射到U盘中的想法,这样一来便可以在任何支持U盘的设备中扩展系统的硬件功能了 我的QQ是243786753,这属于原创作品, ...

  8. 【STM32CubeMx你不知道的那些事】第十章:STM32CubeMx的SPI外置FLASH(W25Q128)+文件系统(FATFS)+虚拟U盘

      这一张我们主要讲解一下STM32CUBEMX新版本 片外FLASH(W25Q128)+FATFS文件系统+虚拟U盘. 一.准备工作 这里我们要想配置SPI和文件系统 并验证需要的准备工作如下: 1 ...

  9. 模拟计算机怎么做,电脑虚拟U盘如何制作 电脑虚拟U盘怎样制作

    今天给大家带来电脑虚拟U盘如何制作,电脑虚拟U盘怎样制作,让您轻松解决问题.虚拟U盘,顾名思义,是一个虚拟的可移动磁盘.占用的是硬盘空间. 具体方法如下:1 安装OSFMoun软件 (此程序分32位和 ...

最新文章

  1. jquery.cycle.js
  2. __proto__(隐式原型)与prototype(显式原型)
  3. AI:一个20年程序猿的学习资料大全—人工智能之AI/机器学习/深度学习/计算机视觉/Matlab大赛——只有你不想要的,没有你找不到的
  4. 教你弹奏电子钢琴【Flash版】
  5. c++外观模式façade
  6. 兰州理工大学c语言试题答案,兰州理工大学c语言题库81058116.doc
  7. java学习(95):线程的优先级
  8. 【OS学习笔记】六 实模式:编写主引导扇区代码
  9. Vue+Element+Springboot实现图片上传
  10. 全网首发:解决办法:shmget()一直失败,errno=-22
  11. python学习笔记4:函数
  12. 群晖DS218+部署kafka
  13. jquery动态创建表格
  14. 计算机格式化没有fat32,无需格式化 U盘FAT32转NTFS格式教程
  15. 深入了解Xcode 7——代码编辑
  16. 头歌c语言实训作业题解
  17. 穷爸爸 富爸爸(Rich dad , Poor dad ) 读书笔记(第一课lesson 1)
  18. 西部数据硬盘 篇一:绿盘、红盘、蓝盘、紫盘、黑盘和金盘的区别
  19. java liferay,用一个简单的Java code获取当前用户的Liferay
  20. PCL点云配准(ICP)

热门文章

  1. python中的os abort_Python os.abort()用法及代码示例
  2. mac怎么用c语言写文件路径,Mac 中使用os模块更改文件路径
  3. 无法修改服务器名称_经典怀旧服服务器第六期免费角色转移服务10月18日7:00开放...
  4. python中画圆的代码_Python编程12:Python画图之turtle库如何画圆
  5. 博世力士乐液压_A10VSO71DFR1/31RPPA12N00力士乐柱塞泵原装现货
  6. java jni 参数_Java 与 JNI 互传数据的那些事
  7. 瘫痪17年,利用双向脑机接口来诱发触觉,控制机械手
  8. 3D模型“换皮肤”有多简单?也就一句话的事
  9. 5分钟“调教”一只机器狗,百度飞桨已经简单到这地步了吗?
  10. 量子信息先行者中科院院士郭光灿:“要把中国量子计算机卖到国外”