STM32F103C8T6板: 使用USB调试

系统

Win11 x64

步骤

1. STM32CubeMx配置

(1) 新建STM32F103C8T6项目
(2) 选择调试/下载的方式, 我是用SWIO接口线, 也就是STLink线

在这里插入图片描述

(3) 时钟配置

在这里插入图片描述
在这里插入图片描述

(4) USB配置

开启USB
在这里插入图片描述
选择中间件并配置为虚拟串口
在这里插入图片描述
时钟配置
在这里插入图片描述

(5) 生成Keil项目

在这里插入图片描述

在这里插入图片描述

2. 代码实现USB串口调试

  1. 编译和下载代码, 查看系统是否识别
    生成代码编译之后直接烧录到开发板,
    从设备管理器看, 已经可以使用串口进行通讯了
    在这里插入图片描述
  2. 使用接口发送数据, 串口接收数据
    代码如下, 放到合适的位置, 间隔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);
  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. 其他

  1. 烧录之后自动复位运行程序
    勾选之后下载完程序会自动复位, 不需要重新断电上电
    在这里插入图片描述
    如果上面不生效, 加上下面的操作, 去掉下图勾选

在这里插入图片描述

  1. 使用标准库
    在使用stdio.h等标准库时程序不会宕机掉!
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听我一言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值