文号
944574
阅读
3243
回复
0
收藏
0
所有教程由网友发布,仅供参考,请谨慎采纳。科创不对教程的科学性、准确性、可靠性负责。
Keil5不复位调试+USB虚拟串口随笔
2025/06/03
原创
IP:广东

前言:有时候会用到不复位调试功能,在这里记录一下,省得每次都要谷歌翻资料。使用的程序功能是USB虚拟串口上传数据。


正文:

1、USB功能依赖较为复杂,这里直接使用CubeMX生成初始化代码。使用48M内部RC时钟。

image.png

配置外设。

image.png

使用CubeMX生成的USB库,并选择虚拟串口。

image.png

还有些配置烧录口文件路径等操作都大同小异,这里就不写了。


2、生成代码&编写关键业务代码&编译烧录

......
#include "usbd_cdc_if.h"
......
uint8_t text[100];
int i=0;
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USB_DEVICE_Init();
  /* USER CODE BEGIN 2 */
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		sprintf((char *)text,"%d\r\n",i++);
		CDC_Transmit_FS(text,sizeof(text));
		HAL_Delay(1);
		if(i==10000) 
                  while(1);//计数到10000就锁死
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}


3、更改烧录器配置,防止Debug破坏现场

image.png

image.png

image.png


4、进入Debug,我们可以看到代码行不允许打断点也不知道运行到哪行。

image.png

使用下面指令加载编译生成的.axf 文件到 MDK 中,该文件包含 bin 代码和调试相关的各种符号信息,以定位 C 源码,输入完滚动下鼠标刷新页面。

LOAD %L INCREMENTAL

image.png

现在和正常的Debug一样了点击Run然后Stop,可以看到程序停在了While(1)中且虚拟串口无输出,和预期现象一致,通过这个方法可以实现MCU不复位调试。

image.png


5、如果需要重新烧录要恢复Keil和烧录器的配置。


结束语:喵


END


笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的