解决STM32程序一烧录进去断电或复位即丢失问题

本文分享了一次STM32F103RCT6芯片ISP下载失败的故障排查经历,作者通过检查BOOT配置和测量BOOT0及BOOT1引脚电压,最终定位问题在于三极管接错导致的BOOT配置错误。

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

分享一下个人错误经验,之前焊接了一块STM32F103RCT6芯片,配了ISP自动下载电路,焊接好后上电烧写发现可以烧录进去,但是怎么一断电或者一复位怎么程序就没了,连一个简单的LED程序都会没了。一想不对劲,BOOT配置也正常啊,难道我的ISP不行,于是就手动下载,我去结果也不可以。

于是怀疑难道是没有下载到ROM里面,只存在RAM里面,掉电就给我丢失了?
查了一下网上,有人说是可能是没有下载到ROM里面,有人说BOOT配置不对,有人说硬件电路有问题,于是我就查啊查,果然被我发现了,用万用表一查发现我的BOOT0的电压不接VCC怎么都有4.5V左右,而BOOT1的电压则只有0.4V左右,一想不对劲,于是一看我去是三极管接错了,造成我的BOOT配置也错了。难怪程序一下载断电就没了。查了一下技术手册,发现boot的配置如图
在这里插入图片描述
按理说应该是可以烧录进FLASH里面,但是板子重启后程序跑不起来,因此可能是三极管出错BOOT配置混乱,造成没有选择主闪存存储器被选为启动区域。

所以经验分享,如果发现自己做的板子如果配了ISP下载电路或者手动下载发现程序烧录完一断电或者复位程序就没了,一定要检查一下自己的BOOT配置是否正确以及BOOT0和BOOT1这两个引脚的电压是否正常!!!

另外在烧录时候发现虽然我的boot配置不对,但是修改烧写器的配置竟然可以成功下载一次,也不知道什么原因,也拿出来分享一下。烧写器配置如图所示:
在这里插入图片描述

本人水平有限,上述信息仅供学习参考,如有错误和不妥之处,请多多指教。
另外创作不易,请勿抄袭,如果有帮助到大家的话希望大家可以点个赞,谢谢~

