手边有个项目要用到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
}
试试收发,