0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

从STM32F103到ACM32F403的U盘程序移植工程

上海航芯 来源:上海航芯 作者:上海航芯 2021-12-23 14:22 次阅读

前言

本项目是以SPI Flash(如W25Q128等)存储元件作为存储单元,MCU主控完成USB接口通信并根据SCSI协议实现U盘功能。其结构如下图所示:

pYYBAGHEE_WAeyirAAAcvPlG0h4753.png

SPI Flash部分移植

SPI功能部分相对简单,ACM32F403的接口引脚和STM32F103的相同,可直接对接,按照ACM32F403的说明对SPI接口进行初始化,并对底层读写函数进行更改即可。

USB部分移植

1. STM32F103代码结构

在ST的芯片上,USB的数据是由两个中断,USB_LP_CAN1_RX0_IRQHandler和USB_HP_CAN1_TX_IRQHandler来进行,其中高优先级中断(USB_HP_CAN1_TX_IRQHandler)用于处理同步(Isochronous)模式传输或双缓冲块(Bulk)传输模式下的正确传输事件,而低优先级中断(USB_LP_CAN1_RX0_IRQHandler)用于处理其他传输时间。ST的USB数据处理如下图所示:

poYBAGHEFBSAABCJAAGBMBY2Rik368.png

由于USBFS协议的限制,一包数据中最多可携带64字节数据,因此,当存在大量数据需要进行传输(IN或OUT包)时,需要分批次进行传输。在ST的代码中,通过变量“Bot_State”来进行控制,以Read10指令为例,其读数据流程可如下图所示:

poYBAGHEFCiAPj79AAIZklrheBo449.png

需要注意的是,Read10指令解析完成之后(即上图左侧流程图)则进入数据传输阶段,此阶段是通过多次进入USB高优先级中断中,调用Read_Memory();来实现的。Read_Memory();函数内每次传输64字节数据。

2. ACM32F403代码移植要点

本文基于上海航芯官方USB例程进行移植,移植后的程序结构如下图所示:

poYBAGHEFDuAcaoMAADWiksCJaQ150.png

ACM32F403的USB是采用一个中断来进行数据处理。在官方例程中,USB的中断函数内判定接收数据类型,包括suspend,resume,reset,EP0_pack以及其他端点的接收数据。判定结束后,会调用USB_Monitor();函数来处理suspend,resume,reset以及EP0_pack数据。而其他端点数据会在usb_transfer_monitor();函数中进行解析,该函数由客户调用,一般在主函数的死循环中进行处理。在本文的移植中,主要需对USB的端点数据进行处理。

A. EP0_Pack

EP0接收的setup数据会被存放在SETIP_0_3_DATA和SETIP_4_7_DATA寄存器中 ,数据结构如下所示:

dev_req.bmRequestType=USBCTRL->SETIP_0_3_DATA &0xff;

dev_req.bRequest=(USBCTRL->SETIP_0_3_DATA>>8)&0xff;

dev_req.wValue=(USBCTRL->SETIP_0_3_DATA>>16)&0xffff;

dev_req.wIndex = USBCTRL->SETIP_4_7_DATA&0xffff;

dev_req.wLength=(USBCTRL->SETIP_4_7_DATA>>16)&0xffff;

该部分解析,可由用户在函数void usb_control_transfer(void)中添加需要的处理函数。该函数由航芯官方例程里提供。在做U Disk程序移植时,需添加GetMaxLun和Storage_Reset处理函数,如下图所示:

pYYBAGHEFEmAeQ_4AAAXy3Fvpe4520.png

B. EP1_Pack

在本文所述的代码中,ACM32F403采用EP1完成数据的收发工作。主要是完成对SCSI协议的解析工作。移植过程中,需要文件mass_mal.c、memory.c、scsi_data.c、usb_scsi.c、usb_bot.c及其头文件。本段主要就上述文件中代码需要改动的地方进行说明,部分参数需要重新定义,读者可自行解决。下表列出了ST和Aisino的USB收发功能函数,该部分移植时需要修改的主要部分:

pYYBAGHEFFaAZ_OdAAGrUNCnfJM199.png

a. void Mass_Storage_In (void)

