搜索
bottom↓
回复: 21

调试STM32虚拟串口成功,特地分享一下,但还存在问题!

[复制链接]

出0入0汤圆

发表于 2012-7-16 20:48:35 | 显示全部楼层 |阅读模式
芯片为STM32F103RB,来源于
http://www.st.com/internet/mcu/product/164492.jsp 官方库
整了5天了,USB真是复杂啊,小弟不才,自认为只掌握了很少的一部分。
首先要注意上拉电阻电路,我的是

有些板子不同,带的是三极管控制要注意
所以在hw_config.c中
void USB_Cable_Config (FunctionalState NewState)
{
  if (NewState != DISABLE)
  {
     GPIO_SetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);
  }
  else
  {
    GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);
  }
}注意两个函数的位置,自己调换一下即可。
while( !((_GetENDPOINT(ENDP1) & EPTX_STAT) == EP_TX_NAK) );这可以判断发送是否成功,或者可以找中断函数EP1_OUT_CALLBACK(),注意修改它的宏定义。
测试速率条件不同结果也不同,串口开显示速率大约为30KB/S,不开的话可以到上百K。
程序中还用了一个定时器,1s溢出测试发送速率。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2012-7-16 21:01:42 | 显示全部楼层
好东西,谢谢分享了。

出0入0汤圆

发表于 2012-7-22 17:20:27 | 显示全部楼层
我也在做,stm32f103vet6的,在野火开发板上实验,你测得速度怎么远远小于1.5MB/S呢?什么原因影响了传输速率?你是单向传输吗即从stm32到电脑,是单个缓冲区还是双个?

出0入0汤圆

发表于 2012-7-22 17:31:51 | 显示全部楼层
没搞过的路过!

出0入0汤圆

发表于 2012-7-22 19:11:35 | 显示全部楼层
楼主怎么整的? 官方的库不是直接就能用的吗。我在奋斗板子上用过,下载就能用,115200狂发数据都没问题。
头像被屏蔽

出0入0汤圆

发表于 2012-7-22 19:27:03 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

 楼主| 发表于 2012-7-22 21:58:16 | 显示全部楼层
dingshidong214 发表于 2012-7-22 17:20
我也在做,stm32f103vet6的,在野火开发板上实验,你测得速度怎么远远小于1.5MB/S呢?什么原因影响了传输速 ...

是显示占用时间了,呵呵,我的开发板和你们不同,上拉电阻设置方式不同,所以搞得久,我自己写了个串口接收,可以到500KB。是单缓冲,一次性发60b

出0入0汤圆

发表于 2012-7-22 23:09:57 | 显示全部楼层
bbs2009 发表于 2012-7-22 19:27
貌似  STM32F10X  USB 批量传输 开双缓冲 也就到 900KB/S , 单缓冲  500KB/S 。

你做到 1。5MB/S   了 ...

没有做到,怎么才能做到12Mbps?有没有可操作的可能性。

出0入0汤圆

发表于 2012-7-22 23:10:37 | 显示全部楼层
mcu1815 发表于 2012-7-22 21:58
是显示占用时间了,呵呵,我的开发板和你们不同,上拉电阻设置方式不同,所以搞得久,我自己写了个串口接 ...

500KB/S的不错了

出0入0汤圆

发表于 2012-7-22 23:57:47 | 显示全部楼层
mcu1815 发表于 2012-7-22 21:58
是显示占用时间了,呵呵,我的开发板和你们不同,上拉电阻设置方式不同,所以搞得久,我自己写了个串口接 ...

有两个问题:1、u8数组tx_buff1,64个字节,发送的时候为何设置为USB_Send_Data(tx_buff1,60),而不一次全部发送64字节呢?
2、主函数里:
  Delay(0x3FFFFF);
  Delay(0x3FFFFF);
  Delay(0x3FFFFF);
  Delay(0x3FFFFF);
  Delay(0x3FFFFF);
  Delay(0x3FFFFF);
  Delay(0x3FFFFF);
  Delay(0x3FFFFF);
为什么加了8个Delay?
3、加入通过usb发的数据l量更多呢,比如10000字节?类型是u16?
4、有没有测试传输速率的小软件?

出0入0汤圆

 楼主| 发表于 2012-7-23 09:30:18 | 显示全部楼层
dingshidong214 发表于 2012-7-22 23:57
有两个问题:1、u8数组tx_buff1,64个字节,发送的时候为何设置为USB_Send_Data(tx_buff1,60),而不一次 ...

1.发送64B不行,发送60B就可以,这个我也不是很清楚为什么会是这样。
2.延时主要是为了让你有时间打开串口调试助手,因为虚拟串口不像一般串口,你按下单片机复位,串口才打开,延时间,你就可以打开串口了。注意要装驱动。
3.这个是自己用VC6.0改的,单纯计数的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-7-23 10:48:06 | 显示全部楼层
一次发送64bytes是可以的。但是由于缓冲区最大就是64,所以发送完64bytes之后,还要发个空字节,是个小技巧。这在论坛里面讨论过的,楼主找找之前的帖子就可以了。

出0入0汤圆

发表于 2012-7-23 13:27:55 | 显示全部楼层
mcu1815 发表于 2012-7-23 09:30
1.发送64B不行,发送60B就可以,这个我也不是很清楚为什么会是这样。
2.延时主要是为了让你有时间打开串 ...