<think>好的,我现在要帮助用户解决将旧Keil项目迁移到新工程的问题。首先,我需要理解用户的具体情况。用户提到他们的代码烧录后无法运行,调试时卡在不明位置,怀疑是旧工程与新版本Keil不兼容。因此,用户想将现有代码迁移到新工程环境中。 接下来,我应该考虑迁移过程中可能遇到的问题。旧项目可能使用了过时的库编译器版本,导致与新Keil版本不兼容。此外,项目配置如芯片型号、启动文件、链接脚本等可能也需要更新。 首先,我需要指导用户如何正确创建新工程。这包括选择合适的芯片型号,因为旧项目可能基于较旧的微控制器型号,而新版本的Keil可能不再支持某些旧型号,者需要安装对应的设备包。用户需要确认当前使用的芯片型号,并在新工程中选择相同的兼容的型号。 然后是添加源代码文件。用户需要将旧项目的源文件复制到新工程目录,并添加到新工程中。这里需要注意文件路径的问题,避免相对路径错误导致文件找不到。同时,用户可能需要检查头文件路径是否正确配置,旧项目中可能包含相对路径的头文件,如果目录结构改变,这些路径可能需要调整。 接下来是配置工程选项。用户需要比较新旧工程的配置差异,包括目标选项中的设备型号、输出格式(如HEX文件)、调试设置等。特别是编译器选项,旧项目可能使用了特定于旧编译器的优化选项语言标准,这些在新编译器中可能需要调整。例如,ARM Compiler 5和6之间有较大差异,用户可能需要更改编译器版本修改代码以适应新编译器。 启动文件和系统文件也是关键。旧项目可能使用了特定版本的启动文件,而新工程可能默认使用不同版本。用户需要确认是否替换启动文件,者保留旧版本。如果启动文件不兼容,可能导致程序无法正确初始化,进而卡在启动阶段。 处理依赖库和中间文件也是重要步骤。旧项目可能依赖某些旧版库文件,这些库在新环境中可能不可用需要更新。用户需要将这些库文件添加到新工程,并确保版本兼容。同时,清理旧项目的中间文件,避免编译错误。 调试和测试阶段,用户需要重新编译并下载程序,观察是否还存在问题。如果依然卡住,可能需要检查初始化代码、时钟配置、中断向量表等。使用调试器查看堆栈和寄存器状态,帮助定位问题所在。 在整个过程中,用户可能会遇到编译器错误、链接错误运行时错误。需要逐步排除,比如先确保编译通过,再解决链接问题,最后处理运行时的问题。备份旧项目是关键,避免迁移过程中丢失原有代码。 总结来说,迁移旧项目到新Keil工程需要系统性地处理代码、配置、依赖和调试。用户需要耐心逐步验证每个步骤,确保所有设置正确无误。如果遇到特定错误,可能需要查阅编译器文档社区支持,寻找解决方案。</think>将旧版Keil工程迁移到新环境的步骤如下,分阶段操作可降低风险: 、创建新工程基础 1. 新建空白工程 - 打开Keil UVision → Project → New μVision Project - 选择与旧工程完全相同的芯片型号(需提前确认旧工程使用的MCU型号) - 弹出对话框询问是否添加启动文件时,先选"否" 2. 工程目录重构 ```text /NewProject ├─/User ← 存放用户代码 ├─/Drivers ← 存放新版库文件 ├─/Middlewares ← 中间件(如有) └─/Output ← 输出文件目录 ``` 二、迁移代码文件 1. 物理文件迁移 - 复制旧工程中以下内容到新目录: • 所有.c/.h文件 • 启动文件(如startup_stm32f10x_hd.s) • 链接脚本(.sct.ld文件) • 特殊配置文件(如system_stm32f10x.c) 2. 工程文件添加 - 右击Target → Manage Project Items - 创建分类结构(建议按功能模块分组) - 通过Add Files逐个添加源文件(不要直接拖拽) 三、关键配置迁移(新旧对比法) 1. 目标选项配置 | 配置项 | 旧工程值 | 新工程对应设置 | |----------------|-------------------------|-------------------------| | Device | STM32F103ZE | 必须完全致 | | Target | 晶振频率/内存配置 | 按硬件实际值设置 | | Output | 输出Hex文件路径 | 指向新的Output目录 | | Listing | 列表文件生成选项 | 保持相同配置 | 2. C/C++选项卡 - 严格对比预定义宏(Define) - 头文件包含路径使用相对路径: ```makefile ../Drivers/STM32F1xx_HAL_Driver/Inc ../User/inc ``` 3. 调试器配置 - 根据实际硬件选择调试接口(SWD/JTAG) - 在Utilities选项卡取消勾选"Update Target before Debugging" 四、版本兼容处理 1. 编译器适配 - 若旧工程使用ARMCC v5,新环境使用AC6: - 在C/C++选项卡添加兼容编译选项: ```bash --target=arm-arm-none-eabi -mcpu=cortex-m3 ``` - 对旧代码中不规范写法(如未指定volatile的寄存器访问)添加编译忽略: ```c #pragma clang diagnostic ignored "-Wincompatible-pointer-types" ``` 2. 启动文件适配 - 对比新旧启动文件差异(重点检查堆栈初始化部分) - 建议保留旧版启动文件,但需检查向量表对齐: ```armasm AREA RESET, DATA, READONLY DCD __initial_sp ; 堆栈指针 DCD Reset_Handler ; 复位向量 ; ...其他中断向量 ``` 五、分步验证流程 1. 基础编译测试 - 注释所有外设初始化代码 - 仅保留时钟配置和空主循环 - 观察是否进入main函数 2. 增量添加功能 ```c int main(void) { // 阶段1:核心系统初始化 SystemInit(); // 阶段2:时钟配置验证 RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; GPIOA->CRL = 0x44444444; // 阶段3:逐步添加外设模块 // USART_Init(); // ADC_Init(); while(1) { // 阶段4:添加功能代码 // GPIOA->ODR ^= (1<<5); // HAL_Delay(500); } } ``` 六、常见问题处理 1. 卡在启动阶段的调试技巧: - 检查SP初始值是否指向有效RAM地址 - 在调试窗口输入命令查看寄存器状态: ```bash __get_MSP() // 应显示正确的栈顶地址 __get_PC() // 应指向Reset_Handler ``` 2. 链接错误处理示例: ```bash Error: L6218E: Undefined symbol HAL_GPIO_Init (referred from main.o). ``` 解决方案: - 检查是否添加了新版HAL库文件 - 确认USE_HAL_DRIVER宏定义已添加 建议使用版本控制工具(如Git)管理迁移过程,每个配置步骤完成后提交次变更。如遇特定编译错误,可提供具体错误信息进步分析。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OMGMac

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值