【PeidzzZ原創(chuàng),轉(zhuǎn)載請說明出處:http://www.reibang.com/p/96cff6b9ce42】
準(zhǔn)備工作
- 帶有芯片STM32F103RCT6最小系統(tǒng)板一塊
- Windows 系統(tǒng)(本例為WIN7)
- STM32cubeMX軟件
- MDK-ARM軟件
開始配置
-
選擇芯片型號
-
設(shè)置Debug工具财破,不選擇的話將無法直接使用stlink燒寫程序猛拴。
-
選擇外部晶振
-
配置USB引腳
-
開啟USB device
-
配置時鐘,必須要設(shè)置USB設(shè)備時鐘為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個扇區(qū)
#define STORAGE_BLK_SIZ 0x200 // 每個扇區(qū)512B
/* USER CODE BEGIN PRIVATE_DEFINES */
uint8_t msc_data[STORAGE_BLK_NBR][STORAGE_BLK_SIZ] = {0}; // 總?cè)萘繛?0KB
/* USER CODE END PRIVATE_DEFINES */
/**
* @}
*/
- 為STORAGE_Read_FS()及STORAGE_Write_FS()添加代碼越走,它們是對msc_data數(shù)組的讀寫棚品,且規(guī)則和SD卡一樣,按照512字節(jié)為一扇區(qū)進行讀寫:
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直接連接電腦铜跑。在“我的電腦”中可以看到“可移動磁盤”,但無法使用骡澈,提示需要進行格式化锅纺。格式化前需要勾選快速格式化。成功后肋殴,即可看到有容量的“可移動磁盤”:
-
注意事項
-
設(shè)置STORAGE_BLK_NBR時囤锉,需要合理規(guī)劃內(nèi)存大小,如設(shè)置過大护锤,則會出現(xiàn)編譯錯誤官地。