打印
[MM32硬件]

常见软件调试问题及技巧

[复制链接]
788|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jzzllv|  楼主 | 2025-6-22 09:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序跑飞 / 死循环
判断方式:

程序运行一段时间后无响应;

逻辑异常,变量值异常突变。

解决方法:

开启中断向量表定位 HardFault:在 HardFault_Handler 中添加调试代码打印栈地址;

设置断点或添加 watchdog,快速发现程序卡住的位置;

使用 Map 文件分析函数占用,查找堆栈是否溢出;

确认中断优先级配置是否合理,避免中断嵌套导致不可预期行为。

2️⃣ 外设初始化无效 / 配置错误
常见场景:

Timer 没有触发中断;

UART 无法发送接收;

GPIO 无电平变化。

调试建议:

打印调试信息(如 printf("UART Init Done\r\n"))验证代码走到;

检查 RCC 时钟是否开启相应外设;

用断点逐步调试,确保各初始化函数返回值正确;

检查是否调用 HAL/LL 驱动函数顺序错误。

3️⃣ 数据通信异常(SPI / I2C / UART)
调试重点:

波形分析:逻辑分析仪或示波器抓波形是最直接的方法;

SPI 是否配置正确时序模式(CPOL/CPHA);

UART 波特率是否一致,是否开启校验位;

是否存在 DMA 溢出 / 缓冲区冲突问题。

使用特权

评论回复
沙发
xiaoqizi| | 2025-7-3 18:31 | 只看该作者
程序运行异常问题有死机/卡死,跑飞,硬件错误异常触发,数据异常

使用特权

评论回复
板凳
木木guainv| | 2025-7-3 20:50 | 只看该作者
GPIO异常  定时器不准  通信故障  中断异常

使用特权

评论回复
地板
Jiangxiaopi| | 2025-7-3 23:07 | 只看该作者
可以使用指示灯调试法:HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); // 在关键位置插入LED翻转

使用特权

评论回复
5
荣陶陶| | 2025-7-4 09:22 | 只看该作者
可以合理使用断点与单步执行

使用特权

评论回复
6
Zhiniaocun| | 2025-7-4 11:41 | 只看该作者
如果内存不足的话  会导致栈溢出或堆分配失败

使用特权

评论回复
7
Zuocidian| | 2025-7-4 13:56 | 只看该作者
非特权模式下禁止的操作:
修改 [size=0.875em]NVIC[size=0.875em]SCB 等系统寄存器
执行 [size=0.875em]MSR 修改特殊寄存器(如 [size=0.875em]PRIMASK
访问被 MPU 保护的内存区域

使用特权

评论回复
8
Puchou| | 2025-7-4 16:20 | 只看该作者
// 使用DWT周期计数器
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
uint32_t start = DWT->CYCCNT;
// 被测代码
uint32_t end = DWT->CYCCNT;
uint32_t cycles = end - start;

使用特权

评论回复
9
Xiashiqi| | 2025-7-4 18:32 | 只看该作者
我们可以采用预防性的措施比如认为注入错误信息看软件的反应

使用特权

评论回复
10
小海师| | 2025-7-4 20:50 | 只看该作者
HardFault分析:
void HardFault_Handler(void) {
  __asm volatile (
    "tst lr, #4 \n"
    "ite eq \n"
    "mrseq r0, msp \n"
    "mrsne r0, psp \n"
    "ldr r1, [r0, #24] \n"
    "b HardFault_Dump \n"
  );
  while(1);
}

使用特权

评论回复
11
Haizangwang| | 2025-7-4 23:01 | 只看该作者
// 通过特定串口指令触发调试功能
if(strcmp(cmd, "DEBUG_DUMP") == 0) {
  dump_internal_state();
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

55

帖子

0

粉丝