电子发烧友网>今日头条> > 正文

从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的控制可省略。

审核编辑:符乾江

下载发烧友APP

打造属于您的人脉电子圈

关注电子发烧友微信

有趣有料的资讯及技术干货

关注发烧友课堂

锁定最新课程活动及技术直播

电子发烧友观察

一线报道 · 深度观察 · 最新资讯
收藏 人收藏
分享:

评论

相关推荐

2022中国MCU产业发展高峰论坛暨航顺HK32...

12月24日,航顺芯片在深圳市大中华喜来登酒店成功举办2022中国MCU产业发展高峰论坛暨航顺HK3....
发表于 2021-12-28 11:03 11次阅读
2022中国MCU产业发展高峰论坛暨航顺HK32...

爱普特袁永生:2021年32位RISC-V MC...

岁末年初之际,电子发烧友网策划的《2022半导体产业展望》专题,收到超过60位国内外半导体创新领袖企....
发表于 2021-12-27 15:56 149次阅读
爱普特袁永生:2021年32位RISC-V MC...

IAR Systems Kiyofumi Uem...

岁末年初之际,电子发烧友网策划的《2022半导体产业展望》专题,收到超过60位国内外半导体创新领袖企....
发表于 2021-12-27 15:47 113次阅读
IAR Systems Kiyofumi Uem...

雅特力黄呈俊:续开发高效能的MCU芯片,2022...

岁末年初之际,电子发烧友网策划的《2022半导体产业展望》专题,收到超过60位国内外半导体创新领袖企....
发表于 2021-12-27 14:32 106次阅读
雅特力黄呈俊:续开发高效能的MCU芯片,2022...

国民技术牟鑫慧:5G、AI、新能源汽车成为半导体...

岁末年初之际,电子发烧友网策划的《2022半导体产业展望》专题,收到超过60位国内外半导体创新领袖企....
发表于 2021-12-27 11:01 252次阅读
国民技术牟鑫慧:5G、AI、新能源汽车成为半导体...

领芯微刘柳洼:需求依旧强劲,半导体市场在十年内保...

领芯微刘柳洼 : 需求依旧强劲,半导体市场在十年内保持增长 岁末年初之际,电子发烧友网策划的《202....
发表于 2021-12-27 10:55 191次阅读
领芯微刘柳洼:需求依旧强劲,半导体市场在十年内保...

极海半导体曾豪 :赶上国产化高速列车,持续打造差...

岁末年初之际,电子发烧友网策划的《2022半导体产业展望》专题,收到超过60位国内外半导体创新领袖企....
发表于 2021-12-27 10:49 219次阅读
极海半导体曾豪 :赶上国产化高速列车,持续打造差...

中微半导体刘洋:国产MCU产能转向车规级和工业级...

岁末年初之际,电子发烧友网策划的《2022半导体产业展望》专题,收到超过60位国内外半导体创新领袖企....
发表于 2021-12-27 10:35 172次阅读
中微半导体刘洋:国产MCU产能转向车规级和工业级...

LPC552x/S2x微控制器(MCU)的主要特点是什么

LPC552x/S2x微控制器(MCU)的主要特点是什么?
发表于 2021-12-27 06:47 0次阅读
LPC552x/S2x微控制器(MCU)的主要特点是什么

芯片是做什么的

芯片代表的是半导体原件产品,也就是我们常说的集成电路
发表于 2021-12-25 16:58 316次阅读
芯片是做什么的

基于32位MCU的无刷电机筋膜枪方案

近两年来,筋膜枪在抖音等电商平台直播中叫座又叫好,成为大热门的“网红神器”。作为一种越来越流行的按摩....
发表于 2021-12-24 16:16 324次阅读
基于32位MCU的无刷电机筋膜枪方案

国产MCU迎来市场窗口期

来源: 中国电子报  今年,MCU是全球缺芯潮的重灾区。数据显示, 11月芯片整体交付周期已经达到2....
发表于 2021-12-24 13:52 64次阅读
国产MCU迎来市场窗口期

国民技术在通用MCU领域已量产12个系列共80余...

近日,以“砥砺匠心,集硅铸金”为主题,由中国半导体投资联盟主办,爱集微承办的“2022第三届中国半导....
发表于 2021-12-24 10:41 257次阅读
国民技术在通用MCU领域已量产12个系列共80余...

国民技术N32G455系列通用MCU累计具有超过...

以“链上中国芯 成就中国造”为主题,由中国电子信息产业发展研究院举办的第十六届“中国芯”集成电路产业....
发表于 2021-12-24 10:32 222次阅读
国民技术N32G455系列通用MCU累计具有超过...

怎样将数据从flash的缓存中读到MCU的函数呢

小型硬件系统固件该怎么写? 嵌入式操作系统增加了功耗怎么办? 怎样将数据从flash的缓存中读到MCU的函数呢? ...
发表于 2021-12-24 07:49 0次阅读
怎样将数据从flash的缓存中读到MCU的函数呢

MCU是怎样通过J-link与电脑连接并将打印信息输出到电脑上的

RTT是什么? MCU是怎样通过J-link与电脑连接并将打印信息输出到电脑上的? ...
发表于 2021-12-24 07:41 0次阅读
MCU是怎样通过J-link与电脑连接并将打印信息输出到电脑上的

如何利用MCU的PWM产生负电压呢

