STM32常用的几种调试方式

一、串口调试

我们可以使用串口(USART)打印调试信息,通过串口调试助手显示调试信息,比如,定义一个变量a,通过printf打印a的值,直接打印当然是不行的,因为printf默认输出到控制台,所以要进行串口重定向

#include <stdio.h>

int fputc(int ch, FILE * f)
{
	HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,1000);
	return ch;
}

除了串口重定向,我们也可以自己封装一个串口的printf函数

#include <stdarg.h>

void Serial_SendString(char *String)
{
	uint8_t i;
	for (i = 0; String[i] != '\0'; i ++)
	{
		HAL_UART_Transmit(&huart1,(uint8_t *)&String[i],1,1000);
	}
}

void Serial_Printf(char *format, ...) 
{
	char String[100];
	va_list arg;
	va_start(arg, format);
	vsprintf(String, format, arg);
	va_end(arg);
	Serial_SendString(String);
}

通过三种方法,打印输出a的值

  int a = 100;
  printf("a:%d\r\n",a);
  
  char array[100] = {0};
  sprintf(array,"a:%d\r\n",a);
  Serial_SendString(array);
  
  Serial_Printf("a:%d\r\n",a);

串口调试助手上显示的信息

二、显示屏调试

除了通过串口,我们还可以通过显示屏显示调试信息,例如,利用0.96寸的OLED12864显示GPIOA端口的值

  OLED_Printf(0,0,OLED_8X16,"GPIOA:%x",GPIOA->ODR);
  OLED_Update();

OLED模块代码获取地址:【免费】江协科技0.96寸OLED驱动函数(HAL库移植)资源-CSDN文库

三、Keil软件仿真

我们可以通过Keil的软件仿真功能,在Keil上仿真STM32

首先,我们需要正确填写晶振的频率,不然会导致仿真结果不正确

按照下图配置好仿真的参数

点击Debug,进入调试模式

在进入调试模式后,我们发现在行号的左边,有一些灰色和绿色的方块,黄色箭头和蓝色箭头

绿色方块所在行的代码是已经执行过的代码

灰色方块所在行的代码是还未执行的代码

黄色箭头指向程序暂停处

蓝色箭头指向光标所在行

在复位按键的附近,有一些按钮

①复位

②全速运行

③停止

④单步运行:一行一行地执行,遇到函数则进入函数内部一行一行地执行

⑤一行一行地执行(不会进入函数内部)

⑥跳出当前函数

⑦运行到光标所在行

如果我们打上断点,则程序运行到断点所在行暂停(此时断点所在行的代码并没有执行)

在Debug按钮的右边,有一些按钮可以设置断点

①在光标所在行插入/删除断点

②在光标所在行使能/失能断点(失能后的断点是白色的,白色的断点是无效的断点)

③失能所有断点

④删除所有断点

接下来介绍一些常用的窗口

①Command Window(命令窗口),可以通过输入一些命令完成某些功能,例如,将变量a和数组array添加到Watch1中

②Disassembly Window(反汇编窗口),可以显示程序的汇编代码

③Symbols Window(符号窗口),可以显示标识符在内存中的位置和类型

比如,我们在其搜索框中搜索变量i,则下方就会列出其详细信息,包括它在哪个文件中,哪个函数中

④Registers Window(寄存器窗口),可以显示寄存器的内容, 操作模式以及系统和内部状态

⑤Call Stack Window(调用堆栈和局部变量窗口),它可以显示目前在Stack上的函数或者变量的位置/值和类型,主要还是显示局部变量

⑥Watch Windows,有Watch1和Watch2,主要用来显示变量和数组或者结构体变量的值和类型,需要将其手动添加到watch窗口,才能显示(Watch窗口除了能查看变量的值,还能修改变量的值)

添加到Watch窗口的方法:选中要添加到Watch窗口的变量,右键→Add....to....→Watch1/Watch2

⑦Memory Windows(内存窗口), 显示内存区域内容,可以通过右键添加到内存窗口;例如,显示数组array,一样可以修改内存中的值,还能以不同的格式显示

⑧Serial Windows(串行窗口),通过USART打印的数据,会显示在串行窗口上,其作用相当于串口调试助手

⑨Analysis Windows(逻辑分析仪窗口),我们可以用它来显示引脚输出的波形;例如,使用TIM2的通道1输出一个PWM波,这里需要注意,要在View菜单中勾选Periodic Window Update,不然只有在程序暂停的时候才会更新波形