在ST的工程代码中该部分主要用于处理SCSI的读指令。由于全速USB一包数据最大支持64字节,因此,当需要传输的数据个数大于该数值时,则需要分包传输。在使用ACM32F403时,可直接传送需要的数据长度,内部会进行分包处理,因此,该函数可省略。

b. void Mass_Storage_Out (void)

该函数用于处理SCSI指令解析以及发送指令,需在usb_transfer_monitor()中调用,并将函数内部的接收数据部分更改为:

“Data_Len = HAL_FSUSB_Receive_Data(Bulk_Data_Buff, 64, out_ep_index, 1);”

c.void Transfer_Data_Request(uint8_t* Data_Pointer, uint16_t Data_Len)

将USB发送函数更改为ACM32F403对应的发送函数。在ST的工程中,该函数用于传输完数据后,进入BOT_DATA_IN_LAST状态,并在下一次的Mass_Storage_In()函数调用时,回复CSW指令。而本文的移植代码中,省略了Mass_Storage_In()函数,因此,可在该函数的尾部增加CSW发送指令:

Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE);

d.void Set_CSW (uint8_t CSW_Status, uint8_t Send_Permission)

将USB发送函数更改为ACM32F403对应的发送函数。

e.void Bot_Abort(uint8_t Direction)

该函数主要对收发端点的STALL状态进行处理,在ACM32F403的收发库函数中,对端点的STALL已做出相应控制,因此,该函数可省略。

f.void Read_Memory(uint8_t lun, uint32_t Memory_Offset, uint32_t Transfer_Length)

Read_Memory函数用于收到PC端的IN包请求后将存储器中的数据读取并发送至PC端。而ACM32F403的USB发送库函数中,自行进行分包操作(一包最大数据为64字节),因此在数据缓冲区容量允许条件下,可直接发送完毕,该函数修改如下:

{

uint32_t Offset, Length;

Offset = Memory_Offset * Mass_Block_Size[lun];

Length = Transfer_Length * Mass_Block_Size[lun];

CSW.dDataResidue = CBW.dDataLength;

while(Transfer_Length --)

{

MAL_Read(lun ,

Offset ,

Data_Buffer,

Mass_Block_Size[lun]);

Length = min(Mass_Block_Size[lun], CSW.dDataResidue);

Offset += Mass_Block_Size[lun];

HAL_FSUSB_Send_Data((uint8_t *)(Data_Buffer), Length, in_ep_index);

CSW.dDataResidue -= Length;

}

Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE);

}

g.void Write_Memory (uint8_t lun, uint32_t Memory_Offset, uint32_t Transfer_Length)

写数据指令完成后,将Bot_State 值更改为 BOT_IDLE。ST的工程代码中,变量“Bot_State”收发状态机的状态值,其值如下表所示:

poYBAGHEFHCARKM7AAInEow6Qbw876.png

而基于ACM32F403的U Disk工程,IN包可由函数HAL_FSUSB_Send_Data()在其内部进行分包处理,不需要额外逻辑,因此,移植后Bot_State仅需要在BOT_IDLE、BOT_DATA_OUT、BOT_ERROR之间转换,其他对Bot_State的控制可省略。

审核编辑:符乾江

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16984

    浏览量

    350246
  • STM32
    +关注

    关注

    2265

    文章

    10870

    浏览量

    354729
