(1)堆栈溢出(Stack Overflow)
如果程序运行到某个函数(如 usart_reset)时突然停止,可能是 局部变量过多、递归调用过深或中断嵌套过深,导致堆栈溢出。
检查方法:
在 startup_*.s 文件中调整堆栈大小(如 Stack_Size 和 Heap_Size)。
在 map 文件或 MDK 的编译输出中查看堆栈使用情况。
(2)中断向量表异常
T-bit (Thumb bit) 错误(XPSR.T = 0)通常意味着 CPU 尝试执行 ARM 模式(非 Thumb 模式)代码,但 Cortex-M 只支持 Thumb-2 指令集。
可能原因:
中断向量表未对齐或损坏(如 VTOR 寄存器指向错误地址)。
中断服务函数(ISR)未正确声明(如 __attribute__((weak)) 或未实现)。
检查方法:
确认 SystemInit() 是否正确初始化 SCB->VTOR(确保指向正确的 Flash/ROM 地址)。
检查 .map 文件,确认所有中断向量(如 USARTx_IRQHandler)是否正确定义。
(3)USART 外设配置问题
如果总是在 usart_reset 函数卡死,可能是 USART 初始化或 DMA/中断配置错误,导致 总线访问冲突(如 USART 时钟未使能、寄存器访问越界)。
检查方法:
确保 RCC->APBxENR 已正确使能 USART 时钟。
检查 USART 的 GPIO 配置(如 AF 复用功能是否正确)。
如果使用 DMA,检查 DMA_Init() 配置是否正确(如缓冲区地址、传输长度)。
(4)JTAG/SWD 调试接口干扰
J-Link 报错 CPU is not halted 可能由于 调试接口受干扰(如 SWD 线太长、未正确上拉)。
检查方法:
缩短调试线,确保 SWDIO 和 SWCLK 有适当上拉(如 4.7kΩ 到 3.3V)。
尝试降低 J-Link 的调试速度(如从 1MHz 降到 100kHz)。
(5)电源/复位问题
电压不稳或复位信号异常 可能导致 CPU 运行异常。
检查方法:
用示波器检查 VDD 和 NRST 引脚是否稳定。
检查 BOR(Brown-Out Reset)配置,确保电压跌落时不会意外复位。
|