滚动鼠标滚轮,可以调节波形的大小,上面的图中grid的值为0.5ms,表示一格为0.5ms;除此之外,还能通过Load和Save导入或保存波形

⑩System Viewer Windows,它可以显示和修改外设寄存器的值

如果不小心把窗口弄乱了,想要复位所有窗口,点击Windows菜单→Reset View to Defaults→Reset

要在软件仿真中操作外设,通过System Viewer非常地麻烦,可以通过Peripheral菜单中的选项来操作外设

例如,在Peripherals菜单中的GPIO窗口中,模拟按键按下,在此窗口中,打勾的位为高电平,没有打勾的为低电平,假设按键按下为低电平,那么在程序开始前应该将对应的位置高电平(打勾),程序开始后,置低电平(取消勾选)表示按键按下,置高电平(打勾)表示按键松手,这样就完成了一次按键按下。

关于Debug模式的更多用法可以访问Keil官网查看:μVision 用户指南:调试

四、Keil硬件仿真

首先我们将仿真器(如ST-Link)与单片机相连,以ST-Link为例,SWDIO与单片机的DIO相连,GND与GND相连,SWCLK接单片机的DCLK,3.3V接3.3V,可以参照江协科技画的这张图连线

接下来进行一些配置

然后点击Debug,进入调试模式,若STM32CubeMX生成的HAL库工程无法调试,则注释HAL_Init中HAL_MspInit中的__HAL_RCC_PWR_CLK_ENABLE和__HAL_AFIO_REMAP_SWJ_NOJTAG后可以正常进行调试。(在stm32f1xx_hal_msp.c文件中)。

注释这两行代码后即可正常调试

硬件仿真和软件仿真的使用方法基本相同,除了逻辑分析仪(Analysis Windows)和串行窗口(Serial Windows)硬件仿真无法使用外,其他功能基本和软件仿真相同。

软件仿真是通过软件模拟运行的,而硬件仿真是将程序下载到开发板中运行的,所以硬件仿真的性能优于软件仿真

### STM32 支持的主要开发方式 #### 使用集成开发环境 (IDE) STM32 的开发可以通过多种 IDE 实现,其中最常用的是: - **STM32CubeIDE**:这款由意法半导体官方推出的 IDE 完全开源免费,并具备跨平台特性,适用于 Windows、Linux 和 macOS 多种操作系统。它专为 ST 芯片设计,在功能上可以与 MDK 媲美[^1]。 - **Keil MDK**:虽然 Keil 主要以其广泛的芯片兼容性著称,但对于希望获得更广泛硬件支持的开发者来说仍然是一个不错的选择。不过需要注意的是,MDK 并不是专门为 STM32 设计的,因此某些特定于 ST 芯片的功能可能不如 STM32CubeIDE 那样优化良好。 #### 编程工具 对于实际编写代码并将其下载到目标设备而言,有几种不同的编程工具可供选择: - **STM32CubeProgrammer(原名 ST-LINK Utility 或者简称 STVP)**:这是当前推荐使用的最新版本编程工具,能够很好地适配现代 STM32 系列产品。相比之下,旧版的 STVP 工具已经停止维护,不再适合新项目使用[^2]。 - **ST-LINK/V2 接口**:作为物理连接件,通过 USB 连接到 PC 上运行上述任一款软件来完成程序上传及调试工作。该接口还允许实时监控 CPU 寄存器状态等高级操作[^4]。 #### 开发流程中的其他组件 构建完整的开发环境还需要考虑以下几个方面: - **编译器**:无论是选用 GCC 还是 ARM Compiler 6,都需要确保其版本与所选 IDE 兼容。 - **库文件和支持包**:利用 HAL 库或 LL 库简化底层驱动程序编码过程;同时安装相应的固件包以便访问最新的外设配置选项[^3]。 ```c // 示例 C 语言代码片段展示如何初始化 GPIO 引脚 #include "stm32f1xx_hal.h" void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void){ // 初始化系统时钟 SystemClock_Config(); // 初始化所有已配置的外围设备 MX_GPIO_Init(); while (1){ // 用户应用程序逻辑... } } static void MX_GPIO_Init(void){ __HAL_RCC_GPIOD_CLK_ENABLE(); // 启用 GPIOD 时钟 GPIO_InitTypeDef GPIO_InitStruct = {0}; /* 配置 LED 所在引脚 */ GPIO_InitStruct.Pin = 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(GPIOD, &GPIO_InitStruct); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值