收藏 人收藏

    评论

    相关推荐

    STM32F103×8/STM32F103×B MCU手册

    需要确定系统时钟源,如使用HSE或HSI,然后配置PLL倍增因子以获得所需的系统时钟频率。这通常通过修改RCC(复位与时钟控制)寄存器来完成,并可以在STM32CubeMX或标准外设库/HAL库中轻松设置。2. Q: 为什么STM32F103C8T6的
    发表于 11-18 15:14 0次下载

    【GD32 MCU 移植教程】9、 STM32F10x 系列移植 GD32F30x 系列

    对比、外设及性能对比以及 STM32F10x 移植 GD32F30x 的移植步骤,旨在让开发
    的头像 发表于 09-07 09:57 513次阅读
    【GD32 MCU <b class='flag-5'>移植</b>教程】9、<b class='flag-5'>从</b> <b class='flag-5'>STM32F</b>10x 系列<b class='flag-5'>移植</b><b class='flag-5'>到</b> GD32<b class='flag-5'>F</b>30x 系列

    STM32CUBEMX(7)--移植雅特力AT32F403AVGT(兼容STM32F103VGT6),DAC输出电压

    概述 本篇文章主要介绍如何使用STM32CubeMX移植雅特力AT32F403AVGT7,并通过DAC输出电压,在芯片中有2个12位的DAC口可以供选择。 硬件准备 首先需要准备一
    发表于 09-06 16:40

    【GD32 MCU 移植教程】8、 STM32F4xx 系列移植 GD32F4xx 系

    、外设及性能对比以及 STM32F4xx 移植 GD32F4xx 的移植步骤,旨在让开发者能
    的头像 发表于 09-06 09:40 968次阅读
    【GD32 MCU <b class='flag-5'>移植</b>教程】8、<b class='flag-5'>从</b> <b class='flag-5'>STM32F</b>4xx 系列<b class='flag-5'>移植</b><b class='flag-5'>到</b> GD32<b class='flag-5'>F</b>4xx 系

    【GD32 MCU 移植教程】7、 GD32F10x 移植 GD32E103

    本应用笔记旨在帮助您快速将基于 GD32F10x 2.0 版本及以上固件库开发的应用程序GD32F10x 系列微控制器移植
    的头像 发表于 09-05 09:40 414次阅读
    【GD32 MCU <b class='flag-5'>移植</b>教程】7、<b class='flag-5'>从</b> GD32<b class='flag-5'>F</b>10x <b class='flag-5'>移植</b><b class='flag-5'>到</b> GD32E<b class='flag-5'>103</b>

    STM32F103xC,STM32F103xD,STM32F103xE中文资料

    电子发烧友网站提供《STM32F103xC,STM32F103xD,STM32F103xE中文资料.pdf》资料免费下载
    发表于 06-17 14:12 1次下载

    STM32F103能用U盘升级固件吗?

    STM32F103 能用U盘升级固件吗,如果有大侠用过,给指导一下操作方法
    发表于 04-12 07:46

    STM32F407的程序移植STM32F103的芯片上面,需要修改哪些内容?

    STM32F407的程序移植STM32F103的芯片上面,需要修改哪些内容?
    发表于 04-10 07:38

    如何把stm32F103程序移植stm32g030k6t6上?

    怎么把stm32F103程序移植stm32g030k6t6上
    发表于 04-03 07:57

    STM32F103如何使用BOOT下载程序

    STM32F103如何使用BOOT下载程序
    发表于 03-15 07:21

    ARM系列STM32F103芯片的解密方法

    本文介绍ARM系列STM32F103芯片的解密方法,其内核是Cortex-M3,内存16K-512K都有。
    发表于 02-28 11:20 1563次阅读

    stm32f103 flash模拟eeprom

    STM32F103是意法半导体(STMicroelectronics)推出的一款32位单片机系列,该系列芯片具有高性能和丰富的外设接口,广泛应用于工业控制、消费电子、汽车电子等领域。其中
    的头像 发表于 01-09 11:21 1888次阅读

    在GD32F103移植STM32F103代码

    使用相同FLASH和管脚数量相同的芯片,例如GDF103C8T6移植STM32F103C8T6程序。虽然两个款芯片的寄存器地址以及架构基本相同。但是需要注意的是GD32
    的头像 发表于 12-15 13:37 1586次阅读
    在GD32<b class='flag-5'>F103</b><b class='flag-5'>移植</b><b class='flag-5'>STM32F103</b>代码

    gd32f103可以完全替代stm32f103

    GD32F103是中国厂商GigaDevice推出的一款低成本、高性能的微控制器产品线。STM32F103是意法半导体(STMicroelectronics)的旗舰产品之一,享有良好的声誉和广泛
    的头像 发表于 12-07 11:26 4981次阅读

    基于STM32F103的直流电机pid调节闭环控制

    基于STM32F103的直流电机pid调节的闭环控制,主要模块:NOKIA5110显示屏红外测速模块
    发表于 11-27 16:50 8次下载