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.cusb_desc.cusb_endp.cusb_istr.cusb_prop.cusb_pwr.c幾個檔組成。其中usb_istr.cusb_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.cusb_desc.c在多加說明。

留言

這個網誌中的熱門文章

STM32 I2C-EEPROM 的讀寫

如何提高STM32 ADC的精度

ENC28J60+Uip TCP Server/Client