900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > STM32 USB虚拟串口调试总结(内部晶振 外部晶振配置 硬件电路说明 测试方法)

STM32 USB虚拟串口调试总结(内部晶振 外部晶振配置 硬件电路说明 测试方法)

时间:2021-12-16 18:19:14

相关推荐

STM32 USB虚拟串口调试总结(内部晶振 外部晶振配置 硬件电路说明 测试方法)

目录

1、参考链接:

2、虚拟串口硬件说明

2.1、程序中无需配置硬件的设计:D+直接接了3.3V的上拉电阻。

2.2、需要程序中配置D+上拉电阻使能的设计:可以软件模拟USB插拔,便于固件更新后自动重启。

3、不同时钟源(内部RC、外部晶振)的USB时钟的配置方式

3.1、直接使用外部时钟8M晶振

3.2、时钟内部RC电路做系统时钟源

4、配置内部RC并倍频的方式说明:

官方代码移植有修改请参考以下链接,我们只针对其不足做补充说明。

1、参考链接:

STM32虚拟串口移植(提供了可用的源码,需要简单修改):/hiker-blogs/p/stm32_usb.html

官网虚拟串口里程移植,虚拟串口用到的文件介绍:/sz189981/article/details/65948071

USB较为详细的介绍、以及虚拟串口移植:/rannar/article/details/81589472

配置内部时钟方式:/qhw5279/article/details/77016341

STM32各种时钟说明、配置方式说明:/worldsing/p/3433529.html

使用内部RC振荡为系统提供时钟,HSI倍频设置:/qq_2255/article/details/72846555

STM32外部时钟稳定性问题:/unsv29/article/details/40947639

2、虚拟串口硬件说明

USBF103自带的USB符合USB2.0规范。

在USB主机上(电脑上),D-和D+都接了15K下拉电阻到地,所以没有设备接入时,D+和D-都是低电平。

在USB设备中(STM32主板),如果是高速设备,D+上接一个1.5K上拉电阻到VCC;如果是低速设备,D-上接入一个1.5k

上拉电阻到VCC。这样主机就能判断是否有设备接入,接入的设备是高速还是低速设备。

我们将STM32的USB口当高速设备使用:D+必须有一个1.5K上拉。

2.1、程序中无需配置硬件的设计:D+直接接了3.3V的上拉电阻。

2.2、需要程序中配置D+上拉电阻使能的设计:可以软件模拟USB插拔,便于固件更新后自动重启。

需要修改hw_config.c 文件中的函数:

void Set_System(void)函数中配置PD6引脚为输出PP模式

#define USB_DISCONNECTGPIOD#define USB_DISCONNECT_PINGPIO_Pin_6#define RCC_APB2Periph_GPIO_DISCONNECTRCC_APB2Periph_GPIOD/******************************************************************************** Function Name: Set_System* Description: Configures Main system clocks & power* Input: None.* Return: None.*******************************************************************************/void Set_System(void){GPIO_InitTypeDef GPIO_InitStructure;QUEUE_PacketCreate(&m_QueueUsbComRx, m_UsbComRxBuf, sizeof(m_UsbComRxBuf));QUEUE_PacketCreate(&m_QueueUsbComTx, m_UsbComTxBuf, sizeof(m_UsbComTxBuf));/* 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_PP;GPIO_Init(USB_DISCONNECT, &GPIO_InitStructure);/* Configure the EXTI line 18 connected internally to the USB IP */EXTI_ClearITPendingBit(EXTI_Line18);EXTI_InitStructure.EXTI_Line = EXTI_Line18;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);}

配置ENABLEUSB线的函数:一定要在ENABLE的时候让D+的上拉电阻是使能状态,也就是PNP的上激光的B级(1脚)给低电平

/******************************************************************************** Function Name: USB_Cable_Config* Description: Software Connection/Disconnection of USB Cable* Input: None.* Return: Status*******************************************************************************/void USB_Cable_Config (FunctionalState NewState){if (NewState ==ENABLE) //(NewState == DISABLE) //使能的时候D+ 上拉有效{GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);}else{GPIO_SetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);}}

3、不同时钟源(内部RC、外部晶振)的USB时钟的配置方式

3.1、直接使用外部时钟8M晶振

系统时钟倍频为72M,配置USB时钟分频为1.5倍,72/1.5 = 48M (USB时钟是48M)

hw_config.c 文件中USB时钟配置如下:

/******************************************************************************** Function Name: Set_USBClock* Description: Configures USB Clock input (48MHz)* Input: None.* Return: None.*******************************************************************************/void Set_USBClock(void){/* Select USBCLK source */RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);/* Enable the USB clock */RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);}

3.2、时钟内部RC电路做系统时钟源

内部RC输出8M,我们倍频为48M。

然后设置USB时钟分频为1倍。

hw_config.c 文件中USB时钟配置如下:

/******************************************************************************** Function Name: Set_USBClock* Description: Configures USB Clock input (48MHz)* Input: None.* Return: None.*******************************************************************************/void Set_USBClock(void){/* Select USBCLK source */RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_Div1);/* Enable the USB clock */RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);}

4、配置内部RC并倍频的方式说明:

参考了几位博主的方式,均失败,直接程序无法运行。

之后用以下方式解决:

1、不改变原来系统时钟配置方式;

2、按照博客在main.c定义这个博客的前两个函数:/qhw5279/article/details/77016341

3、删除其中中断向量表的设置。

4、在main函数开始位置调用此函数,进行系统时钟配置。 Stm32_Clock_Init(12);

5、为使delay_ms()等函数时钟准确,应在system_stm32f10x.c中将#define SYSCLK_FREQ_48MHz 48000000解除屏蔽

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。