STM32 jtag调试程序时程序跑飞

本文探讨了在使用Keil MDK V5.10进行STM32F103C8硬件调试时遇到的问题,即在全速运行时程序出现跑飞现象。问题根源在于芯片JTAG引脚复用,在程序初始化阶段被映射为普通IO引脚,导致JTAG无法正常工作。同时,文章分析了看门狗开启时,单步调试可能引发的JTAG故障,以及如何通过重新配置JTAG引脚和避免看门狗干扰来解决此类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发环境:keil MDK V5.10

操作系统:windows 7(32位)

目标硬件:STM32F103C8

问题描述:在使用jtag对某软件进行调试的时候,KEIL可以正常的进行软件下载,一旦使用F5全速运行时,立即发现程序跑飞了,暂停后汇编代码显示“MOVS R0 R0”。程序跑飞的时候可以看到目标设备程序执行过程正常(灯正常闪烁,串口调试信息正常输出)。


问题原因:芯片的JTAG引脚被复用,在程序初始化阶段将JTAG引脚remap为了普通的IO引脚导致。


PS:在使用JTAG进行程序调试的时候,如果程序中开了看门狗,调试程序进行了单步调试的情况也可能导致JTAG无法正常使用,因为目标设备的看门狗不能因为单步执行而暂停,从而导致在JTAG在线调试的单步执行或者暂停执行的情况下,目标设备由于看门狗不能暂停,已经导致硬件复位,从而脱离JTAG的调试模式,导致看起来程序跑飞。

### STM32F103C8T6 FreeRTOS 程序无法启动解决方案 #### 可能原因分析 当遇到STM32F103C8T6与FreeRTOS结合使用程序无法正常运行的情况,通常有以下几个可能的原因: - **配置错误**:如果初始化过程中某些参数设置不当,可能导致系统未能正确进入多任务调度状态[^1]。 - **堆栈溢出**:每个任务都需要分配一定的堆栈空间。若堆栈大小不足,则可能会引发异常中断或死循环等问题[^2]。 - **优先级倒置**:不合理的任务优先级设定会干扰正常的任务切换逻辑,进而影响整个系统的稳定性。 #### 解决方法 针对上述提到的各种可能性,建议采取如下措施来排查并解决问题: ##### 配置检查 确认`FreeRTOSConfig.h`中的宏定义是否合理,特别是关于钟频率、滴答定器周期以及最大允许的任务数等关键参数的设定应符合实际需求。 ```c #define configCPU_CLOCK_HZ ( SystemCoreClock ) #define configTICK_RATE_HZ ((TickType_t)1000) #define configMAX_PRIORITIES (5u) ``` ##### 堆栈调整 适当增加默认堆栈尺寸(`configMINIMAL_STACK_SIZE`)以防止潜在的堆栈溢出现象发生;对于特定高负载任务还可以单独为其指定更大的堆栈容量。 ```c // 修改最小堆栈大小 #define configMINIMAL_STACK_SIZE (128) // 创建具有较大堆栈的任务实例 xTaskCreate( vTaskCode, /* Task function */ "TASK_NAME", /* String with name of task */ STACK_SIZE_LARGE, /* Stack size in words, not bytes */ NULL, /* Parameter passed into task */ tskIDLE_PRIORITY + 1,/* Priority at which the task is created */ &xHandle /* Used to pass out the created task's handle */ ); ``` ##### 调试辅助工具应用 利用串口打印调试信息可以帮助定位具体哪个环节出现了阻塞或者崩溃状况。另外也可以借助JTAG/SWD接口连接专业的硬件仿真器来进行更深入细致地跟踪分析[^3]。 ```c void vApplicationMallocFailedHook(void){ printf("Memory allocation failed\r\n"); } void vApplicationStackOverflowHook(TaskHandle_t pxTask, char *pcTaskName){ printf("stack overflow in %s!\r\n", pcTaskName ? pcTaskName : "<unknown>"); } ``` 通过以上几个方面的优化改进,应该能够有效提高基于STM32F103C8T6平台下FreeRTOS应用程序的成功率和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值