1. 程式人生 > >USB虛擬串列埠實驗_STM32F1開發指南_第五十三章——USB學習筆記

USB虛擬串列埠實驗_STM32F1開發指南_第五十三章——USB學習筆記

前言

    STM32F103系列晶片都自帶USB,不過STM32F103的USB都只能用來做裝置,而不能用作主機。

目錄:

53.1 USB簡介

    USBF103自帶的USB符合USB2.0規範。
    在USB主機上,D-和D+都接了15K下拉電阻到地,所以沒有裝置接入時,D+和D-都是低電平。
    在USB裝置中,如果是高速裝置,D+上接一個1.5K上拉電阻到VCC;如果是低速裝置,D-上接入一個1.5k
上拉電阻到VCC。這樣主機就能判斷是否有裝置接入,接入的裝置是高速還是低速裝置。

1)stm32的USB從控制器

    ① PC主機和MCU之間的資料傳輸是通過共享一專用的資料緩衝區來完成的,該資料緩衝區被USB外設直接
訪問。這塊專用資料緩衝區的大小由所使用的端點數目和每個端點最大的資料分組大小所決定,每個端點最大 可使用512位元組緩衝區(專用512位元組,和CAN公用),最多可用於16個單向或8個雙向端點。     ② USB模組和PC主機通訊,根據USB規範實現令牌分組的檢測,資料傳送/接收處理,和握手分組的處理。整 個傳輸的過程由硬體完成,包括CRC的生成和校驗。     ③ 每個端點都有一個緩衝區描述塊,描述該端點使用的緩衝區地址、大小和需要傳輸的位元組數。當USB模組識 別出一個有效的功能/端點的令牌包分組時,(如果需要傳輸資料並且端點已配置)隨之發生相關的資料傳輸。         USB模組通過一個內部的16位暫存器實現埠與專用緩衝區之間的資料交換。在所有的資料傳輸完成後,如
需要,根據傳輸的方向,傳送或接收適當的握手分組。在資料傳輸結束時,USB模組將觸發與端點相關的中斷, 通過讀狀態暫存器和/或者利用不同的中斷來處理。     ④ USB的中斷對映單元:將可能產生中斷的USB時間對映到三個不同的NVIC請求線上:
        a、USB低優先順序中斷(通道20):可由所有的USB事件觸發(正確傳輸,USB復位等)。韌體在處理中斷前應先中斷源。         b、USB高優先順序中斷(通道19):僅能由同步和雙緩衝批量傳輸的正確傳輸事件觸發,目的是保證最大的傳輸率。         c、USB喚醒中斷(通道42):由USB掛起模式的喚醒事件喚醒。

2)stm32的USB裝置框圖

53.2 硬體設計

    本章實驗功能簡介:
    利用stm32自帶的USB功能,連線電腦USB虛擬出一個USB串列埠,實現電腦和開發板的資料通訊。在找到虛擬串列埠 後,即可開啟串列埠除錯助手,通過USB虛擬串列埠和上位機對話,STM32在收到上位機發過來的字串(以回車換行結 束)後,原樣返回給上位機。下載後,DS0閃爍,提示程式在執行,每個一定時間,通過USB虛擬串列埠傳送一段資訊給
電腦。     所要用到的硬體資源如下:
    1)指示燈 DS0、DS1;
    2)串列埠;
    3)TFTLCD模組;
    4)USB SLAVE介面。
    MiniUSB介面與STM32連線電路圖:

    因為PA11和PA12既是USB介面又是CAN介面,所以用連線座P9轉接,需要用USB時,用跳線帽將PA11、PA12與 D-、D+連線即可。

53.3 軟體設計

1) stm32的USB韌體庫


    移植時,重點要修改USB_CONFIG資料夾下的程式碼,USB_CORE下的程式碼一般不用修改。     ① USB_CORE下程式碼介紹:
序號 檔名 作用 備註
1 usb_regs.c 操作USB控制暫存器; 裡面有對各種USB暫存器的底層操作函式;
2 usb_init.c 初始化USB控制器; 只有一個函式USB_Init,呼叫其它函式,以使程式碼規範;
3 usb_int.c 中斷處理函式; 只有兩個函式:
CTR_LP:負責USB低優先順序中斷的處理;
CTR_HP:負責USB高優先順序中斷的處理;
4 usb_mem.c 處理PMA資料; PMA全稱為Packet memory area,是stm32內部用於USB/CAN的專用資料緩衝區。
只有兩個函式:
PMAToUserBufferCopy:將USB資料傳送到主機;
UserToPMABufferCopy:將主機資料傳送到USB;
5 usb_core.c 處理USB2.0協議
6 usb_sil.c 為USB端點提供簡化的讀寫訪問函式。
    以上的函式具有很強的獨立性,直接呼叫內部的函式即可。     ② USB_CONFIG下的程式碼:
