色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    17123

    瀏覽量

    350996
  • STM32
    +關注

    關注

    2270

    文章

    10895

    瀏覽量

    355751
收藏 人收藏

    評論

    相關推薦

    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 ?681次閱讀
    【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 ?1244次閱讀
    【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 ?505次閱讀
    【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>

    STM32F103無法下載程序的原因?

    STM32F103無法下載程序
    發表于 07-09 06:24

    STM32F103xC,STM32F103xD,STM32F103xE中文資料

    電子發燒友網站提供《STM32F103xC,STM32F103xD,STM32F103xE中文資料.pdf》資料免費下載
    發表于 06-17 14:12 ?3次下載

    stm32f103能超多少頻率,是否穩定?

    誰超頻使用過stm32f103系列的片子,能超多少頻率,是否穩定?
    發表于 05-09 07:35

    程序STM32L151C8T6移植STM32F103C8T6需要注意些什么?

    請問程序STM32L151C8T6移植STM32F103C8T6需要注意些什么?
    發表于 04-15 06:06

    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 ?1679次閱讀

    stm32f103 flash模擬eeprom

    STM32F103是意法半導體(STMicroelectronics)推出的一款32位單片機系列,該系列芯片具有高性能和豐富的外設接口,廣泛應用于工業控制、消費電子、汽車電子等領域。其中
    的頭像 發表于 01-09 11:21 ?2027次閱讀
    主站蜘蛛池模板: 福利片午夜| 小小水蜜桃3视频在线观看| 啪啪后入内射日韩| 秋霞电影伦网理最新在线看片| 全彩黄漫火影忍者纲手无遮挡| 日本无码欧美激情在线视频| 天龙八部慕容属性加点| 亚洲国产成人久久精品影视 | 乱码午夜-极品国产内射| 久久婷婷久久一区二区三区 | 欧美性极品黑人hd| 深夜释放自己污在线看| 亚洲粉嫩美白在线| 中字幕视频在线永久在线 | 99久久免费国内精品| 成3d漫二区三区四区| 国产女高清在线看免费观看| 精品手机在线1卡二卡3卡四卡| 美女伸开两腿让我爽| 日本高清无吗| 亚洲黄色三级视频| 99久久国产宗和精品1上映| 国产XXXXXX农村野外| 精品一卡2卡三卡4卡乱码精品视频| 蜜芽无码亚洲资源网站| 神马电影院午夜神福利在线观看| 亚洲三级在线视频| jiucao在线观看精品| 国产永久免费高清在线观看| 毛片大全网站| 午夜特级毛片| 99精品久久精品一区二区| 国产伦精品一区二区三区| 免费精品国产人妻国语麻豆| 特级黑人三人共一女| 综合久久久久久久综合网| 国产AV无码熟妇人妻麻豆 | 国产午夜亚洲精品区| 免费A级毛片无码鲁大师| 无码日韩人妻精品久久蜜桃入口| 中文字幕在线播放视频|