硬汉嵌入式论坛

 找回密码
 立即注册
查看: 238|回复: 2
收起左侧

[其它] STM32F429 二级启动程序 (sboot) 开发难点:LD 文件 / 堆栈 / NVIC 及 startup.s 修改疑问

[复制链接]

1

主题

0

回帖

3

积分

新手上路

积分
3
发表于 2025-9-16 15:48:29 | 显示全部楼层 |阅读模式
[color=rgba(0, 0, 0, 0.85) !important]大家好,我正在基于 STM32F429 芯片开发一个二级启动程序(sboot),目的是实现 “无烧录器更新程序”—— 只需将编译好的应用文件放到 SD 卡,单片机上电后就能自动加载运行,极大简化调试和更新流程。目前使用 Cube IDE 开发,硬件配置如下:

  • 主控制器:STM32F429(内部 Flash 存储 sboot,内部 SRAM 起始地址 0x20000000,容量 256KB)
  • 外部存储:铠侠 64GB SD 卡(通过 SDIO 总线连接,用于存放应用程序 boot.bin)
  • 外部内存:32MB SDRAM(起始地址 0xC0000000,通过 FMC 控制器驱动,用于加载并运行 boot.bin)
功能流程说明[color=rgba(0, 0, 0, 0.85) !important]sboot 固化在 STM32 内部 Flash,上电后执行以下步骤:

  • 初始化最小系统(如时钟、GPIO 等基础配置);
  • 通过 FMC 控制器初始化外部 SDRAM(已验证可正常读写);
  • 初始化 SDIO 总线和 FatFS 文件系统,挂载 SD 卡;
  • 检查 SD 卡根目录是否存在 boot.bin,若存在则将其完整拷贝到 SDRAM 的 0xC0000000 地址;
  • 跳转至 SDRAM 中的 0xC0000000 地址,执行 boot.bin(应用程序)。
目前遇到的核心疑问
  • [color=rgb(0, 0, 0) !important]链接脚本(LD 文件)的选择与修改
    Cube IDE 默认生成两个链接脚本:flash.ld(针对程序存储在内部 Flash 并运行的场景)和ram.ld(针对程序在内部 RAM 运行的场景)。但我的应用程序需要存储在 SD 卡,最终加载到外部 SDRAM(0xC0000000)运行,这种情况下应该基于哪个脚本修改?
    具体需要调整哪些关键配置(比如FLASH/RAM段的起始地址和大小、_estack栈顶地址、_sidata/_sdata等段的映射关系)才能确保程序正确加载到 SDRAM 并正常执行?
  • [color=rgb(0, 0, 0) !important]堆(Heap)和栈(Stack)的位置选择
    应用程序的堆和栈应该放在内部 SRAM(0x20000000 起始)还是外部 SDRAM(0xC0000000 起始)?
    两种方案的优缺点对比:内部 SRAM 速度快但容量有限(256KB),可能限制大堆 / 栈需求的应用;外部 SDRAM 容量大(32MB)但依赖 FMC 稳定性,且访问速度略慢。从兼容性和稳定性角度,更推荐哪种方案?
  • [color=rgb(0, 0, 0) !important]NVIC 中断向量表的配置
    sboot 运行时,中断向量表默认指向内部 Flash(0x08000000);而应用程序在 SDRAM(0xC0000000)运行,其向量表也位于 SDRAM 中。
    如何确保应用程序的中断能正确响应?是需要在 sboot 跳转前修改SCB->VTOR寄存器指向 SDRAM 中的向量表,还是在应用程序初始化时自行修改?此外,STM32F429 对向量表的地址对齐有要求(如 0x200 对齐),需要特别注意吗?
  • [color=rgb(0, 0, 0) !important]应用程序 startup.s 的修改必要性
    我担心应用程序的启动文件(startup_stm32f429xx.s)会重复初始化 sboot 已配置的硬件,导致冲突:
    • sboot 已通过 FMC 初始化外部 SDRAM,若应用程序的startup.s或SystemInit函数中再次初始化 FMC,可能覆盖时序参数,导致 SDRAM 访问失败(应用程序本身运行在 SDRAM 中,会直接崩溃);
    • sboot 已配置好系统时钟(如 PLL 使能,HCLK=180MHz),若应用程序再次初始化时钟树,可能导致 SDIO、FMC 等外设时序错乱;
    • 其他可能的冲突点:如 GPIO 复用配置、NVIC 优先级分组等。
    因此,应用程序的startup.s必须修改吗?具体哪些初始化步骤需要删除(如 FMC 配置、时钟初始化),哪些可以保留(如内核基础初始化)?是否有更安全的修改方式(比如通过宏定义屏蔽特定初始化)?


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118335
QQ
发表于 2025-9-16 16:35:31 | 显示全部楼层
看楼主的描述是加载SD卡的程序,复制到SDRAM运行,是这样吧。

针对这个应用,之前做过一个MDK下跑的例子,不过是我直接临时存到内部Flash了,然后加载过去的。

STM32F429的程序加载到SDRAM的运行方法
https://forum.anfulai.cn/forum.p ... 9299&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

5

主题

215

回帖

230

积分

高级会员

积分
230
发表于 2025-9-17 13:33:43 | 显示全部楼层
是说STM32F4啥时候能支持SD卡启动呢
原来是SD卡里面读取文件到SDRAM,然后运行内存里面的程序
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-9-26 19:25 , Processed in 0.039307 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表