stm32 usb转串口的程序设计解析

stm32 usb转串口的程序设计解析,第1张

  串口调试在项目中被使用越来越多,串口资源的紧缺也变的尤为突出。很多本本人群,更是深有体会,不准备一个USB转串口工具就没办法进行开发。

  了解USB虚拟串口,为了在项目中用一下这个USB,调试方便一些,供电可直供。公司以后的产品开发就基于STM32这个平台,从contex_M3到contex-M4。不管速度、功耗、价格、采购的方便性都有竞争力,不想再修改了(除非它无法满足要求)。

  STM32基本上都带有USB串口。如果不把它用上而另外加一个USB转串口单元,未免显得太落后了而且也是一种资源的浪费。顺便说一下,根据公司的状况,合适的才是好的。以前一直用TI的,从430到ARM到28XX。这个ST的包含了以前的所有,TI的ARM速度比较慢,而它的普通的DSP的速度与M4相当,有些还比不过M4,耗电却惊人,何况M4带了浮点后比定点在某些地方要快很多。难怪TI在推M4时故意将频率放慢,DSP功能减少,我想各个公司都有自已的考虑吧。而ST就把CMOS传感器接口也放进去。赶明儿啥时有空了再做块PCB试试。ST最让人不爽的是它的开发例程做的太浅,例如超速USB2。0,CMOS接口资料几乎没有,TCP/IP也浅尝即止,网页也设计得世界上最烂,让人找个芯片,找个资料很累。在应用上比NXP差远了,毕竟有个ZLG帮忙,FREESCALE在网络通讯方面的应用做得最好,看他们的TCP/IP源代码是一种享受。看来做芯片是ST的强项,做应用还非常有待加强。

  说明:

  1.跳过驱动。使用低速传输。最大可以设为921000即100KB/S。应该也差不多了。只传一些简单的东西。因为我们工作的重点是工业控制,无需高速,而我们是以完成任务为主要目的。而不是非要学什么东西,完成任务才是第一重要的。

  2.由于例程中没有 *** 作系统支持,也许以后可以用keil的 *** 作系统。比较简单,最重要的是ucOS不支持M4的浮点运算。当然对于M3我们可以将USB部分移到ucOS上。而对于M4,我们直接用KeilOS,不想花很大力气去做OS移植了。

  总是先从main开始

  Set_System();///设置系统

  Set_USBClock();///设置USB时钟

  USB_Interrupts_Config();///配置USB中断

  USB_Init();///USB初始化

  while(1)

  {

  if((count_out!=0)&&(bDeviceState==CONFIGURED))

  {

  USB_To_USART_Send_Data(&buffer_out[0],count_out);//如果有数据将它发送到串口中去

  count_out=0;/////发送完后这个清零

  }

  }

  初看一下,还算比较好理解,但是由于这个例子好象只有发,没有收。我想它的收大约在中断中进行的(也就是串口向USB发的过程,估计在串口中断中进行,后面我们可以再分析,不行可能需要自行加上这部分代码,希望不要这样)

  我们还是一条一条的来看,首先看Set_System()这个函数,如果没猜错的话,应该是设置时钟吧。

  果然如此,我们下面一条一条看一下,它先是允许外部晶振---这里哆嗦一下,外部晶振我公司采用12M。而一般开发版采用8M。所以配置stm32f10x_conf.h文件中,要将外部晶振频率从8000000改为12000000。

  然后,等外部晶振起来,如果晶振没焊接好,此时就会死在这里。如果你一运行就死,可找一下这个地方。

  然后它做下列工作:

  允许FLASH取指缓冲

  FLASH时钟分频2倍-------这是否意味着FLASH的时钟是36M呢,记得好象有ST的文章中说FLASH可工作在50M的时钟下。

  系统频率HCLK配置成SYSCLK

  APB2的时钟配置成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_APB2PeriphClockCmd(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,它就是这两个脚的。至此这个部分结束了。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2717821.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存