STM32F103ZET6 - USB_MSC
示例详解: (参考 : https://blog.csdn.net/zhanglifu3601881/article/details/89635151)
基于硬件平台: STM32F103ZET6正点原子的精英板, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。
-
STM32CubeMX生成代码过程如下:
1>. 打开SWD - debug调试模式, STM32CubeMX生成的代码默认是没打开debug调试模式的
2>. 外部时钟配置, HSE选择为外部晶振
3>. CLOCK Configuration 配置如下: 选择HSE,PLL倍频为9, USB分频为1.5=48M
4>. USB功能选中
5>. 选择为Mass Storage Class, 参数配置为默认
中断配置保持默认
6>. 生成代码配置
栈大小改为0x1000
- 点击生成代码,在keil中开始编辑BootLoader代码,用户要编辑的主要是usbd_storage_if.c文件,
1>. 添加准备好的flash驱动. 在这里增加头文件
/* Includes ------------------------------------------------------------------*/
#include "usbd_storage_if.h"
/* USER CODE BEGIN INCLUDE */
#include "flash.h"
/* USER CODE END INCLUDE */
- 声明下面宏 (本例中我们用芯片内部的FLAHS来模拟U盘)
#define STORAGE_LUN_NBR 1 //分区数
#define STORAGE_BLK_NBR 1024 //块数 1024*512512bytes/sector = 512K
#define STORAGE_BLK_SIZ 0x200 //每个块大小 512bytes/sector
- 在读,写函数内添加如下代码
/**
* @brief .
* @param lun: .
* @retval USBD_OK if all operations are OK else USBD_FAIL
*/
int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
/* USER CODE BEGIN 6 */
uint32_t addr = blk_addr*STORAGE_BLK_SIZ;
FlashReadBuff(DEVICE_INFO_ADDRESS+addr,buf,blk_len*STORAGE_BLK_SIZ );
return (USBD_OK);
/* USER CODE END 6 */
}
/**
* @brief .
* @param lun: .
* @retval USBD_OK if all operations are OK else USBD_FAIL
*/
int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
/* USER CODE BEGIN 7 */
uint32_t addr = blk_addr*STORAGE_BLK_SIZ;
FlashWriteBuff_Word(DEVICE_INFO_ADDRESS+addr,buf,blk_len*STORAGE_BLK_SIZ );
return (USBD_OK);
/* USER CODE END 7 */
}
到此,简单的USB_MSC设备演示demo就完成了,下面我们将程序烧录开发板,然后将将开发板接上电脑,电脑成功识别到U盘并弹同格式化对话框,直接格式化就行了:
我们在U盘新建readme.txt然后在文档中输入一些内容:
重新上电断开后再次打开U盘看里面的内容: