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

如何通过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扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版