前言:
本来是想先实现按键中断 温度采集 电子时钟的
结果最近正好在看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例程
需要修改的内容
1,platform_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
2,stm32f10x_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
上几张图: