这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 关于stm32f103的USB虚拟串口程序移植

共1条 1/1 1 跳转至

关于stm32f103的USB虚拟串口程序移植

高工
2015-01-07 13:38:34     打赏

手边有个项目要用到USB传数据到主机,虽然有很多种方式,但最后还是选择了USB虚拟串口模式,将数据上传至pc端;

然而这就涉及到了移植问题,在keil下官方已经给出了一个完整的USB TO VCOM的demo,但在我的主机上装的是keil 4.22 版的(demo在C:\Keil\ARM\Examples\ST\STM32F10xUSBLib\Demos,盘符按自己的实际安装位置找),而我要用的函数库是3.5版的,显然会出现很多关于版本兼容的问题。

首先移植时候,打开demo下USBtoVCOM的程序工程,看到里面有不少usblib的文件看看都用到了那些文件,全数拷贝出来到另外建立的文件中,包括:

C:\Keil\ARM\Examples\ST\STM32F10xUSBLib\Demos\Virtual_COM_Port\include下的所有7个头文件、

C:\Keil\ARM\Examples\ST\STM32F10xUSBLib\Demos\Virtual_COM_Port\source下的所有8个源文件、

C:\Keil\ARM\RV31\LIB\ST\STM32F10x\USB下的usb库文件、

C:\Keil\ARM\INC\ST\STM32F10x\USB下的usb库文件头文件;

然后,用3.5的库文件重新建立一个工程,将刚复制的所有文件,在此工程下建立新的目录放进去,然后就是加载这些源文件,注意除了原来的复制过来的main.c/stm32f10x_it.c文件不加入工程。

最后,是修改其中的文件中的库关系,将所有"stm32f10x_lib.h"的文件修改为“stm32f10x.h"的头文件,其中”platform_config.h“文件中包涵一个”“#include "stm32f10x_type.h"头文件要将其修改为”stm32f10x.h"的头文件。至此编译器当能透过编译。然后将demo复制过来的main函数中的

 Set_System();//系统初始化

 Set_USBClock();//设置USB时钟
 USB_Interrupts_Config(); //配置USB中断

 USB_Init();//初始化USB 

复制到当前建立的工程main函数中,然后在将

  if ((count_out != 0) && (bDeviceState == CONFIGURED))
  {
    USB_To_USART_Send_Data(&buffer_out[0], count_out);
    count_out = 0;
  }

函数代码复制进去,现在编译下可以运行代码了,但是连接usb线的时候就是无法安装驱动,就是连接不上。这就是库代码的问题了,其中在stm32f10x_it.c的文件中有一个中断函数要复制到当前建立的工程文件中的stm32f10x_it.c代码下;

void USB_LP_CAN_RX0_IRQHandler(void)
{
  USB_Istr();
}

 *******************************************************************************/
void USART1_IRQHandler(void)
{
  if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
    /* Send the received data to the PC Host*/
    USART_To_USB_Send_Data();
  }
}
然后,运行代码的时候,还是同样无法安装驱动;在仔细检查后发现usb的中断入口向量函数不对,于是上面的代码改成:

void USB_LP_CAN1_RX0_IRQHandler(void)
{
  USB_Istr();
}

 这一下运行的可以成功找到驱动,终于连接了。

下面测试下能否收发数据:把以下代码注释掉重新编写一个收发函数;

if ((count_out != 0) && (bDeviceState == CONFIGURED))
  {
    USB_To_USART_Send_Data(&buffer_out[0], count_out);
    count_out = 0;
  }

编写好的收发函数如下:

    if (count_out != 0) //判断有无数据接收到
    { 
  
     
   if(buffer_out[0]==0x01){GPIO_ResetBits(GPIOB, GPIO_Pin_14 );
//                           USB_Send_Data("LED1 点亮下一个 \n");
                           USB_Send_Data((u8*)TEXT_Buffer);
         count_out=0;
        } //如果接收到的输出是0X01,点亮led1
   if(buffer_out[0]==0x02){GPIO_ResetBits(GPIOB, GPIO_Pin_12 );
                           USB_Send_Data("LED2 点亮下一个 \n");
         count_out=0;
         } 
         //如果接收到的输出是0X02,点亮led2
   if(buffer_out[0]==0x03){GPIO_ResetBits(GPIOB, GPIO_Pin_13 );
                           USB_Send_Data("LED3 点亮下一个 \n");
         count_out=0;
         } 
         //如果接收到的输出是0X03,点亮led3
   if(buffer_out[0]==0x04){GPIO_SetBits(GPIOB, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 );
                           USB_Send_Data("LED 全灭下一个 \n");
         count_out=0;
         } //如果接收到的输出是0X04,//关闭3个LED 
    }
试试收发,

 

 

下面就是大家很期待的源代码了

先上PC端驱动文件:

——回复可见内容——

 

在上传调试好的源码文件:

——回复可见内容——

 

注意我用的主芯片晶振12MHz。


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]