int main(void)
{
  u8 a[64] = {0x04,0x40,0x0E,0x50,0x78,0x48,0x08,0x48,0x08,0x40,0xFF,0xFE,0x08,0x40,0x08,0x44,
0x0A,0x44,0x0C,0x48,0x18,0x30,0x68,0x22,0x08,0x52,0x08,0x8A,0x2B,0x06,0x10,0x02,
0x00,0x40,0x00,0x40,0x78,0xA0,0x49,0x10,0x4A,0x08,0x4D,0xF6,0x48,0x40,0x48,0x40,
0x4F,0xFC,0x48,0x40,0x78,0x40,0x4B,0xF8,0x02,0x08,0x02,0x08,0x03,0xF8,0x02,0x08
}; //数组
  Init_System();//系统初始化  
  Set_USBClock();//设置USB时钟
  USB_Interrupts_Config(); //配置USB中断
  USB_Init();//初始化USB  
while (1)
  {         
      USB_Send_Data(a, 64);  
  }


void USB_Send_Data(u16* data_buffer, u8 len)  //调用的此函数发送数组
{  
  count_in=len;  
  UserToPMABufferCopy(data_buffer, ENDP1_TXADDR, count_in);  
  SetEPTxCount(ENDP1, count_in);  
  SetEPTxValid(ENDP1);  
}


你试试这个,看能不能发送64个,如果不行,将数组改为63.

出0入0汤圆

发表于 2012-11-8 13:50:50 | 显示全部楼层
调不出来,程序死在  NOP_Process();

void Virtual_Com_Port_init(void)
{

  pInformation->Current_Configuration = 0;
  /* Connect the device */
  PowerOn();
  /* USB interrupts initialization */
  /* clear pending interrupts */
  _SetISTR(0);
  wInterrupt_Mask = IMR_MSK;
  /* set interrupts mask */
  _SetCNTR(wInterrupt_Mask);
  pInformation->Current_Feature = Virtual_Com_Port_ConfigDescriptor[7];
  /* configure the USART 1 to the default settings */
  USART_Config_Default();
  /* Wait until device is configured */
  while (pInformation->Current_Configuration == 0)
  {
    NOP_Process();
  }
  bDeviceState = CONFIGURED;
}

出0入0汤圆

发表于 2012-11-8 19:55:48 | 显示全部楼层
在这个程序里加入连续发送程序就走飞了, 单步走可以
int main(void)
{
  u32 delay;
  Init_System();//系统初始化
  
  Set_USBClock();//设置USB时钟
  USB_Interrupts_Config(); //配置USB中断
  
  USB_Init();//初始化USB  
  
  
       
   GPIO_SetBits(GPIOB, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 ); //关闭3个LED
                  while(1)
         {
          
                      /*copy InBuffer to ENDP1 Tx Packet Memory Area*/
                     UserToPMABufferCopy(InBuffer, ENDP1_TXADDR, 63);
                     SetEPTxCount(ENDP1, 63);
                     /* enable endpoint for transmission */
                    SetEPTxValid(ENDP1);
          
         }

出0入0汤圆

发表于 2012-11-8 21:54:17 | 显示全部楼层
用虚拟串口,最后必让你头破血流,不解释。

出0入0汤圆

发表于 2012-11-10 20:43:01 | 显示全部楼层
加了延时能勉强发一会,发快了主机就会没反应, 下位机 void EP1_IN_Callback(void) 函数就不执行了
int main(void)
{
  u32 delay;
  Init_System();//系统初始化
  
  Set_USBClock();//设置USB时钟
  USB_Interrupts_Config(); //配置USB中断
  
  USB_Init();//初始化USB  
  
  
       
   GPIO_SetBits(GPIOB, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 ); //关闭3个LED
   
  while (1)
  {
         while(1)
         {
       
      /*copy InBuffer to ENDP1 Tx Packet Memory Area*/

      UserToPMABufferCopy(InBuffer, ENDP1_TXADDR, 63);
      SetEPTxCount(ENDP1, 63);
          count_in=64;
      /* enable endpoint for transmission */
      SetEPTxValid(ENDP1);
          for(delay=0;delay<2000000;delay++);

         }
            

出0入0汤圆

发表于 2013-3-18 10:50:33 | 显示全部楼层
好东西,收藏了

出0入0汤圆

发表于 2013-3-27 21:04:35 | 显示全部楼层
好东西,收藏了

出0入0汤圆

发表于 2013-5-6 15:29:49 | 显示全部楼层
root_007 发表于 2012-11-8 21:54
用虚拟串口,最后必让你头破血流,不解释。

我也觉得虚拟串口不是很好用,很多问题
比如:PC机的机制问题,每次的虚拟串口句柄都不一样,不同的电脑串口号不一样 等等
我也在想怎么能把虚拟串口去掉,做成纯粹的usb传输
不知您有没有好的建议?

出0入0汤圆

发表于 2013-5-26 23:26:17 | 显示全部楼层
大家都说虚拟串口麻烦。

出0入0汤圆

发表于 2014-1-6 10:58:56 | 显示全部楼层
MARK ,  在搞虚拟串口。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-28 10:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表