[ 本帖最后由 495703782 于 2017-2-5 01:37 编辑 ]
因为毕设要做一个关于虚拟串口的工程,用的芯片也是F407系列的,就来到了开源电子网来找找407的虚拟串口,但是发现的许多人也不是特别清楚,所以就自己想办法死磕了。但是偶然一天发现站内有一个F407调好的工程,看样子像是原子哥写的但是没有什么解释,所以就自己挨个想办法试了,2天后终于试出来了例程的顺序。所以下面想来按顺序给需要的朋友一步一步分析下。
1.首先工程的名字如下
[tr] [td=471][/td] [/tr]
[tr] [td][/td] [td][/td] [/tr]
2.打开工程后主程序如图所示 在进入while(1)之前进行了一些初始化,首先定义了一个dat的数组用于等会通过USB向上位机传送数据;然后进行中断优先级分组;然后串口、LED初始化。之后进行了USBD_Init()的初始化即USB从设备初始化。 USBD_Init()函数的如空参数不需要任何更改,这都是定义好的只需要调用。下面是USBD_Init()函数的内部结构,这个函数在usbd_core.c中。 在USBD_Init()函数中又调用了第一个函数叫USB_OTG_BSP_Init();{BPS全称应该是boardsupport package 叫板级支持包,应为这个程序是移植的,所以这个板级支持包就是EVAL(evaluation)板(STM32官方的评估板)的支持包,这句不懂的可以略过对工程使用没有影响,只是我自己在这纠结了一会想给同样疑惑的朋友解释一下},下面是USB_OTG_BSP_Init()函数的内部, 看到这大部分人应该明白了这是在配置你的USB是在哪个端口,开启哪个时钟,然后将管脚映射到USB上,然后你在回想一下你在官方没有改动的例程中这个函数里也是进行的这些步骤,只不过风格不一样罢了。
死循环如下。LED一直在取反表示程序在循环没有死到某一个函数里,APP_FOPS是一个结构体在结构体里可以认为是包含了5个函数(暂且认为包含的函数),APP_FOPS是通过define来定义的(其实就是换了个名字原来的名字估计STM场自己用的不爽),如下图. 可以知道APP_FOPS原来叫VCP_fops,然后你在选中VCP_fops右键GO TODEFINATION就可以找到他原来的结构体,如下图.在这里你们就可以看到VCP_DataTx
VCP_DataRx 这2个函数,这2个函数和接收、发送有关;VCP_DataTx这个函数不用管,发送就用前面的在主循环的中的格式来发就对了如下。Dat表示一个数组自己定义就好,12表示要发送多少个字节。到时候是要发送的dat的宽度是8位的一个字节还是16位的半字,以及上位机接收到的是字节还是半字都需要读到文章的朋友自己摸索,因为到此我也还没有试,这个函数是自己发完继续往下执行的,不需要编程者去中断里处理什么的,所以就是怎么舒服怎么用。 之后来看VCP_DataRx函数如下 在这里可以看到原作者注释掉的一段提示语(很可惜我原来没仔细看浪费的很多时间)在这里,要求你去把USB接收到的数据考到其他的地址,在后面又有一个for的循环这应该是作者在编写调试的时候用的到时候不用的可以注释掉。Printf(“RN”)这句也可以注释掉.(科普:回车的意思是回到一行的开头,但是不换行,记住只回到一行的开头不换行,代码是0x0D也可以用R代替;而换行是只换到下一行但是不回到一行的开头代码是0X0A也可以用N代替;现在在键盘上所说的回车是把换行和回车说到了一起了)。 在FOR中用了printf(“%c”,Buf),这句是通过USART1把数据穿回上位机的,请大家别混了,这里USB和USART1的功能是都能实现的,应该是分时间公用吧。 到这接收和发送的功能都实现了,大家根据自己的需要用就好了。
[tr] [td=471][/td] [/tr]
[tr] [td][/td] [td][/td] [/tr]
下面给大家讲讲这个写好的程序有什么效果,首先你需要2跟线如图一个插USB_SLAVE另一个插,如果你只插一个就只能看到一半的效果。 当你把程序下好的时候打开串口调试助手(重点:每次下完后要重新打开串口调试助手软件要不USB的的串口打不开)下面就有2根USB线和1根USB线的现象进行讲解 1.有2根USB线:用JTAG下载程序或USB下载程序都行,下载完后先把板子的电源打开然后打开2个串口助手。如下图(我已经注释了USB发送所以大家没看到有连续接收的样子)左边的是CMO5(USB)口 右边的是COM7(232)当按下复位键可以看到在程序初始化的时候其实从232串口还是有数据发送上来的如下图.这些打印的数据都在usbd_usr.c文件中如果需要的自己更改,你也可以找找那个程序调用了写在usbd_usr.c文件中的这些函数来输出字符串来更好的理解USB是怎么工作的你也。当你带电热拔插的时候COM7(232)会输出如下的信息Device In suspendmode表示USB设备被挂起了你再插上又连上了.所以USB_SLAVE是可以热拔插的(当你232还在供电的时候可以)。
当你在右边的COM5 USB口发ABCD时效果如下.下面第一幅是USB的串口窗口,第二幅是USART1的接收窗口.以上实现的就是电脑走USB发消息到STM32然后STM32又通过USART1把收到的消息又传回了电脑,剩下只有一根数据线的状况就不写了把。做个总结:虽然程序是USB与USART1的,但是USB发的程序在主函数里有,收的数组我们也可以导出来,这就形成了完整的USB收发,怎么应用大家就个取所需吧。如果有问题大家可以留言,读的语句不通顺看不懂的也可以留言。最后谢谢这份程序的编写者,程序不是本人编写再次说明。本人只是做了程序分析。(错别字一大篇)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>