系统
Win11 x64
步骤
1. STM32CubeMx配置
(1) 新建STM32F103C8T6项目
(2) 选择调试/下载的方式, 我是用SWIO接口线, 也就是STLink线
(3) 时钟配置
(4) USB配置
开启USB
选择中间件并配置为虚拟串口
时钟配置
(5) 生成Keil项目
2. 代码实现USB串口调试
- 编译和下载代码, 查看系统是否识别
生成代码编译之后直接烧录到开发板,
从设备管理器看, 已经可以使用串口进行通讯了
- 使用接口发送数据, 串口接收数据
代码如下, 放到合适的位置, 间隔1s打印一次
#include <string.h>
#include "usbd_cdc_if.h"
char *dat = "你好世界\r\n";
uint32_t strLen = strlen(dat);
HAL_Delay(1000);
CDC_Transmit_FS((uint8_t*)dat, strLen+1);
- 效果
3. 目前问题
问题: 目前一直连接着进行固件升级会串口会无法访问
临时解决:
1. 拔插usb重新连接, 可以恢复串口访问;
2. 设备管理器卸载、刷新设备可以恢复串口访问;
最终解决方案
1. 将 PA11/PA12 USB D+和D-引脚拉低一定时间, 系统自动识别断开;
2. UsbReset函数在 USB初始化函数前执行。
void UsbReset(void)
{
GPIO_InitTypeDef GPIO_InitStruct = { 0 };
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);
/*Configure GPIO pin : PA12 */
GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_Delay(10);
}
int main(void)
{
...
UsbReset();
MX_GPIO_Init();
MX_USB_DEVICE_Init();
}
4. 其他
- 烧录之后自动复位运行程序
勾选之后下载完程序会自动复位, 不需要重新断电上电
如果上面不生效, 加上下面的操作, 去掉下图勾选
- 使用标准库
在使用stdio.h等标准库时程序不会宕机掉!