1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > stm32usb做虚拟串口和键盘_关于stm32f103的USB虚拟串口程序移植

stm32usb做虚拟串口和键盘_关于stm32f103的USB虚拟串口程序移植

时间:2018-10-15 15:11:13

相关推荐

stm32usb做虚拟串口和键盘_关于stm32f103的USB虚拟串口程序移植

手边有个项目要用到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端驱动文件:

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。