手边有个项目要用到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。

 
					
				
 
			
			
			
						
			 
					
				 
					
				 
					
				 
					
				 
					
				 
					
				 
					
				 
					
				 
					
				 我要赚赏金
 我要赚赏金 STM32
STM32 MCU
MCU 通讯及无线技术
通讯及无线技术 物联网技术
物联网技术 电子DIY
电子DIY 板卡试用
板卡试用 基础知识
基础知识 软件与操作系统
软件与操作系统 我爱生活
我爱生活 小e食堂
小e食堂

