

给stm32f103zet6单片机烧录程序成功 ,但运行程序时总是跑飞(标准库、HAL库、寄存器都一样),如图,pc寄存器跑飞的地址都一样。stlink烧录时boot0和boot1都设置的0。把boot0设置成1,用串口烧录且选中其带的“编译后执行功能”,可正常运行,但是复位或者重新上电后又是跑飞不能执行,这是什么问题呀。


晚上好🌙🌙🌙
本答案参考通义千问
你提到的问题是 STM32F103ZET6 单片机在烧录程序后运行时“跑飞”,并且无论使用标准库、HAL库还是寄存器方式都一样。这种问题通常与 程序启动机制、Flash配置、系统时钟、堆栈指针(SP)设置或硬件连接 有关。
根据你的描述:
这说明:
加粗重点:确保烧录工具与芯片匹配,并且 Flash 写入操作完成无误。
main() 开始处添加调试打印(如使用 USART)确认是否进入 main()。main(),说明 程序入口点错误。SystemInit() 是否被调用,尤其是对于 STM32F1 系列,SystemInit() 是必须的。// 示例:在 main 函数开始处添加调试输出
#include "stm32f103x6.h"
#include "stdio.h"
void SystemClock_Config(void);
void Error_Handler(void);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART2_UART_Init();
printf("Program started...\n"); // 假设已实现printf
while (1) {
// 主循环
}
}
加粗重点:确保
SystemClock_Config()被调用,否则可能导致时钟异常导致程序跑飞。
.s 文件中是否有如下代码(默认应为 0x20008000): .section .isr_vector
.align 4
.globl _estack
.extern __main
.type _estack, %object
_estack:
.word 0x20008000 @ Stack top
.word Reset_Handler
.word NMI_Handler
...
加粗重点:确保堆栈指针(SP)指向有效内存区域,否则程序无法正常启动。
加粗重点:确保程序大小不超过芯片 Flash 容量,并且起始地址正确。
加粗重点:确保 Boot0 和 Boot1 的配置与你期望的启动方式一致。
加粗重点:确保电源和复位电路稳定,避免因硬件问题导致程序异常。
main();SystemClock_Config() 是否被调用;void SystemClock_Config(void) {
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // 8MHz * 9 = 72MHz
RCC_PLLCmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while (RCC_GetSYSCLKSource() != 0x08);
}
加粗重点:确保
SystemClock_Config()正确配置系统时钟。
| 问题类型 | 解决方案 |
|----------|----------|
| Flash 写入失败 | 检查烧录工具配置,验证 Flash 内容 |
| 系统时钟未初始化 | 确保 SystemClock_Config() 被调用 |
| 堆栈指针错误 | 检查 .s 文件中的 SP 地址 |
| Boot0/Boot1 配置错误 | 确认启动方式与 Boot 引脚配置一致 |
| 电源或复位不稳定 | 检查电源和复位电路 |
如有更多具体错误信息(如报错、跑飞地址、代码片段等),欢迎继续提问,我可以进一步帮助你定位问题!