负电压的产生电路原理是什么? 单片机电子电路中常用的两种负电压产生电路分别是什么? 如何利用MCU的PWM产生...
发表于 2021-12-24 06:17 0次阅读
如何利用MCU的PWM产生负电压呢

IAR Embedded Workbench®集...

IAR Systems®日前宣布:其最新发布的IAR Embedded Workbench for ....
发表于 2021-12-23 14:08 512次阅读
IAR Embedded Workbench®集...

MSP430FR59471

MSP430FR59471 具有 32KB FRAM、1KB SRAM、AES、12 位 ADC、比....
发表于 2021-12-23 14:07 9次阅读
MSP430FR59471

怎样使用C++来编写Cortex-M系列MCU的程序呢

C++是什么?C++的特点有哪些呢? 怎样使用C++来编写Cortex-M系列MCU的程序呢? ...
发表于 2021-12-23 06:31 0次阅读
怎样使用C++来编写Cortex-M系列MCU的程序呢

汽车芯片是干什么用的

芯片代表的是半导体原件产品,也就是我们常说的集成电路,如果说手机芯片是这款手机的“大脑”的话,那么汽....
发表于 2021-12-22 10:35 274次阅读
汽车芯片是干什么用的

中国集成电路设计业2021年会暨无锡集成电路产业...

2021年12月22-23日, “中国集成电路设计业2021年会暨无锡集成电路产业创新发展高峰论坛”....
发表于 2021-12-22 10:26 525次阅读
中国集成电路设计业2021年会暨无锡集成电路产业...

在STOpen如何去实现一组软件定时器呢

在中低端MCU中,定时器的资源有限,经常会使用起来入不敷出,捉襟见肘。而且有时候不同的场景需要的定时时间不同,...
发表于 2021-12-22 08:15 0次阅读
在STOpen如何去实现一组软件定时器呢

意法半导体发布STEVAL-IOD04KT1工业...

以45.8mm x 8.3mm 的纤薄主板为亮点,意法半导体STEVAL-IOD04KT1工业传感器....
发表于 2021-12-21 15:11 257次阅读
意法半导体发布STEVAL-IOD04KT1工业...

如何设计准确的直流电源

在环境温度变化为±5°C时,设备的电流和电压控制精度需要优于满量程的±0.02%。精度在很大程度上取....
发表于 2021-12-21 14:22 751次阅读
如何设计准确的直流电源

十款创新国产RISC-V芯片产品亮相滴水湖论坛

首届滴水湖中国RISC-V产业论坛(简称“滴水湖论坛”)在上海临港滴水湖皇冠假日酒店成功召开,同时在....
发表于 2021-12-21 14:02 337次阅读
十款创新国产RISC-V芯片产品亮相滴水湖论坛

助力中国“芯”发展!国民技术N32G455系列通...

作为中国集成电路产品和技术发展的风向标,本届“中国芯”评选活动,是在工业和信息化部电子信息司指导下实....
发表于 2021-12-21 13:48 904次阅读
助力中国“芯”发展!国民技术N32G455系列通...

芯耀未来 智创共赢——万高V32系列MCU新品发...

2021年12月15日,杭州万高V32系列MCU新品发布会在深圳站如期举行,本届发布会以“芯耀未来,....
发表于 2021-12-21 10:02 177次阅读
芯耀未来 智创共赢——万高V32系列MCU新品发...

汽车智能化演进持续,头部企业再发新品拓展车用MC...

电子发烧友网报道(文/李诚)自缺芯潮以来汽车芯片供应吃紧,车用MCU也成为了缺芯潮的重灾区。车用MC....
发表于 2021-12-21 09:43 924次阅读
汽车智能化演进持续,头部企业再发新品拓展车用MC...

万高进军通用MCU市场只是开始吗

在芯片短缺的大背景下,供应端产能频频吃紧,MCU市场的缺口可以说是越拉越大。不少国内MCU厂商都开始....
发表于 2021-12-21 09:20 223次阅读
万高进军通用MCU市场只是开始吗

SOC、MCU工作不起来要检查哪些硬件问题

嵌入式软件工程师一般不考硬件题目,但是有一道题却是经常考的。SOC、MCU工作不起来要检查哪些硬件问题?答案:...
发表于 2021-12-21 07:43 0次阅读
SOC、MCU工作不起来要检查哪些硬件问题

什么是嵌入式

对嵌入式系统工程师及嵌入式硬件工程师而言,2020年将是振奋人心的一年。随着物联网应用的普及,MCU市场将再次繁荣...
发表于 2021-12-21 07:06 0次阅读
什么是嵌入式

MCU、DSP、GPU、MPU、CPU、DPU、FPGA、ASIC、SOC、ECU、NPU、TPU、VPU、APU、BPU、ECU、FPU、EPU、这些主控异同点有哪些?

MCU、DSP、GPU、MPU、CPU、DPU、FPGA、ASIC、SOC、ECU、NPU、TPU、VPU、A...
发表于 2021-12-17 17:07 776次阅读
MCU、DSP、GPU、MPU、CPU、DPU、FPGA、ASIC、SOC、ECU、NPU、TPU、VPU、APU、BPU、ECU、FPU、EPU、这些主控异同点有哪些?

如何实现MCU与NRF24L01通讯?

如何实现MCU与NRF24L01通讯?
发表于 2021-12-17 06:18 0次阅读
如何实现MCU与NRF24L01通讯?