AT32 USB設備協議庫
這部分主要介紹AT32 USB設備庫的結構和庫的使用方法,AT32 USB是基于USB2.0全速設備,不支持USB2.0高速設備。這里庫的作用是用來管理USB外設和實現USB的基本協議,使開發者能夠更快的上手開發。USB Deivce庫包含以下幾個模塊如圖1:-
用戶應用程序
此部分為開發者根據應用具體需求開發應用程序。
-
USB Core Driver和USB設備類
USB Core Driver:此部分實現USB設備標準協議棧,標準請求等接口。
USB設備類:此部分實現一個具體USB設備的描述和設備請求。
-
USB硬件底層接口
此部分實現硬件寄存器抽象接口
-
USB/OTG外設

AT32 USB庫文件
如下是AT32 USB應用工程結構圖:圖2. AT32工程結構


USB設備庫文件說明
USB庫實現USB設備標準請求,同時實現USB規格里面的4種傳輸類型(control,interrupt,bulk,isochronous)的函數接口。圖3.USB庫文件結構
USB設備文件函數接口
usbd_int.c函數接口usbd_int.c主要處理底層中斷,不同USB外設,此部分會根據外設不同而有所改變。AT32系列芯片USB外設存在USBFS和OTGFS兩種外設,此部分函數接口基本相同。表3.usbd_int函數接口








-
默認狀態
-
地址狀態
-
配置狀態
-
掛起狀態


端點FIFO分配
USB要正常收發數據,在初始化時需要為每個端點分配發送/接收的FIFO,FIFO的大小可以根據端點上傳輸的最大包長度確認。注意,分配給所有端點FIFO大小的和不能超過系統分配給USB緩沖區的最大長度,具體USB的緩沖區大小參考RM上的描述。開發者可以參考例程usb_conf.h為每個端點自定義分配FIFO。另外使用USBFS和OTGFS兩種不同的外設時,usb_conf.h中對端點FIFO分配稍有不同。 USBFS外設端點FIFO分配USBFS外設端點分配實現了兩種分配方式,一種自動分配,一種是用戶自定義分配。-
自動分配:
1. 通過打開usb_conf.h中USB_EPT_AUTO_MALLOC_BUFFER宏開啟自動分配功能
2. 在調用打開端點函數(usbd_ept_open)時自動根據傳入的最大包長度自動分配FIFO
3. 如果使用雙緩沖模式(同步端點,雙緩沖Bulk)時,在打開端點前先調用(usbd_ept_dbuffer_enable)表示使用雙緩沖模式,可參考audio例程。
4. 自動分配audio例程配置如下:
usb_conf.h
audio_class.c:端點打開
-
自定義分配:
1. 關閉usb_conf.h中USB_EPT_AUTO_MALLOC_BUFFER宏開啟自定義分配
2. 在調用打開端點函數(usbd_ept_open)時調用usbd_ept_buf_custom_define函數自定義為端點分配FIFO,參考vcp_loopback例程。
3. vcp_loopback例程自定義分配配置
usb_conf.h:
cdc_class.c端點打開:

USB設備初始化
在使用USB時,需要對USB的寄存器做一些基本的初始化,通過調用USB的初始化函數完成這部分的操作,對于外設USBFS和OTGFS在初始化時所調用的函數一定的區別。 USBFS外設初始化USBFS初始化函數usbd_core_init包含5個參數:


USB設備中斷處理
USB中斷入口函數usbd_irq_handler處理所有USB中斷,包括Reset,端點收發數據,SOF,掛起,喚醒等中斷,下面介紹一些典型的中斷處理。圖7.USB中斷處理函數
-
端點FIFO初始化
-
設備地址設置為0
-
端點0初始化
-
調用設備類的事件函數
udev->class_handler->event_handler(udev, USBD_RESET_EVENT);
-
中斷處理函數會調用設備類的SOF處理函數
udev->class_handler->sof_handler(udev);
-
連接狀態設置為掛起狀態
-
設置設備進入掛起狀態
-
調用設備類的事件處理函數
udev->class_handler->event_handler(udev, USBD_SUSPEND_EVENT);
-
設備退出掛起狀態
-
連接狀態設置為進入掛起之前的狀態
-
調用設備類事件處理函數
udev->class_handler->event_handler(udev, USBD_WAKEUP_EVENT);
USB設備端點數據處理流程
USB設備在收到主機發送的數據包之后,對應端點0的數據(IN/OUT/SETUP)會做單獨處理,其它端點的數據會調用設備類的IN/OUT handler進行數據處理。如下圖所示數據的處理過程:圖8.端點數據處理流程







