这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 利用ST官方USB库函数实现了USB转串口

共5条 1/1 1 跳转至

利用ST官方USB库函数实现了USB转串口

高工
2012-05-22 11:27:57     打赏

前言:
本来是想先实现按键中断 温度采集 电子时钟的
结果最近正好在看usb方面的东东 于是将st官方的usb类库下的usb转串口代码拿来修改了下 费了一个晚上 居然成功了!

正文:

STM官方USB例程的基础上修改,使得开发板实现USB转串口功能

我们的DIY开发板不知道为啥把usb的上拉引脚和COM1的引脚连在一起了 造成了在编写USB转串口的时候的一些麻烦

 

如果使用COM1

可分为两个方案

方案1 使用板子上的5V 或者 3.3V直接上拉

步骤:

1 需要将JP2直接接5V上拉

2 修改platform_config.h 文件 (其实不修改也行)

主要目的是在使用COM1口的时候 不能和PA10引脚冲突

#elif defined (USE_STM3210E_EVAL)

  #define USB_DISCONNECT                      0 

  #define USB_DISCONNECT_PIN                  0

  #define RCC_APB2Periph_GPIO_DISCONNECT      0

  #define EVAL_COM1_IRQHandler                USART1_IRQHandler

3 修改 hw_config.c 文件中的 void Set_System(void) 函数 主要是注释掉相关语句

#if !defined(STM32F10X_CL) && !defined(STM32L1XX_MD)

  /* Enable USB_DISCONNECT GPIO clock */

//  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_DISCONNECT, ENABLE);

 

  /* Configure USB pull-up pin */

//  GPIO_InitStructure.GPIO_Pin = USB_DISCONNECT_PIN;

//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;

//  GPIO_Init(USB_DISCONNECT, &GPIO_InitStructure);

#endif /* STM32F10X_CL && STM32L1XX_MD */

 

4 修改 hw_config.c文件中的 void USB_Cable_Config (FunctionalState NewState) 函数 主要是注释掉相关语句

#elif defined(USE_STM3210E_EVAL)

//  if (NewState != DISABLE)

//  {

//    GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);

//  }

//  else

//  {

//    GPIO_SetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);

//  }  

#else /* USE_STM3210B_EVAL or USE_STM3210E_EVAL */

 

方案2 使用STM某一个非COM1 引脚 上拉

步骤:

1 JP2 和某一个引脚将连接 本例子使用PA7

2 修改platform_config.h 文件

主要目的是在使用COM1口的时候 不能和PA10引脚冲突

#elif defined (USE_STM3210E_EVAL)

  #define USB_DISCONNECT                      GPIOA 

  #define USB_DISCONNECT_PIN                  GPIO_Pin_7

  #define RCC_APB2Periph_GPIO_DISCONNECT      RCC_APB2Periph_GPIOA

  #define EVAL_COM1_IRQHandler                USART1_IRQHandler

3 修改 hw_config.c 文件中的 void Set_System(void) 函数

#if !defined(STM32F10X_CL) && !defined(STM32L1XX_MD)

  /* Enable USB_DISCONNECT GPIO clock */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_DISCONNECT, ENABLE);

 

  /* Configure USB pull-up pin */

  GPIO_InitStructure.GPIO_Pin = USB_DISCONNECT_PIN;

//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  GPIO_Init(USB_DISCONNECT, &GPIO_InitStructure);

#endif /* STM32F10X_CL && STM32L1XX_MD */

4,修改 hw_config.c文件中的 void USB_Cable_Config (FunctionalState NewState) 函数

#elif defined(USE_STM3210E_EVAL)

  if (NewState != DISABLE)                       // 高电平使能

  {

  //  GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);

  GPIO_SetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);

  }

  else

  {

  //  GPIO_SetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);

   GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);

  }

 

问题:

在断电之后 有时候需要把jlink下载取下来才能识别USB

而且使用外部端口上拉的话 最后是从USB口取电,从外部电源取电的话 容易失败

 

如果使用COM2

需要做如下修改

开发打板子的时候 如何使用COM2

使用STM官方自带例程时候 对于Virtual_COM_Port例程

需要修改的内容

1platform_config.h 文件

#elif defined (USE_STM3210E_EVAL)

  #define USB_DISCONNECT                      GPIOA 

  #define USB_DISCONNECT_PIN                  GPIO_Pin_10

  #define RCC_APB2Periph_GPIO_DISCONNECT      RCC_APB2Periph_GPIOA

  #define EVAL_COM2_IRQHandler                USART2_IRQHandler

2stm32f10x_it.h文件

#if defined (USE_STM3210B_EVAL)

void USART1_IRQHandler(void);

#endif /* USE_STM3210B_EVAL */

 

#if defined (USE_STM3210E_EVAL)

void USART2_IRQHandler(void);

#endif /* USE_STM3210E_EVAL */

再将代码中的COM1 改为 COM2 USART1改为USART2

尤其是在串口初始化 以及 串口发送 中断函数 等函数中

3 修改 hw_config.c 文件中的 void Set_System(void) 函数

#if !defined(STM32F10X_CL) && !defined(STM32L1XX_MD)

  /* Enable USB_DISCONNECT GPIO clock */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_DISCONNECT, ENABLE);

 

  /* Configure USB pull-up pin */

  GPIO_InitStructure.GPIO_Pin = USB_DISCONNECT_PIN;

//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  GPIO_Init(USB_DISCONNECT, &GPIO_InitStructure);

#endif /* STM32F10X_CL && STM32L1XX_MD */

4,修改 hw_config.c文件中的 void USB_Cable_Config (FunctionalState NewState) 函数

#elif defined(USE_STM3210E_EVAL)

  if (NewState != DISABLE)                       // 高电平使能

  {

  //  GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);

  GPIO_SetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);

  }

  else

  {

  //  GPIO_SetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);

   GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);

  }

 

在下面的截图中 STMicroelecttonics Virtual Com Port 是用STM虚拟出的串口,Prolific USB-to-Serial Comm Port 是用别的USB转串口,和STM的串口1或者串口2相连

由于我是用的笔记本,没有串口,为了验证STM实现USB转串口模块,之后又用另一个USB转串口模块了,这一点可以在实物照片中可以看出来

 

附件分别是我实现的用USB转串口的代码,分别实现了COM1 COM2,(在STM32_USB-FS-Device_Lib_V3.3.0\Project文件夹里面)并附带了STM的库,以及ST官方提供的USB转串口驱动安装程序

 
我的代码 需要将其拷贝到ST的usb类库下的project文件夹下才能用

 ——回复可见内容——
在ST官网上找到相关链接
http://www.st.com/stonline/stappl/resourceSelector/app?page=resourceSelector&doctype=FIRMWARE&ClassID=1734
在这个里面找usb相关的内容
实际的USB类库链接
http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/um0424.zip
实际的usb转串口驱动链接
http://www.st.com/cn/com/SOFTWARE_RESOURCES/SW_COMPONENT/SW_DRIVER/stm32_vcp.zip
上几张图:





关键词: 利用     官方     函数     实现     串口     修改     使用     文件     d    

专家
2012-05-22 11:46:40     打赏
2楼
楼主的运气非常的不错啊!!

高工
2012-05-22 15:03:34     打赏
3楼

值得学习~

收入资料库!


助工
2012-05-22 18:14:33     打赏
4楼
很好,很详细。马上试试。

高工
2012-05-22 22:17:33     打赏
5楼
不错!

共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]