【PeidzzZ原创,转载请说明出处://www.greatytc.com/p/96cff6b9ce42】
准备工作
- 带有芯片STM32F103RCT6最小系统板一块
- Windows 系统(本例为WIN7)
- STM32cubeMX软件
- MDK-ARM软件
开始配置
-
选择芯片型号
-
设置Debug工具,不选择的话将无法直接使用stlink烧写程序。
-
选择外部晶振
-
配置USB引脚
-
开启USB device
-
配置时钟,必须要设置USB设备时钟为48MHz
-
工程选项和堆栈配置,堆栈要修改,不然无法启动
- 点击GENERATE CODE,生成代码。
- 打开MDK-ARM中的工程文件。
- 打开Application/User目录下的usbd_storage_if.c文件,修改及添加:
/** @defgroup USBD_STORAGE_Private_Defines
* @brief Private defines.
* @{
*/
#define STORAGE_LUN_NBR 1
#define STORAGE_BLK_NBR 80 // 模拟80个扇区
#define STORAGE_BLK_SIZ 0x200 // 每个扇区512B
/* USER CODE BEGIN PRIVATE_DEFINES */
uint8_t msc_data[STORAGE_BLK_NBR][STORAGE_BLK_SIZ] = {0}; // 总容量为40KB
/* USER CODE END PRIVATE_DEFINES */
/**
* @}
*/
- 为STORAGE_Read_FS()及STORAGE_Write_FS()添加代码,它们是对msc_data数组的读写,且规则和SD卡一样,按照512字节为一扇区进行读写:
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 n, i;
for (n = 0;n < blk_len;n++) {
for (i = 0;i < STORAGE_BLK_SIZ;i++) {
buf[n * STORAGE_BLK_SIZ + i] = msc_data[blk_addr + n][i];
}
}
return (USBD_OK);
/* USER CODE END 6 */
}
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 n, i;
for (n = 0;n < blk_len;n++) {
for (i = 0;i < STORAGE_BLK_SIZ;i++) {
msc_data[blk_addr + n][i] = buf[n * STORAGE_BLK_SIZ + i];
}
}
return (USBD_OK);
/* USER CODE END 7 */
}
-
编译后下载,通过USB直接连接电脑。在“我的电脑”中可以看到“可移动磁盘”,但无法使用,提示需要进行格式化。格式化前需要勾选快速格式化。成功后,即可看到有容量的“可移动磁盘”:
-
注意事项
-
设置STORAGE_BLK_NBR时,需要合理规划内存大小,如设置过大,则会出现编译错误。