STM32的USB 應用-1 大綱
STM32的USB 應用-1
2013年接了一個案子,是求做Keyboard 功能的案子,主要是將前端傳來的資料透過MCU以
Keyboard 的方法輸入到電腦端要求的程式上。所以必需針對整個LIB 功用了解,個人是用
JoyStickMouse 去修改,本篇先將個文件功能做一描述。
在 STM32_USB-FS-Device_Lib_V3.2.1\Libraries\STM32_USB-FS-Device_Driver\src
有一底層結構包括6個檔:usb_core.c(USB匯流排資料處理的核心檔),usb_init.c,usb_int.c(用於端點資料登錄輸入中斷處理),usb_mem.c(用於緩衝區操作),usb_regs.c(用於寄存器操作)usb_sil.c (USB 重置和設定所有中斷旗標)。
這個六個檔案在應用時是不會修改的,所以不是介紹重點。
主要要介紹的檔案的在ST的範例程式庫中 STM32_USB-FS-Device_Lib_V3.2.1\Project\JoyStickMouse\src 目錄下的組檔。這些檔案hw_config.c、usb_desc.c、usb_endp.c、usb_istr.c、usb_prop.c、usb_pwr.c幾個檔組成。其中usb_istr.c和usb_pwr.c整兩個檔不用修改,其他的檔都需要修改。
由於一開始入門研究是以Custom_HID為主所以以下文件說明是Custom_HID 為例
一、usb_desc.c文件
根據程式使用的通信方式修改。usb_desc.h檔中定義要根據usb_desc.c檔中的陣列的大 小;ConfigDescriptor[SIZ_CONFIG_DESC]下添加需要處理的端點;根據需要添加或刪除報告描述符(主要用於HID)和 CDC介面描述符等,這份文件必需十分了解才可以。
二、hw_config.c用於USB 設備的配置。這個和usb_desc.c未來會詳加說明。
Set_System :這個是函數是首先調用的函數,它的主要功能是初始化時鐘系統、使能相關的週邊設備電源。
Set_USBClock :這個是函數是 位於hw_config.c文件中,它的功能是配置和使能USB時鐘。
USB_Interrupts_Config :這個是main函數中調用的第二個函數,它也位於hw_config.c文件中。主要功能是配置USB所用到的中斷。跟蹤到代碼中,主要設配置了USB低優先順序中斷和喚醒中斷,又有一個EXTI中斷功能未知。
USB_Cable_Config :Software Connection/Disconnection of USB Cable. 有些硬體會設計軟體連接USB,它是用來避免當USB Cable接入PC而MCU 的初始化未完成時,
而PC端的USB送來通訊要求,而MCU無法回應造成 PC端判定接入的USB裝置失敗。
Get_SerialNum ,IntToUnicode : 獲取設備序號,轉變為unicode字串
下面4個函數 如ST文件說明的,大如不會修改,所以不多加說明
Enter_LowPowerMode
Leave_LowPowerMode
GPIO_Configuration
EXTI_Configuration
三usb_prop.c文件
1、修改void XX_Reset(void)(如:void Joystick_Reset(void))
一般/* Initialize Endpoint 0 */的不用修改,如下為舉例說明端點1的初始化,其他埠原理一樣。
SetEPType(ENDP1, EP_INTERRUPT);//設置端點1類型
/*EP_BULK 批量端點
EP_CONTROL 控制端點
EP_ISOCHRNOUS 同步端點
EP_INTERRUPT 中斷端點*/
SetEPTxAddr(ENDP1, ENDP1_TXADDR); //設置端點1緩衝區基底位址
SetEPTxCount(ENDP1, 64);// 配置Tx 緩衝計數器
SetEPRxStatus(ENDP1, EP_RX_DIS);// //設置端點接收關閉
SetEPTxStatus(ENDP1, EP_TX_NAK);// //設置端點1發送不應答
/*
#define EP_RX_DIS (0x0000) // EndPoint RX DISabled 端點接收關閉
#define EP_RX_STALL (0x1000) // EndPoint RX STALLed 端點接收延遲
#define EP_RX_NAK (0x2000) // EndPoint RX NAKed 端點接收不應答
#define EP_RX_VALID (0x3000) // EndPoint RX VALID端點接收有效
#define EP_TX_DIS (0x0000) //EndPoint TX DISabled
#define EP_TX_STALL (0x0010) // EndPoint TX STALLed
#define EP_TX_NAK (0x0020) // EndPoint TX NAKed
#define EP_TX_VALID (0x0030) // EndPoint TX VALID */
2、刪除不相干的描述符等。
如自訂的USB設備就不需要以下結構體初始化:
ONE_DESCRIPTOR Joystick_Report_Descriptor
ONE_DESCRIPTOR Mouse_Hid_Descriptor
3、修改RESULT XX_Data_Setup(u8 RequestNo)的資料類請求處理。
如Custom_HID常式修改為“自訂USB設備”常式時可以將以下代碼刪除
if ((RequestNo == GET_DESCRIPTOR)
&& (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))
&& (pInformation->USBwIndex0 == 0))
{
if (pInformation->USBwValue1 == REPORT_DESCRIPTOR)
{
CopyRoutine = Joystick_GetReportDescriptor;
}
else if (pInformation->USBwValue1 == HID_DESCRIPTOR_TYPE)
{
CopyRoutine = Joystick_GetHIDDescriptor;
}
}
4、刪除不相干的獲得描述符返回函數
如自訂的USB設備就不需要以下函數:
Joystick_GetReportDescriptor
Joystick_GetHIDDescriptor
四、usb_endp.c文件
1、增加之前定義的中斷資料處理函數
如:
void EP1_OUT_Callback(void)
{
這些寫接收代碼
}
五、資料發送和接收,舉例說明
1、資料接收
u8 DataLen;
DataLen = GetEPRxCount(ENDP1);
PMAToUserBufferCopy(TX1_buffer, ENDP1_RXADDR, DataLen);
SetEPRxValid(ENDP1);
USART1_Send(DataLen);
count_out = 1;
2、資料發送
UserToPMABufferCopy(InBuffer, GetEPTxAddr(ENDP1), 64);
SetEPTxCount(ENDP1, 64);
SetEPTxValid(ENDP1);
以上為這次的說明下次會在STM32的USB 應用 2及3 針對 hw_config.c和usb_desc.c在多加說明。
2013年接了一個案子,是求做Keyboard 功能的案子,主要是將前端傳來的資料透過MCU以
Keyboard 的方法輸入到電腦端要求的程式上。所以必需針對整個LIB 功用了解,個人是用
JoyStickMouse 去修改,本篇先將個文件功能做一描述。
在 STM32_USB-FS-Device_Lib_V3.2.1\Libraries\STM32_USB-FS-Device_Driver\src
有一底層結構包括6個檔:usb_core.c(USB匯流排資料處理的核心檔),usb_init.c,usb_int.c(用於端點資料登錄輸入中斷處理),usb_mem.c(用於緩衝區操作),usb_regs.c(用於寄存器操作)usb_sil.c (USB 重置和設定所有中斷旗標)。
這個六個檔案在應用時是不會修改的,所以不是介紹重點。
主要要介紹的檔案的在ST的範例程式庫中 STM32_USB-FS-Device_Lib_V3.2.1\Project\JoyStickMouse\src 目錄下的組檔。這些檔案hw_config.c、usb_desc.c、usb_endp.c、usb_istr.c、usb_prop.c、usb_pwr.c幾個檔組成。其中usb_istr.c和usb_pwr.c整兩個檔不用修改,其他的檔都需要修改。
由於一開始入門研究是以Custom_HID為主所以以下文件說明是Custom_HID 為例
一、usb_desc.c文件
根據程式使用的通信方式修改。usb_desc.h檔中定義要根據usb_desc.c檔中的陣列的大 小;ConfigDescriptor[SIZ_CONFIG_DESC]下添加需要處理的端點;根據需要添加或刪除報告描述符(主要用於HID)和 CDC介面描述符等,這份文件必需十分了解才可以。
二、hw_config.c用於USB 設備的配置。這個和usb_desc.c未來會詳加說明。
Set_System :這個是函數是首先調用的函數,它的主要功能是初始化時鐘系統、使能相關的週邊設備電源。
Set_USBClock :這個是函數是 位於hw_config.c文件中,它的功能是配置和使能USB時鐘。
USB_Interrupts_Config :這個是main函數中調用的第二個函數,它也位於hw_config.c文件中。主要功能是配置USB所用到的中斷。跟蹤到代碼中,主要設配置了USB低優先順序中斷和喚醒中斷,又有一個EXTI中斷功能未知。
USB_Cable_Config :Software Connection/Disconnection of USB Cable. 有些硬體會設計軟體連接USB,它是用來避免當USB Cable接入PC而MCU 的初始化未完成時,
而PC端的USB送來通訊要求,而MCU無法回應造成 PC端判定接入的USB裝置失敗。
Get_SerialNum ,IntToUnicode : 獲取設備序號,轉變為unicode字串
下面4個函數 如ST文件說明的,大如不會修改,所以不多加說明
Enter_LowPowerMode
Leave_LowPowerMode
GPIO_Configuration
EXTI_Configuration
三usb_prop.c文件
1、修改void XX_Reset(void)(如:void Joystick_Reset(void))
一般/* Initialize Endpoint 0 */的不用修改,如下為舉例說明端點1的初始化,其他埠原理一樣。
SetEPType(ENDP1, EP_INTERRUPT);//設置端點1類型
/*EP_BULK 批量端點
EP_CONTROL 控制端點
EP_ISOCHRNOUS 同步端點
EP_INTERRUPT 中斷端點*/
SetEPTxAddr(ENDP1, ENDP1_TXADDR); //設置端點1緩衝區基底位址
SetEPTxCount(ENDP1, 64);// 配置Tx 緩衝計數器
SetEPRxStatus(ENDP1, EP_RX_DIS);// //設置端點接收關閉
SetEPTxStatus(ENDP1, EP_TX_NAK);// //設置端點1發送不應答
/*
#define EP_RX_DIS (0x0000) // EndPoint RX DISabled 端點接收關閉
#define EP_RX_STALL (0x1000) // EndPoint RX STALLed 端點接收延遲
#define EP_RX_NAK (0x2000) // EndPoint RX NAKed 端點接收不應答
#define EP_RX_VALID (0x3000) // EndPoint RX VALID端點接收有效
#define EP_TX_DIS (0x0000) //EndPoint TX DISabled
#define EP_TX_STALL (0x0010) // EndPoint TX STALLed
#define EP_TX_NAK (0x0020) // EndPoint TX NAKed
#define EP_TX_VALID (0x0030) // EndPoint TX VALID */
2、刪除不相干的描述符等。
如自訂的USB設備就不需要以下結構體初始化:
ONE_DESCRIPTOR Joystick_Report_Descriptor
ONE_DESCRIPTOR Mouse_Hid_Descriptor
3、修改RESULT XX_Data_Setup(u8 RequestNo)的資料類請求處理。
如Custom_HID常式修改為“自訂USB設備”常式時可以將以下代碼刪除
if ((RequestNo == GET_DESCRIPTOR)
&& (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))
&& (pInformation->USBwIndex0 == 0))
{
if (pInformation->USBwValue1 == REPORT_DESCRIPTOR)
{
CopyRoutine = Joystick_GetReportDescriptor;
}
else if (pInformation->USBwValue1 == HID_DESCRIPTOR_TYPE)
{
CopyRoutine = Joystick_GetHIDDescriptor;
}
}
4、刪除不相干的獲得描述符返回函數
如自訂的USB設備就不需要以下函數:
Joystick_GetReportDescriptor
Joystick_GetHIDDescriptor
四、usb_endp.c文件
1、增加之前定義的中斷資料處理函數
如:
void EP1_OUT_Callback(void)
{
這些寫接收代碼
}
五、資料發送和接收,舉例說明
1、資料接收
u8 DataLen;
DataLen = GetEPRxCount(ENDP1);
PMAToUserBufferCopy(TX1_buffer, ENDP1_RXADDR, DataLen);
SetEPRxValid(ENDP1);
USART1_Send(DataLen);
count_out = 1;
2、資料發送
UserToPMABufferCopy(InBuffer, GetEPTxAddr(ENDP1), 64);
SetEPTxCount(ENDP1, 64);
SetEPTxValid(ENDP1);
以上為這次的說明下次會在STM32的USB 應用 2及3 針對 hw_config.c和usb_desc.c在多加說明。
留言
張貼留言