《stm32 usb转串口的程序设计解析.doc》由会员分享,可在线阅读,更多相关《stm32 usb转串口的程序设计解析.doc(3页珍藏版)》请在三一文库上搜索。
1、stm32 usb转串口的程序设计解析串口调试在项目中被使用越来越多,串口资源的紧缺也变的尤为突出。很多本本人群,更是深有体会,不准备一个USB转串口工具就没办法进行开发。了解USB虚拟串口,为了在项目中用一下这个USB,调试方便一些,供电可直供。公司以后的产品开发就基于STM32这个平台,从contex_M3到contex-M4。不管速度、功耗、价格、采购的方便性都有竞争力,不想再修改了(除非它无法满足要求)。STM32基本上都带有USB串口。如果不把它用上而另外加一个USB转串口单元,未免显得太落后了而且也是一种资源的浪费。顺便说一下,根据公司的状况,合适的才是好的。以前一直用TI的,从4
2、30到ARM到28XX。这个ST的包含了以前的所有,TI的ARM速度比较慢,而它的普通的DSP的速度与M4相当,有些还比不过M4,耗电却惊人,何况M4带了浮点后比定点在某些地方要快很多。难怪TI在推M4时故意将频率放慢,DSP功能减少,我想各个公司都有自已的考虑吧。而ST就把CMOS传感器接口也放进去。赶明儿啥时有空了再做块PCB试试。ST最让人不爽的是它的开发例程做的太浅,例如超速USB2。0,CMOS接口资料几乎没有,TCP/IP也浅尝即止,网页也设计得世界上最烂,让人找个芯片,找个资料很累。在应用上比NXP差远了,毕竟有个ZLG帮忙,FREESCALE在网络通讯方面的应用做得最好,看他们
3、的TCP/IP源代码是一种享受。看来做芯片是ST的强项,做应用还非常有待加强。说明:1.跳过驱动。使用低速传输。最大可以设为921000即100KB/S。应该也差不多了。只传一些简单的东西。因为我们工作的重点是工业控制,无需高速,而我们是以完成任务为主要目的。而不是非要学什么东西,完成任务才是第一重要的。2.由于例程中没有操作系统支持,也许以后可以用keil的操作系统。比较简单,最重要的是ucOS不支持M4的浮点运算。当然对于M3我们可以将USB部分移到ucOS上。而对于M4,我们直接用KeilOS,不想花很大力气去做OS移植了。总是先从main开始Set_System();/设置系统Set_
4、USBClock();/设置USB时钟USB_Interrupts_Config();/配置USB中断USB_Init();/USB初始化while(1)if(count_out!=0)(bDeviceState=CONFIGURED)USB_To_USART_Send_Data(buffer_out0,count_out);/如果有数据将它发送到串口中去count_out=0;/发送完后这个清零初看一下,还算比较好理解,但是由于这个例子好象只有发,没有收。我想它的收大约在中断中进行的(也就是串口向USB发的过程,估计在串口中断中进行,后面我们可以再分析,不行可能需要自行加上这部分代码,希望不
5、要这样)我们还是一条一条的来看,首先看Set_System()这个函数,如果没猜错的话,应该是设置时钟吧。果然如此,我们下面一条一条看一下,它先是允许外部晶振-这里哆嗦一下,外部晶振我公司采用12M。而一般开发版采用8M。所以配置stm32f10x_conf.h文件中,要将外部晶振频率从8000000改为12000000。然后,等外部晶振起来,如果晶振没焊接好,此时就会死在这里。如果你一运行就死,可找一下这个地方。然后它做下列工作:允许FLASH取指缓冲FLASH时钟分频2倍-这是否意味着FLASH的时钟是36M呢,记得好象有ST的文章中说FLASH可工作在50M的时钟下。系统频率HCLK配置
6、成SYSCLKAPB2的时钟配置成SYSCLK不分频APB1的时钟配置成2分频。但要注意它下面的定时器2,3,4。频率仍是72M因有倍频ADC的时钟配置成6分频,即它是12MHz。注意AD需13.5个时钟完成意味着差不多1us可完成一次AD转换。PLL配置成9倍频。8X9=72MHz。注意到对于12MHz就只能是6了。此处一定要注意。允许PLL然后等PLL都OK了再做别的。-此后由PLL进行工作而不是HSI。然后,我们要允许GPIOA,GPIOB和串口的时钟。因为我们只用到了这几个资源。当然USB是另外的,我想总会在某个地方允许的。下面这个就不好理解了:RCC_APB2PeriphClockC
7、md(RCC_APB2Periph_GPIO_DISCONNECT,ENABLE);这个叫允许USB断开线。从原理图上看好象是PE7来控制的。因为PE7连接到一个DP+的一个上拉电阻控制的三极管上面。请参考原理图。但是比较奇怪的是在platform_config.h中有下列定义:#defineRCC_APB2Periph_GPIO_DISCONNECTRCC_APB2Periph_GPIOD它将这个设为端口D。所以这个USB断开引脚到底是由谁来控制的还未确定。这里留下一个问号,等以后再解决。接下来,将USB的断开脚配置成上拉的。这也就意味着在开始时,这个上拉电阻使得三极管导通,从而使这个DP脚被加了一个1.5K的电阻,可以开始枚举的。再看这个断开脚指的是哪一个脚,它不是PD9就是PB14。怎么也没有PE7的说法(原理图)。所以这里就有点不知所以然了。难道这个原理图与程序有冲突?接下来配置PA10为输入浮空,配置PA9为PP输出。这两个脚是串口。这个是正确的。我们几孚所有的板子都用UART0,它就是这两个脚的。至此这个部分结束了。