USB設備類型例程
本章將說明使用AT32 USB設備庫實現不同的設備類型的例程。目前實現的設備例程如下:-
Audio
-
custom_hid
-
keyboard
-
mouse
-
msc(mass strorage)
-
printer
-
vcp_loopback
-
virtual_msc_iap
-
composite_vcp_keyboard
-
hid_iap
Audio例程
Audio例程使用audio V1.0的協議實現一個Speaker和Microphone,傳輸Audio數據使用同步傳輸,Speaker使用同步OUT傳輸,Microphone使用同步IN傳輸。Audio的例程運行在AT-START評估板上,Audio Speaker和Mircophone是基于Audio Arduino Demo Board進行實現,實驗過程中需要連接AT-START和Audio Arduino Board,更多開發板信息請參考《UM_Audio Arduino Daughter Board_V1.0/V2.0》,Audio協議請參數《Universal Serial Bus Device Class Define for Audio Device V1.0》。 實現功能實現一個Speaker和Microphone的Audio復合設備,可以同時進行音頻播放和錄音。Speaker功能:-
支持16K,48K采樣率
-
支持采樣率切換
-
支持16bit采樣
-
支持靜音
-
支持音量調節
-
支持feedback功能
-
支持雙通道
-
支持16K,48K采樣率
-
支持采樣率切換
-
支持16bit采樣
-
支持靜音
-
支持音量調節
-
支持雙通道
-
端點0 IN/OUT:用于USB枚舉以及Audio部分控制。
-
端點1 IN:用于Microphone錄音數據
-
端點1 OUT:用于Speaker播放數據
-
端點2 IN:用于Feedback數據
-
使用I2C發送控制信息到音頻Board
-
使用I2S1發送數據到音頻board(speaker)
-
使用I2S2從音頻board接收數據(microphone)
-
使用DMA1通道3傳輸I2S1的數據
-
使用DMA1通道4傳輸I2S2的數據
-
使用TIMER產生Codec所需要的時鐘
-
Audio設備的描述(g_usbd_descriptor)
-
Audio設備的配置描述信息(g_usbd_configuration)
AC interface
Mricrophone Streaming interface
Microphone Terminal INPUT/OUTPUT
Microphone Feature Unit
Microphone Endpoint
Speaker Streaming interface
Speaker Terminal INPUT/OUTPUT
Speaker Feature Unit
Speaker Endpoint
Feedback Endpoint
-
Lang id (g_string_lang_id)
-
序列號(g_string_serial)
-
廠商產品ID(audio_desc.h)
-
制造商、產品名、配置描述、接口描述(audio_desc.h)
-
端點初始化(class_init_handler)
-
端點清除(class_clear_handler)
-
Audio控制請求(class_setup_handler)
實現如下audio控制請求:
-
Audio音量、靜音、采樣率設置(class_ept0_rx_handler)
此函數用于接收完主機發送的設置數據之后進行處理,包括設置音量,靜音,以及采樣率的設置。
-
Microphone和Feedback數據傳輸(class_in_handler)
-
Speaker數據接收(class_out_handler)
-
audio_codec.c中實現codec具體的控制以及數據處理,需要實現如下函數:
以上函數可根據例程里的方式進行實現,也可以根據開發者實際使用的codec來進行修改,對于codec的初始化部分,在這里將不再講述。
-
audio例程功能配置
audio_conf.h中可以對當前audio例程進行配置,例如:是否需要speaker功能,支持采樣率等,有如下選項配置:
-
根據功能需求修改audio配置(audio_conf.h)
-
根據功能需求修改設備描述信息(audio_desc.c, audio_desc.h)
設備描述信息(g_usbd_descriptor)
設備配置描述信息(g_usbd_configuration)
其它描述
-
根據功能修改要使用端點(audio_class.c, audio_class.h)
端點定義(audio_class.h)
端點初始化(class_init_handler,class_clear_handler)
-
修改使用的Audio控制請求
控制請求修改(class_setup_handler)
控制請求設置處理(class_ept0_rx_handler)
-
Audio數據處理修改
IN數據處理(class_in_handler)
OUT數據處理(class_out_handler)
-
根據需求修改端點FIFO大小分配(usb_conf.h)
-
根據具體需求實現codec函數接口(audio_codec.c)
custom_hid例程
custom_hid實現一個HID(human interface device)功能,與上位機(Artery_UsbHid_Demo)通信完成一些簡單的交互操作,HID使用中斷傳輸與上位機通信,例程在AT-START開發板上運行,上位機可在官網下載,關于HID協議參考《Human Interface Devices (HID) V1.11》。 實現功能-
上位機顯示按鍵狀態
-
通過上位機控制開發板LED等開關狀態
-
HID數據回環功能
-
端點0 IN/OUT:用于USB枚舉
-
端點1 IN:用于數據發送
-
端點1 OUT:用于數據接收
-
custom hid設備描述(g_usbd_descriptor)
-
custom hid設備配置描述(g_usbd_configuration)
HID interface
HID Endpoint
-
custom hid report描述(g_usbd_hid_report)
HID_REPORT_ID_2(LED2)
HID_REPORT_ID_3(LED3)
HID_REPORT_ID_4(LED4)
HID_REPORT_ID_5(BUTTON)
HID_REPORT_ID_6(LOOPBACK DATA)
-
Lang id(g_string_lang_id)
-
序列號(g_string_serial)
-
廠商產品ID(custom_hid_desc.h
-
制造商、產品名、配置描述、接口描述(custom_hid_desc.h)
-
端點初始化(class_init_handler)
-
端點清除(class_clear_handler)
-
HID設備類請求(class_setup_handler)
實現如下請求:
SET_PROTOCOL
GET_PROTOCOL
SET_IDLE
GET_IDLE
SET_REPORT
代碼如下:
-
Custom_HID發送數據
-
Custom_HID接收數據
-
數據處理
-
根據功能需求修改設備描述信息(custom_hid_desc.c, custom_hid_desc.h)
設備描述信息(g_usbd_descriptor)
設備配置描述信息(g_usbd_configuration)
設備報告描述符(g_usbd_hid_report)
其它描述
-
根據功能修改要使用端點(custom_hid_class.c, custom_hid_class.h)
端點定義(custom_hid_class.h)
端點初始化(class_init_handler,class_clear_handler)
-
修改使用的custom_hid控制請求
控制請求修改(class_setup_handler)
控制請求設置處理(class_ept0_rx_handler)
-
custom_hid發送接收數據處理修改
IN數據處理(class_in_handler)
OUT數據處理(class_out_handler)
-
根據需求修改端點FIFO大小分配(usb_conf.h)
-
修改數據處理部分
keyboard例程
keyboard實現一個鍵盤功能,使用中斷傳輸與上位機通信,例程在AT-START開發板上運行,通過按鍵發送字符串到主機。 實現功能-
通過按鍵發送字符串(”Keyboard Demo”)到主機
-
端點0 IN/OUT:用于USB枚舉
-
端點1 IN:用于數據發送
-
keyboard設備描述(g_usbd_descriptor)
-
keyboard設備配置描述(g_usbd_configuration)
keyboard interface
keyboard endpoint
-
keyboard report描述(g_usbd_hid_report)
-
Lang id(g_string_lang_id)
-
序列號(g_string_serial)
-
廠商產品ID(keyboard_desc.h)
-
制造商、產品名、配置描述、接口描述(keyboard_desc.h)
-
端點初始化(class_init_handler)
-
端點清除(class_clear_handler)
-
HID設備類請求(class_setup_handler)
實現如下請求:
SET_PROTOCOL
GET_PROTOCOL
SET_IDLE
GET_IDLE
SET_REPORT
-
keyboard發送數據
-
keyboard字符數據處理
-
根據功能需求修改設備描述信息(keyboard_desc.c, keyboard_desc.h)
設備描述信息(g_usbd_descriptor)
設備配置描述信息(g_usbd_configuration)
設備報告描述符(g_usbd_hid_report)
其它描述
-
根據功能修改要使用端點(keyboard_class.c, keyboard_class.h)
端點定義(keyboard_class.h)
端點初始化(class_init_handler,class_clear_handler)
-
修改使用的keyboard控制請求
控制請求修改(class_setup_handler)
控制請求設置處理(class_ept0_rx_handler)
-
keyboard發送接收數據處理修改
IN數據處理(class_in_handler)
OUT數據處理(class_out_handler)
-
根據需求修改端點FIFO大小分配(usb_conf.h)
-
修改數據處理部分
Mouse例程
實現功能mouse實現一個簡單的鼠標功能,使用中斷傳輸與上位機通信,例程在AT-START開發板上運行,通過開發板上的按鍵發送鼠標右鍵功能。圖16.鼠標傳輸格式
-
端點0 IN/OUT:用于USB枚舉
-
端點1 IN:用于數據發送
-
mouse設備描述(g_usbd_descriptor)
-
mouse設備配置描述(g_usbd_configuration)
mouseinterface
mouseendpoint
-
mouse report描述(g_usbd_hid_report)
-
Lang id(g_string_lang_id)
-
序列號(g_string_serial)
-
廠商產品ID(mouse_desc.h)
-
制造商、產品名、配置描述、接口描述(keyboard_desc.h)
-
端點初始化(class_init_handler)
-
端點清除(class_clear_handler)
-
HID設備類請求(class_setup_handler)
實現如下請求:
SET_PROTOCOL
GET_PROTOCOL
SET_IDLE
GET_IDLE
SET_REPORT
-
keyboard發送數據
-
mouse數據處理
-
根據功能需求修改設備描述信息(mouse_desc.c, mouse_desc.h)
設備描述信息(g_usbd_descriptor)
設備配置描述信息(g_usbd_configuration)
設備報告描述符(g_usbd_hid_report)
其它描述
-
根據功能修改要使用端點(mouse_class.c, mouse_class.h)
端點定義(mouse_class.h)
端點初始化(class_init_handler,class_clear_handler)
-
修改使用的mouse控制請求
控制請求修改(class_setup_handler)
控制請求設置處理(class_ept0_rx_handler)
-
mouse發送接收數據處理修改
IN數據處理(class_in_handler)
OUT數據處理(class_out_handler)
-
根據需求修改端點FIFO大小分配(usb_conf.h)
-
修改數據處理部分
msc例程
msc(mass storage)例程展示如何通過USB BULK傳輸,進行PC主機和AT-START通信,該例程支持BOT(Bulk only transfer)協議和SCSI(small computer system interface)指令。圖17. BOT 命令/數據/狀態 流程


-
將內部FLASH虛擬成一個磁盤
-
實現bulk-only傳輸協議
-
實現subclass SCSI傳輸命令
MSC_CMD_INQUIRY
MSC_CMD_START_STOP
MSC_CMD_MODE_SENSE6
MSC_CMD_MODE_SENSE10
MSC_CMD_ALLOW_MEDIUM_REMOVAL
MSC_CMD_READ_10
MSC_CMD_READ_CAPACITY
MSC_CMD_REQUEST_SENSE
MSC_CMD_TEST_UNIT
MSC_CMD_VERIFY
MSC_CMD_WRITE_10
MSC_CMD_READ_FORMAT_CAPACITY
-
端點0 IN/OUT:用于USB枚舉
-
端點1 IN:用于數據發送
-
端點1 OUT:用于數據接收
-
msc設備描述(g_usbd_descriptor)
-
msc設備配置描述(g_usbd_configuration)
msc interface
msc endpoint
-
Lang id(g_string_lang_id)
-
序列號(g_string_serial)
-
廠商產品ID(custom_hid_desc.h)
-
制造商、產品名、配置描述、接口描述(msc_desc.h)
-
端點初始化(class_init_handler)
-
端點清除(class_clear_handler)
-
MSC設備請求(class_setup_handler)
GET_MAX_LUN
BO_RESET
代碼如下:
-
IN傳輸處理
-
OUT傳輸處理(接收數據)



-
根據功能需求修改設備描述信息(msc_desc.c, msc_desc.h)
設備描述信息(g_usbd_descriptor)
設備配置描述信息(g_usbd_configuration)
其它描述
-
根據功能修改要使用端點(msc_class.c, msc_class.h)
端點定義(msc_class.h)
端點初始化(class_init_handler,class_clear_handler)
-
修改使用的msc控制請求
控制請求修改(class_setup_handler)
控制請求設置處理(class_ept0_rx_handler)
-
msc發送接收數據處理修改
IN數據處理(class_in_handler)
OUT數據處理(class_out_handler)
-
根據需求修改端點FIFO大小分配(usb_conf.h)
-
修改diskio部分,實現表13里面的函數(msc_diskio.c/h)
printer例程
Printer例程展示了使用USB Device作為打印機設備,此demo可在PC端識別到一個打印機設備并且可應答PC端發送的關于printer類的狀態請求命令(例如打印機的有紙/無紙狀態) 實現功能-
實現一個打印機設備
-
端點0 IN/OUT:用于USB枚舉
-
端點1 IN:用于數據發送
-
端點1 OUT:用于數據接收
-
printer設備描述(g_usbd_descriptor)
-
printer設備配置描述(g_usbd_configuration)
printer interface
printer endpoint
-
Lang id(g_string_lang_id)
-
序列號(g_string_serial)
-
廠商產品ID(custom_hid_desc.h)
-
制造商、產品名、配置描述、接口描述(msc_desc.h)
-
端點初始化(class_init_handler)
-
端點清除(class_clear_handler)
-
printer設備請求(class_setup_handler)
GET_DEVICE_ID
PORT_STATUS
SOFT_RESET
代碼如下:
-
IN傳輸處理
-
OUT傳輸處理(接收數據)
-
根據功能需求修改設備描述信息(printer_desc.c, printer_desc.h)
設備描述信息(g_usbd_descriptor)
設備配置描述信息(g_usbd_configuration)
其它描述
-
根據功能修改要使用端點(printer_class.c, printer_class.h)
端點定義(printer_class.h)
端點初始化(class_init_handler,class_clear_handler)
-
修改使用的printer控制請求
控制請求修改(class_setup_handler)
控制請求設置處理(class_ept0_rx_handler)
-
printer發送接收數據處理修改
IN數據處理(class_in_handler)
OUT數據處理(class_out_handler)
-
根據需求修改端點FIFO大小分配(usb_conf.h)
vcp loopback例程
在現代PC中,USB是和絕大部分外設通信的標準接口。盡管如此,大部分的工業軟件依舊使用COM接口(UART)通信。vcp_loopback例程提供使用USB設備模擬COM接口方法,解決了該問題, vcp_loopback例程展示了如何通過CDC協議進行USB數據收發。改例程需要使用虛擬串口驅動,可在官網下載。 實現功能-
實現一個虛擬串口
-
端點0 IN/OUT:用于USB枚舉
-
端點1 IN:用于數據發送
-
端點1 OUT:用于數據接收
-
端點2 IN:監控中斷傳輸
-
cdc設備描述(g_usbd_descriptor)
-
cdc設備配置描述(g_usbd_configuration)
cdc interface
cdc endpoint
-
Lang id(g_string_lang_id)
-
序列號(g_string_serial)
-
廠商產品ID(custom_hid_desc.h)
-
制造商、產品名、配置描述、接口描述(msc_desc.h)
-
端點初始化(class_init_handler)
-
端點清除(class_clear_handler)
-
cdc設備請求(class_setup_handler)
SET_LINE_CODING
GET_LINE_CODING
代碼如下:
-
IN傳輸處理
-
OUT傳輸處理(接收數據)
-
根據功能需求修改設備描述信息(cdc_desc.c, cdc_desc.h)
設備描述信息(g_usbd_descriptor)
設備配置描述信息(g_usbd_configuration)
其它描述
-
根據功能修改要使用端點(cdc_class.c, cdc_class.h)
端點定義(cdc_class.h)
端點初始化(class_init_handler,class_clear_handler)
-
修改使用的cdc控制請求
控制請求修改(class_setup_handler)
控制請求設置處理(class_ept0_rx_handler)
-
cdc發送接收數據處理修改
IN數據處理(class_in_handler)
OUT數據處理(class_out_handler)
-
根據需求修改端點FIFO大小分配(usb_conf.h)
virtual_msc_iap例程
virtual msc iap實現一個升級功能的設備,不依賴上位機,當接入PC之后,通過將固件拷貝到磁盤以達到升級目的。 實現功能-
將flash虛擬成磁盤進行升級
-
Iap保留使用20K byte空間
-
升級完成之后reset usb設備返回升級狀態
-
支持下載地址設置
-
支持升級完成之后跳轉到APP運行
-
支持bin文件升級
-
端點0 IN/OUT:用于USB枚舉
-
端點1 IN:用于數據發送
-
端點1 OUT:用于數據接收
-
升級狀態
當連接Host之后,在響應磁盤上通過TXT文檔顯示當前狀態
準備升級狀態(Ready.TXT)
升級成功(Success.TXT)
升級失敗(Failed.TXT)
未知文件或錯誤(Unkonwn.TXT)
升級文件大于FLASH大小(Large.TXT)
-
FAT16分區表描述
-
升級接口函數
- 根據功能需求修改設備描述信息(msc_desc.c, msc_desc.h)設備描述信息(g_usbd_descriptor)設備配置描述信息(g_usbd_configuration)其它描述
- 根據功能修改要使用端點(msc_class.c, msc_class.h)端點定義(msc_class.h)端點初始化(class_init_handler,class_clear_handler)
- 修改使用的msc控制請求控制請求修改(class_setup_handler)控制請求設置處理(class_ept0_rx_handler)
- msc發送接收數據處理修改IN數據處理(class_in_handler)OUT數據處理(class_out_handler)
- 根據需求修改端點FIFO大小分配(usb_conf.h)
- 修改diskio部分,實現表13里面的函數(msc_diskio.c/h)
- 修改flash_fat16.c/h升級參數,包括APP起始地址,IAP占用空間等,要保證IAP和APP地址不重合。
composive_vcp_keyboard例程
復合設備定義如下:擁有多個相互獨立接口的設備被稱為復合設備。當使用該設備時,該設備上擁有多個組合的功能。例如,Composite vcp keyboard demo 提供的復合設備包含HID和CDC功能(鍵盤和串口通信) 實現功能- 實現一個USB虛擬串口(參考3.7)
- 實現一個USB鍵盤設備(參考3.3)
- 端點0 IN/OUT:用于USB枚舉
- 端點1 IN:用于數據發送
- 端點1 OUT:用于數據接收
- 端點2 IN:CDC命令中斷傳輸
- 端點3 IN:Keyboard發送數據
- cdc_keyboard設備描述(g_usbd_descriptor)
- cdc_keyboard設備配置描述(g_usbd_configuration)cdc interfacecdc endpointkeyboard interfacekeyboard endpoint
- Lang id(g_string_lang_id)
- 序列號(g_string_serial)
-
廠商產品ID(custom_hid_desc.h)
-
制造商、產品名、配置描述、接口描述(msc_desc.h)
-
端點初始化(class_init_handler)
-
端點清除(class_clear_handler)
-
設備請求(class_setup_handler)cdc設備類請求:SET_LINE_CODINGGET_LINE_CODIN
Keyboard hid設備類請求:
SET_PROTOCOLGET_PROTOCOLSET_IDLEGET_IDLESET_REPORT代碼如下:
-
IN傳輸處理
-
OUT傳輸處理(接收數據)
- 根據功能需求修改設備描述信息(cdc_keyboard_desc.c, cdc_keyboard_desc.h)設備描述信息(g_usbd_descriptor)設備配置描述信息(g_usbd_configuration)其它描述
- 根據功能修改要使用端點(cdc_keyboard_class.c, cdc_keyboard_class.h)端點定義(cdc_class.h)端點初始化(class_init_handler,class_clear_handler)
- 修改使用的cdc控制請求控制請求修改(class_setup_handler)控制請求設置處理(class_ept0_rx_handler)
- cdc_keyboard發送接收數據處理修改IN數據處理(class_in_handler)OUT數據處理(class_out_handler)
- 根據需求修改端點FIFO大小分配(usb_conf.h)
hid_iap例程
hid_iap例程使用usb hid實現IAP升級功能,需要搭配上位機使用,上位機可在官網下載IAP_Programmer。hid iap的例程代碼位于BSP固件庫utilitiesat32f435_437_usb_iap_demo中,使用方法可參考《AN0007_AT32_IAP_using_the_USB_HID_ZH_V2.x.x.pdf》 1. 實現功能- 實現使用HID進行設備升級
- 端點0 IN/OUT:用于USB枚舉
- 端點1 IN:用于數據發送
- 端點1 OUT:用于數據接收
- hid iap設備描述(g_usbd_descriptor)
- hid iap設備配置描述(g_usbd_configuration)HID interfaceHID Endpoint
- hid iap report描述(g_usbd_hid_report)
- Lang id(g_string_lang_id)
- 序列號(g_string_serial)
-
廠商產品ID(hid_iap_desc.h)
-
制造商、產品名、配置描述、接口描述(hid_iap_desc.h)
-
端點初始化(class_init_handler)
-
端點清除(class_clear_handler)
-
HID設備類請求(class_setup_handler)實現如下請求:SET_PROTOCOLGET_PROTOCOLSET_IDLEGET_IDLESET_REPORT代碼如下:
-
hid iap發送數據
-
hid iap接收數據
-
升級命令數據處理

-
0x5AA0進入IAP模式
作為一個特定的命令,當用戶APP收到這個命令之后將進入IAP模式。實現方式為收到這個命令之后擦除flag然后reset
上位機:[0x5A, 0xA0]
IAP設備響應:[0x5A, 0XA0, ACK/NACK]
-
0x5AA1開始下載
上位機:[0x5A,0xA1]
IAP設備響應:[0x5A,0xA1,ACK/NACK]
-
0x5AA2設置下載地址
設置下載地址需按照1KB對齊,每下載1Kbyte數據之后,都需要重新設置下載地址。
上位機(命令+地址):[0x5A, 0xA2, 0x08, 0x00, 0x40, 0x00]
IAP設備響應:[0x5A,0xA2, ACK/NACK]
-
0x5AA3下載數據命令(1KB 對齊多個包發送)
下載數據命令采用命令+長度+數據的格式進行發送,每包最大數據量為60Byte(64–命令–長度),當發送數據達到1KB時,上位機需要等待設備的ACK響應。此時設備需將1KB的數據寫到FLASH。
上位機(命令(2Byte)+長度(2 Byte)+數據(n byte)):[0x5A,0xA3,LEN1,LEN0,DATA0….DATAn]
收完1KB數據后IAP設備響應:[0x5A, 0XA3, ACK/NACK]
-
0x5AA4下載結束
上位機:[0x5A, 0xA4]
IAP設備響應:[0x5A, 0xA4, ACK/NACK]
-
0x5AA5固件CRC校驗
上位機傳輸固件起始地址和固件大小/1KB(固件大小按1KB對齊,不足補0xFF),由IAP計算CRC之后返回給上位機。
上位機:[0x5A,0xA5, 0x08, 0x00, 0x40, 0x00, LEN1, LEN0]
IAP設備響應: [0x5A, 0xA5, ACK/NACK, CRC3, CRC2, CRC1, CRC0]
-
0x5AA6跳轉命令
跳轉命令將跳轉到用戶代碼進行運行
上位機:[0x5A,0xA6, 0x08, 0x00, 0x40, 0x00]
IAP設備響應:[0x5A,0xA6,ACK/NACK]
-
0x5AA7獲取IAP設置的app地址
返回IAP設置的app地址
上位機:[0x5A, 0xA7]
IAP設備響應:[0x5A, 0xA7, ACK/NACK, 0x08, 0x00, 0x40, 0x00]
- 根據功能需求修改設備描述信息(hid_iap_desc.c, hid_iap_desc.h)設備描述信息(g_usbd_descriptor)設備配置描述信息(g_usbd_configuration)其它描述
- 根據功能修改要使用端點(hid_iap_class.c, hid_iap_class.h)端點定義(hid_iap_class.h)端點初始化(class_init_handler,class_clear_handler)
- 修改使用的hid控制請求控制請求修改(class_setup_handler)控制請求設置處理(class_ept0_rx_handler)
- hid_iap發送接收數據處理修改IN數據處理(class_in_handler)OUT數據處理(class_out_handler)
- 根據需求修改端點FIFO大小分配(usb_conf.h)
- 修改hid_iap_user.h中的升級參數,包括APP起始地址等,IAP占用空間等,保證APP地址和IAP的地址不要重合。
-
mcu
+關注
關注
146文章
17956瀏覽量
365907 -
usb
+關注
關注
60文章
8173瀏覽量
272451 -
雅特力
+關注
關注
0文章
179瀏覽量
8559 -
AT32
+關注
關注
1文章
121瀏覽量
2693
原文標題:AT32講堂046 | 雅特力AT32 MCU USB設備庫的架構和使用方法
文章出處:【微信號:AT32 MCU 雅特力科技,微信公眾號:AT32 MCU 雅特力科技】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
在AT32系列MCU上Flash模擬EEPRO的應用原理和使用方法
AT32 MCU USB主機庫應用說明
AT32 MCU USB設備庫應用說明
雅特力攜高效能AT32 MCU“芯”動亮相ICCAD 2020
雅特力攜高性能AT32 MCU精彩亮相D Forum 2021 微控制器論壇

雅特力展臺首日速遞,AT32 MCU精彩亮相

評論