HC32F460 实现模拟U盘导入python脚本在19264点阵屏上绘图--U盘模式

该博客介绍了如何将USB设备配置为U盘模式,包括添加库文件、修改例程以适应内部Flash、设置Flash起始地址和容量、实现Flash的读写函数,以及开启U盘模式的步骤。同时,还涉及到了堆空间的调整和编译运行的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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盘,格式化后即可以复制粘贴文件

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值