你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

如何通过STM32CubeMX软件把单片机变成一个迷你优盘

[复制链接]
gaosmile 发布时间:2020-4-26 15:08
哈喽大家好,这里是没什么人爱看的USB系列。USB系列停了几天,今天继续。这次说下如何通过STM32CubeMX软件,在5分钟的时间内,把你的单片机变成一个迷你优盘。


GPIO、RCC、SYS、Connectivity

首先,通过STM32CubeMX软件配置单片机外设。型号依然是STM32F013C8T6,GPIO、RCC、SYS、Connectivity部分和之前的[color=var(--weui-LINK)]USB鼠标设置一样,参照前面的部分。

微信图片_20200426150459.png

中间件


其次,中间件,也就是Middleware部分,修改一下。一个是Class For FS IP,这里选择:Mass Storge Class,然后是下面的Class Parameters这里,之前的值是512,现在改为1024.为什么是1024,后面会说。

除此之外,VID和PID要和之前的不一样,然后配置一下时钟。

微信图片_20200426150503.png

堆栈设置


第三,修改堆栈上限。之前的值是0x200,0x400,因为要模拟优盘,操作大量数据,这部分空间已经不够了,全部改为0x1000.
然后就可以生成工程了。
微信图片_20200426150507.png


优盘空间设置


第四,添加自定义部分代码,下面的操作都在文件usbd_storage_if.c内。

  1. /* USER CODE BEGIN PRIVATE_DEFINES */
  2. #define     FLASH_START_ADDR            0x08004000    //
  3. #define     FLASH_PAGE_NBR              48             // 48K
  4. /* USER CODE END PRIVATE_DEFINES */
复制代码


主要有两个内容,一个是flash的起始地址,另一个是扇区的个数。
因为本工程代码不多,编译完成后代码量在12K左右,所以给程序文件预留16K的空间足够了。同时,STM32F103C8T6的flash总共64K,所以还剩48K。而STM32F103C8T6的flash,一个扇区大小是1024字节。这就是为什么第二步那里,Class Parameters的值要改成1024.
所以根据这些信息,可以知道优盘空间的起始地址是0x08004000,扇区个数是48.
微信图片_20200426150512.png

容量获取函数


第五,修改容量获取函数。如下,这里的FLASH_PAGE_SIZE是一个宏定义,可以找到定义值:0x400.

  1. int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
  2. {
  3. /* USER CODE BEGIN 3 */
  4. *block_num  = FLASH_PAGE_NBR;
  5. *block_size = FLASH_PAGE_SIZE;
  6. return (USBD_OK);
  7. /* USER CODE END 3 */
  8. }
复制代码



读优盘函数


第六,修改读优盘函数。如下,把目标flash地址中的数据拷贝到buf中。

  1. int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
  2. {
  3. /* USER CODE BEGIN 6 */
  4.   if(lun == 0)
  5.   {
  6. memcpy(buf,(uint8_t *)(FLASH_START_ADDR + blk_addr*FLASH_PAGE_SIZE),blk_len*FLASH_PAGE_SIZE);
  7. return USBD_OK;
  8. }
  9. return USBD_FAIL;
  10. /* USER CODE END 6 */
  11. }
复制代码




写优盘函数




第七,修改写优盘函数。如下,把buf中的数据写入到目标flash地址中。

  1. int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
  2. {
  3. /* USER CODE BEGIN 7 */
  4. if(lun == 0)
  5. {
  6. uint16_t i;
  7.     HAL_FLASH_Unlock();

  8.     FLASH_EraseInitTypeDef f;
  9.     f.TypeErase = FLASH_TYPEERASE_PAGES;
  10.     f.PageAddress = FLASH_START_ADDR + blk_addr*FLASH_PAGE_SIZE ;
  11.     f.NbPages = blk_len;
  12.     uint32_t PageError = 0;
  13.     HAL_FLASHEx_Erase(&f, &PageError);

  14.     for(i=0;i<blk_len*FLASH_PAGE_SIZE;i+=4)
  15.     HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,FLASH_START_ADDR + blk_addr*FLASH_PAGE_SIZE + i , *(uint32_t *)(&buf[i]));

  16.     HAL_FLASH_Lock();
  17.     return USBD_OK;
  18. }
  19. return USBD_FAIL;
  20. /* USER CODE END 7 */
  21. }
复制代码


好了,保存,编译、下载、上电。

把USB线插入电脑,首先会弹出一个提示框,要求你格式化优盘:
微信图片_20200426150518.png
点击:格式化磁盘。弹出“格式化 可移动磁盘”的对话框,磁盘容量是48K,跟我们当初计算的大小一样。没有问题,点击:开始。
微信图片_20200426150523.png
很快,格式化完成了,点确定即可。
微信图片_20200426150528.png
这时,你会在你的电脑上看到一个容量28K的可移动磁盘。刚才还48,现在怎么一下子缩水成28?
微信图片_20200426150532.png
其实,是因为格式化的时候,电脑要向磁盘写入FAT文件系统,而文件系统要占用一定的磁盘容量。有了文件系统,我们就能方便的操作优盘,而不像操作EEPROM那样费劲。
这时,你可以打开优盘,创建一个TXT文件:
微信图片_20200426150537.png
保存,关闭。弹出优盘,再插上,你会发现你之前创建的TXT文件还在,说明优盘创建成功!

至此,优盘的例程操作完了。其实,单片机内部的flash空间是很小的,虽然能模拟成优盘,但存不了什么东西。所以这一例程的意义在于,我们熟悉了如何使用STM32CubeMX软件来把一些存储设备模拟成优盘,方便使用。例如,我们可以把外部的TF卡或者外部flash模拟成优盘,这样使用起来非常方便。

脑洞一下:如果你有喜欢的人,做这样一个优盘给她,里面写一封表白的信,然后想办法把写优盘函数搞一下,无法擦除,这就是一封删不掉的信...........
1 收藏 评论1 发布时间:2020-4-26 15:08

举报

1个回答
likang1202 回答时间:2020-4-27 18:11:27
mcu起航怎么这么熟悉

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版