2016-05-13 56 views

回答

0

的STM32F4xx MCU的USB必須實現在主機模式(USB OTG)在其固件USB CDC作爲設備類接口類https://en.wikipedia.org/wiki/USB_communications_device_class)和。在PC的USB上必須創建一個虛擬COM端口(驅動程序)來處理STM32F4通過USB CDC(主機模式)發送的RS232協議。當STM32F4上的CDC固件工作正常時,在Linux上,STM32F4出現,即/dev/ttyACM0,這可以通過標準RS232終端程序訪問。

基本 - >http://www.keil.com/support/man/docs/rlarm/rlarm_usb_create_cdc_acm.htm

這是一個基本的例子如何通過USB發送串行數據CDC(即PC上的USB顯示爲一個虛擬COM口即/dev/ttyACM0):http://visualgdb.com/tutorials/arm/stm32/usb/

另請參閱此http://stm32f4-discovery.net/2014/08/library-24-virtual-com-port-vcp-stm32f4xx/

關注或修改上面的教程到linux(http://visualgdb.com/tutorials/arm/stm32/usb/)。

要將printf()重定向到USB CDC ,請重寫標準I/O例程,如下所示。的printf() ARM版本調用這些例程,然後,看到這個https://mcuoneclipse.com/2014/07/11/printf-and-scanf-with-gnu-arm-libraries/的printf的ARM版本()的printf()的在x86/x64版非常不同):

#include<sys/stat.h> 

extern"C" 
{ 
    int _fstat (int fd, struct stat *pStat) 
    { 
     pStat->st_mode = S_IFCHR; 
     return 0; 
    } 

    int _close(int) 
    { 
     return -1; 
    } 

    int _write (int fd, char *pBuffer, int size) 
    { 
     return VCP_write(pBuffer, size); 
    } 

    int _isatty (int fd) 
    { 
     return 1; 
    } 

    int _lseek(int, int, int) 
    { 
     return -1; 
    } 

    int _read (int fd, char *pBuffer, int size) 
    { 
     for (;;) 
     { 
      int done = VCP_read(pBuffer, size); 
      if (done) 
       return done; 
     } 
    } 
} 

或者使用ARM半主機界面http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0471c/Bgbjhiea.html)。它會自動提供功能printf()重定向到USB CDC

的更多信息:

這是一個例子,如何實現a USB-RS232適配器http://www.wolinlabs.com/blog/stm32f4.virtual.com.port.html

git還包含許多有趣的文件git clone https://github.com/rowol/stm32_discovery_arm_gcc

相關問題