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

}

试试收发,

cfecbf23b757f7240527a25e2b22d4a4.png

245ed468508e0880709507ec0707317d.png

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

13.gif

先上PC端驱动文件:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4篇Nature同时揭示DNA自组装技术,离人造生命又近了一步

来源:刘盼科学网博客 概要: 科学家一直渴望利用自组装来构建人造物体,以达到细胞或细胞器的尺寸和复杂性,以便为研究,工程和医学应用构建合成的细胞机器。 iNature:自组装过程以各种形式存在于自然界中&…

均方距离计算公式_均值、方差、均方值、均方差计算

1、均值 均值表示信号中直流分量的大小,用E(x)表示。对于高斯白噪声信号而言,它的均值为0,所以它只有交流分量。 2、均值的平方 均值的平方,用{E(x)}^2表示,它表示的是信号中直流分量的功率。 3、均方值 均方值表示信号平方后的均值,用E(x^2)表示。均方值表示信号的平均功…

推动大数据和AI应用场景的落地,加速实现与产业融合。

来源:猎云网 概要:在新时代下,如何利用大数据与人工智能技术,大幅提升数据效率与业务决策,化数据新技术力为业务新能力,化业务新能力为商业新物种,成为各行各业在未来生存下去的关键。 今日&am…

sql无法写入mysql_无法通过写入mysql数据库pandas.to\u sql使用sqlalchemy,但不能通过没有pandas的sqlalchemy...

我正在尝试将数据帧写入MySQL表。这是我的代码:import pandas as pdimport sqlalchemyconnectString"""mysqlpymysql://userName:passWordhostIP/schema"""engine sqlalchemy.create_engine(connnectString)connectionengine.connec…

web.config 指定的默认页失效

web.config 指定的默认页失效 解决方法: IIS 配置如下:

CCF大数据专家委:2018年大数据发展趋势预测

来源:大潘点点 概要:2018年大数据发展趋势预测 1、机器学习继续成为大数据智能分析的核心技术 2、人工智能和脑科学相结合,成为大数据分析领域的热点 3、数据科学带动多学科融合 4、数据学科虽然兴起,但是学科突破进展缓慢 5、推动…

connectionstring mysql_Entity Framework 6 自定义连接字符串ConnectionString连接MySQL

在开始介绍之前,首先来看看官方对Entity Framework的解释:Entity Framework (EF) is an object-relational mapper that enables .NET developers to work with relational data using domain-specific objects. It eliminates the need for most of the…

在SQL Server中用好模糊查询指令LIKE

来源:http://www.itpapa.com/forum.php?modviewthread&tid719 查询是SQL Server中重要的功能,而在查询中将Like用上,可以搜索到一些意想不到的结果和效果,like的神奇之处在于其提供的模糊查询功能,通过与它相匹配…

学界 | OpenAI 发布稀疏计算内核,更宽更深的网络,一样的计算开销

作者:杨晓凡 概要:OpenAI 的研究人员们近日发布了一个高度优化的 GPU 计算内核,它可以支持一种几乎没被人们探索过的神经网络架构:带有稀疏块权重的网络。 OpenAI 的研究人员们近日发布了一个高度优化的 GPU 计算内核&#xff0…

java三态_Java中对象的三种状态

Java中的对象的三种状态是和垃圾回收紧密相关的,因此有必要深究。状态一:可触及态:从根节点开始,可以搜索到这个对象,也就是可以访问到这个对象,也有人将其称为可达状态。状态二:可复活态&#…

Java 实现sha_加密算法 MD5 和 SHA 的 JAVA 实现

首先先简单的介绍一下MD5 和 SHA 算法然后看一下在 java.security.MessageDigest (信息摘要包下) 如何分别实现 md5 加密 和 sha 加密最后在看一下 使用httpclient包 依赖下的 commons-codec-org. 包 下的apache.commons.codec.digest.DigestUtils 这个工具类 是如何快速…

java 操作db2_java操作DB2,增删改查

//:Db2ConnTest/***功能:实现连接DB2数据库,并实现基本获取数据功能*jiangbin*/import java.sql.*;import java.util.*;SuppressWarnings("unchecked")public class Db2ConnTest{Connection conn;Statement stat;ResultSet rs;ResultSetMetaDa…

java会员充值算法_[蓝桥杯][算法训练VIP]数的统计-题解(Java代码)详解

解题思路:注意事项:参考代码:import java.util.HashMap;import java.util.Map;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scnew Scanner(System.in);int nsc.nextInt();int ns[]new int[n];for (int i 0; i ns[i]sc.next…

java loadonstartup_java的web配置文件的“load-on-startup0/load-on-startup”一个问题

展开全部load-on-startup标记容器是否32313133353236313431303231363533e78988e69d8331333365643662在启动的时候实例化并调用其init()方法的优先级。它的值表示 servlet应该被载入的顺序。当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet。.如…

java隋唐演义游戏下载_JAVA多线程

第一节 多线程背景知识介绍多线程作用:可以帮助简化模型,还能编写强大的代码。进程与线程的基础概念:Eclipse QQ都属于进程。进程是程序(任务)的执行过程,它持有资源(共享内存、共享文件)和线程。它包含两点:1.动态性&…

friso mysql_非sqlite和nigix的开源c项目

一。friso中文分词器Friso是使用c语言开发的一款高性能中文分词器,使用流行的mmseg算法实现。完全基于模块化设计和实现,可以很方便的植入到其他程序中,例如:MySQL,PHP等。同时支持对UTF-8/GBK编码的切分。类Python语法…

packageinfo.java_package-info.java文件详解

package-info.java文件详解一、pacakge-info.java介绍pacakge-info.java是一个Java文件,可以添加到任何的Java源码包中。pacakge-info.java的目标是提供一个包级的文档说明或者是包级的注释。pacakge-info.java文件中,唯一要求包含的内容是包的声明语句&…

java实验七实验报告_Java实验报告-7-风扇

Java实验报告实验题目实验七综合实验风扇代码:import java.awt.Col or;import java.awt.Graphics;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;public class Fengshan {public static void main(String[] args) …

java classpath设置_Java CLASSPATH设置

Java CLASSPATH设置CLASSPATH: CLASSPATH是一个环境变量,Application ClassLoader使用它来定位和加载.class文件。 CLASSPATH定义路径,以查找不是扩展或Java平台一部分的第三方和用户定义的类。设置CLASSPATH时,请包括所有包含.class文件和JA…