序號 檔名 作用
1 hw_config.c 配置硬體,比如初始化USB時鐘、USB中斷、低功耗模式處理等;
2 usb_desc.c 處理Virtual Com描述符;
3 usb_endp.c 處理正確傳輸中斷回撥函式,用於非控制傳輸;
4 usb_pwr.c 管理USB控制器的電源;
5 usb_istr.c 處理USB中斷;
6 usb_prop.c 處理所有Virtual Com的相關事件,包括Virtual Com的初始化、復位等操作。
    ③ 其他
序號 檔名 作用 備註
1 stm32_it.c 處理USB相關中斷。 包括兩個中斷服務函式:
USB_LP_CAN1_RX0_IRQHandler:呼叫USB_Istr函式,處理USB發生的各種中斷;
USBWakeUp_IRQHandler                :清除中斷標誌。
注:為了方便,一般把USB中斷相關程式碼放到hw_config.c裡面。

2)USB實現程式碼

  1. int main(void)
  2. {
  3. u16 t;
  4. u16 len;
  5. u16 times=0;
  6. u8 usbstatus=0;
  7. delay_init();//延時函式初始化
  8. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設定NVIC中斷分組2:2位搶佔優先順序,2位響應優先順序
  9. uart_init(115200);//串列埠初始化為115200
  10. USB_Port_Set(0);//USB先斷開
  11. delay_ms(700);
  12. USB_Port_Set(1);//USB再次連線
  13. Set_USBClock(); //配置USB時鐘,即從72M主頻得到48M的USB時鐘(1.5分頻)
  14. USB_Interrupts_Config(); //設定USB喚醒中斷和USB低優先順序資料處理中斷
  15. USB_Init();   //初始化USB,主要是呼叫Virtual_Com_Port_init函式,開啟USB部分的電源等
  16. while(1)
  17. {
  18. if(usbstatus!=bDeviceState)//USB連線狀態發生了改變.
  19. {
  20. usbstatus=bDeviceState;//記錄新的狀態
  21. if(usbstatus==CONFIGURED)
  22. {
  23. LED1=0;//DS1亮 提示USB連線成功
  24. }else
  25. {
  26. LED1=1;//DS1滅 提示USB斷開
  27. }
  28. }
  29. if(USB_USART_RX_STA&0x8000)
  30. {
  31. len=USB_USART_RX_STA&0x3FFF; //得到此次接收到的資料長度
  32. usb_printf("\r\n您傳送的訊息為:%d\r\n\r\n",len);
  33. for(t=0;t<len;t++)
  34. {
  35. USB_USART_SendData(USB_USART_RX_BUF[t]); //以位元組方式,傳送給USB
  36. }
  37. usb_printf("\r\n\r\n"); //插入換行
  38. USB_USART_RX_STA=0;
  39. }
  40. else
  41. {
  42. times++;
  43. if(times%5000==0)
  44. {
  45. usb_printf("\r\n戰艦STM32開發板USB虛擬串列埠實驗\r\n");
  46. usb_printf("正點原子@ALIENTEK\r\n\r\n");
  47. }
  48. if(times%200==0)
  49. usb_printf("請輸入資料,以回車鍵結束\r\n");
  50. if(times%30==0)
  51. LED0=!LED0;//閃爍LED,提示系統正在執行.
  52. delay_ms(10);
  53. }
  54. }
  55. }
  主要程式碼作用:     USB的配置通過三個函式完成:
       Set_USBClock();            //配置USB時鐘,即從72M主頻得到48M的USB時鐘(1.5分頻)        USB_Interrupts_Config(); //設定USB喚醒中斷和USB低優先順序資料處理中斷          USB_Init();                     //初始化USB,主要是呼叫Virtual_Com_Port_init函式,開啟USB部分的電源等      為什麼不設定PA11和PA12管腳?         因為,一旦開啟USB電源(USB_CNTR的PDWN位清零),PA11和PA12將不再做其他功能使用,僅供USB使用,所以在 開啟了USB電源之後,無論怎麼配置這兩個管腳,都是無效的。要再次獲取這兩個管腳的配置權,需要關閉USB電源,即置 位USB_CNTR的PDWN位,我們通過USB_Port_Set函式來禁止/使能USB連線,在復位時,先禁止,再使能,這樣每次我們 按復位鍵,電腦都可以識別到USB滑鼠,而不需要我們每次都拔USB線。USB_Port_Set函式在hw_config.c中實現, 程式碼如下:
  1. //USB使能連線/斷線
  2. //enable:0,斷開; 1,允許連線
  3. void USB_Port_Set(u8 enable)
  4. {
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA時鐘
  6. if(enable)
  7. {
  8. _SetCNTR(_GetCNTR()&(~(1<<1)));//退出斷電模式
  9. }
  10. else
  11. {
  12. _SetCNTR(_GetCNTR()|(1<<1));// 斷電模式
  13. GPIOA->CRH&=0XFFF00FFF;
  14. GPIOA->CRH|=0X00033000;
  15. PAout(12)=0;
  16. }
  17. }
    USB虛擬串列埠資料傳送:
    該函式在hw_config.c中
  1. //傳送一個位元組資料到USB虛擬串列埠
  2. void USB_USART_SendData(u8 data)
  3. {
  4. uu_txfifo.buffer[uu_txfifo.writeptr]=data;
  5. uu_txfifo.writeptr++;
  6. if(uu_txfifo.writeptr==USB_USART_TXFIFO_SIZE)//超過buf大小了,歸零.
  7. {
  8. uu_txfifo.writeptr=0;
  9. }
  10. }
    該函式實現傳送1位元組資料到虛擬串列埠中。     這裡用到了一個uu_txfifo結構體,該結構體是一個USB虛擬串列埠傳送資料FIFO結構體,定義如下:
  1. #define USB_USART_TXFIFO_SIZE

    相關推薦

    USB虛擬串列實驗_STM32F1開發指南_十三——USB學習筆記

    前言     STM32F103系列晶片都自帶USB,不過STM32F103的USB都只能用來做裝置,而不能用作主機。 目錄: 53.1 USB簡介     USBF103自帶的USB符合USB2.0規範。     在USB主機上,D-和D+都接了15K下拉電

    轉 [經驗] STM32 USB虛擬串列(有原始碼)

    原文出處:http://bbs.elecfans.com/jishu_467116_1_1.html   串列埠除錯在專案中被使用越來越多,串列埠資源的緊缺也變的尤為突出。很多本本人群,更是深有體會,不準備一個USB轉串列埠工具就沒辦法進行開發。本章節來簡單概述STM32低端晶片上

    USB虛擬串列

    現代嵌入式系統中,非同步序列通訊介面往往作為標準外設出現在微控制器和嵌入式系統中。但是隨著個人計算機通用外圍裝置越來越少地使用串列埠,串列埠正在逐漸從個人計算機特別是行動式電腦上消失。於是嵌入式開發人員常常發現自己新買來的計算機上沒有串列埠,或者出現除錯現場使用者的計算機沒有串列埠的尷尬局面。相反,

    WinCE usb虛擬串列

    1.Usb驅動程式的載入 識別到USB裝置插入到電腦上(姑且這麼認為吧) fRet = LoadDeviceDrivers(pDev, &fLoaded); if(fRet && !fLoaded) { //失敗了,提示使用者對話方塊, } 1.1L

    一種通過登錄檔獲取USB虛擬串列號的方法

    在開發一個Modbus的串列埠監測工具軟體的時候,啟動工具軟體,希望一開始就能在下拉框檢測到當前有效的USB串列埠。 剛開始做的時候是用的窮舉法,就是“COM0”~“COM15”一個一個嘗試開啟。但是,這樣做一個是效率低下,另一個是換了新的USB-串列埠介面卡,有可能虛擬串

    STM32 USB虛擬串列問題彙總

    彙總1:STM32的USB例程修改步驟,來自http://blog.csdn.net/cy757/archive/2010/01/01/5117610.aspx 以下是筆者將ST的Custom_HID例程修改為“自定義USB裝置”例程時總結出來的,因為筆者也是剛剛學USB開發不久,某些方面理解錯誤在所難免,

    STM32 之 USB 虛擬串列

            在現代個人電腦的USB是幾乎所有外設的標準通訊埠。然而許多工業應用軟體仍然使用經典的串列埠(UART)。USB虛擬串列埠提供了繞過這個問題的一個簡單的解決方案。         為了讓USB被視為一個COM埠,USB裝置必須根據通訊裝置類(CDC)規範來實現

    USB 虛擬串列簡介

    1. USB虛擬串列埠簡介 USB虛擬串列埠屬於USB通訊裝置類。在物理層通過USB匯流排,採用虛擬串列埠的方式為主機提供一個物理串列埠。在系統內部,USB控制器提供了一個批量傳輸IN端點和一個批量傳輸的OUT端點,用於資料的接收和傳送,模擬串列埠的RX和TX線。另外USB

    STM32學習筆記USB虛擬串列描述符簡介

    Descriptor即描述符,是一個完整的資料結構,可以通過C語言等程式設計實現,並存儲在USB裝置中,用於描述一個USB裝置的所有屬性,USB主機是通過一系列命令來要求裝置傳送這些資訊的。它的作用就是通過如問答節中的命令***作來給主機傳遞資訊,從而讓主機知道裝置具有

    Python全棧開發記錄_篇(裝飾器)

      單獨記錄裝飾器這個知識點是因為這個知識點是非常重要的,必須掌握的。 瞭解裝飾器之前要知道三個知識點 作用域,上一篇講到過順序是L->E->G->B 高階函式: 滿足下列其中一種即可稱之為高階函式: a、把一個函式名當做實參傳遞給另一個函式 b、返回值中包含函式

    OpenGL編程指南九版) Tiangles 學習筆記

    方法 media bind opengl rmi ack war enum shader ////////////////////////////////////////////////////////////////////////////// // // Tr

    教程——Basys3開發板的MicroBlaze串列實驗

    注:本博文所需工程下載連結:http://download.csdn.net/detail/lzy272942518/8850539 一、目的 學會diagram中MicroBlaze最小系統的組成 學會匯出、建立以及執行基於SDK的工程 二、簡介 實驗目的: 1.通過

    WinCE裝置模擬器+虛擬串列+GPS模擬器搭建開發測試環境

    所需軟體: 1、WinCE 5.0裝置模擬器 2、虛擬串列埠工具Virtual Serial Port Driver 6.9 3、Virace GPS 模擬器0.3.1chs 模擬環境: COM2:連線WinCE裝置模擬器 COM7:連線GPS模擬器 環境搭建步驟: 1

    Android USB串列開發(hoho.android.usbserial串列庫)

    使用hoho.android.usbserial串列埠庫開發串列埠 import android.app.Application import android.app.PendingIntent import android.content.BroadcastReceiver import

    ARM開發板上交叉編譯usb串列驅動

    問題 這兩天為了做gps和arm的通訊,不得不搗鼓這個東東。開發板是創維特jx2410,usb轉串列埠線的晶片是pl2303。還好是這個晶片,讓我沒費多少力氣,就達成了目的。因為linux對它已經支援了,我們只要編譯、載入它的驅動就ok了。 驅動原始

    Android手機的USB串列開發硬體以及軟體

    Android手機的USB轉串列埠開發 Android手機的USB介面在各個領域都得到了廣泛的應用和推廣。筆者前幾天接手一個專案,主要就是解決工業現場資料採集的問題,該專案是由深圳巨集進科技委託筆者開發的。現場的匯流排是RS485和RS232匯流排,需要用電腦和手機方便的採集資料,保留並從現場發給深圳公司進

    v虛擬機器Linux(Fedora10)下USB串列的使用, minicom: cannot open /dev/ttyUSB0的解決

    轉自:http://blog.csdn.net/boygrass/article/details/6878167 網路上有很多Linux下USB轉串列埠的使用方式,但在我這邊好像總是出現 minicom: cannot open /dev/ttyUSB0:No such

    虛擬機器Linux(Fedora10)下USB串列的使用, minicom: cannot open /dev/ttyUSB0的解決

    網路上有很多Linux下USB轉串列埠的使用方式,但在我這邊好像總是出現 minicom: cannot open /dev/ttyUSB0:No such file or directory 或no such device的情況。 以下是我自己的解決方法,在這裡記錄一下。

    虛擬機器識別串列USB串列

    1.虛擬機器識別串列埠 VM -> Settings -> (左下角)Add  -> Serial Port   (注意: 要在虛擬機器系統未啟動時設定) 選擇要新增的串列埠(建議不要使用Auto detect) 勾選 Connected  和 Conne

    嵌入式開發USB串列驅動:Win10不再支援PL2303

    1.開啟裝置管理器,可以看到PL2303對應的驅動上有一個感嘆號: 2.Outline... 3.Outline... 4.