1、将usb U盘模式库文件添加到工程中
2、将usb_dev_msc例程中source目录下的文件复制到本项目source目录下,然后添加到工程中
3、添加相关引用
4、修改文件usb_dev_msc_msd.c
#define FLASH_SECTOR32_ADRR (8*1024*40)
设置内部flash起始地址
根据要使用的flash空间大小设置容量
修改flash读写函数
int8_t msc_getcapacity(uint8_t lun, uint32_t *block_num, uint32_t *block_size)
{
*block_size = 512u;
*block_num = 16u * 1024u * 8u / 512u;
return Ok;
}
int8_t msc_read(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
int8_t res = (int8_t)0;
uint32_t cnt = 0;
USB_STATUS_REG |= (uint8_t)0X02;
//W25QXX_Read(buf, blk_addr * 512u, blk_len * 512u);
for(cnt = 0; cnt < blk_len*512/4;cnt ++)
{
*(uint32_t *)(buf+4*cnt)=*(uint32_t *)(FLASH_SECTOR32_ADRR+blk_addr*512+cnt*4);
//memcpy((uint8_t *)(buf+512*cnt),(uint8_t *)(FLASH_SECTOR32_ADRR+blk_addr*8*1024+cnt*512),512);
}
//memcpy(buf,(uint8_t *)(FLASH_SECTOR32_ADRR+blk_addr*8*1024),blk_len*8*1024);
return res;
return res;
}
/**
*******************************************************************************
** \brief Write data to storage devices
** \param lun: logic number
** \param buf: data buffer be written
** \param blk_addr: sector address
** \param blk_len: sector count
** \retval status
******************************************************************************/
uint8_t buf_sector[8*1024];
void efm_blok_program(uint32_t addr,uint8_t *buf)
{
uint32_t cnt;
uint32_t sector_start_addr = (addr/(8*1024))*8*1024;
memcpy(buf_sector,(uint8_t *)sector_start_addr,8*1024);
memcpy((uint8_t *)(buf_sector+(addr%(8*1024))),buf,512);
EFM_SectorErase(sector_start_addr);
for(cnt = 0;cnt<8*1024/4;cnt ++)
{
EFM_SingleProgram((uint32_t)(sector_start_addr+cnt*4),*(uint32_t *)(buf_sector+cnt*4));
}
}
int8_t msc_write(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
int8_t res = (int8_t)0;
uint32_t u32Addr;
uint32_t cnt;
USB_STATUS_REG |= (uint8_t)0X01;
//W25QXX_Write(buf, blk_addr * 512u, blk_len * 512u);
/* Unlock EFM. */
EFM_Unlock();
/* Enable flash. */
EFM_FlashCmd(Enable);
/* Wait flash ready. */
while(Set != EFM_GetFlagStatus(EFM_FLAG_RDY))
{
;
}
for(cnt=0;cnt <blk_len;cnt ++)
{
efm_blok_program(FLASH_SECTOR32_ADRR+(blk_addr+cnt)*512,(uint8_t *)(buf+cnt*512));
}
/* Lock EFM. */
EFM_Lock();
return res;
}
5、设置控制台启动U盘模式
#include "usb_dev_user.h"
#include "usb_dev_desc.h"
#include "usb_bsp.h"
#include "usb_dev_msc_class.h"
usb_core_instance usb_dev;
static rt_thread_t upan = RT_NULL;
static void usb_upan_entry(void *parameter)
{
hd_usb_dev_init(&usb_dev, &user_desc, &usb_dev_msc_cbk, &user_cb);
while(1){
rt_thread_mdelay(1);
}
}
void usb_thread_run(void)
{
upan = rt_thread_create("usbpan",usb_upan_entry, RT_NULL,1024,3, 10);
if (upan != RT_NULL)
rt_thread_startup(upan);
}
static int upan_mode(int argc, char *argv[]){
usb_thread_run();
return 0;
}
MSH_CMD_EXPORT_ALIAS(upan_mode, upan_mode, run upan_mode);
6、在 配置文件中 rtconfig.h 打开宏定义 #define RT_USING_HEAP
修改宏定义#define RT_HEAP_SIZE 4096 增大堆空间
7、插上usb线,编译运行,电脑上会识别出U盘,格式化后即可以复制粘贴文件