你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F429 使用外扩 SDRAM 运行程序的方法

[复制链接]
STMCU小助手 发布时间:2022-2-21 20:02
一. SDRAM 运行程序基本原理" I$ c8 G1 m; J7 R1 W+ m
STM32 的高端产品 429/439 添加了新的外设,SDRAM 控制器(FMC 总线)。不少客户都使用外扩的SDRAM 作为变量的存储区,也有可能作为 C stack 和 heap 的存放区,因此,需要在 IAR 链接前(数据的拷贝)完成 SDRAM 控制器的初始化工作,ST 已经提供相关代码供客户参考(初始化程序在system_stm32f4.c 中)。. s+ P1 G* u  a4 E# b0 b4 J
若对函数使用 IAR 链接器关键字 (例:__ramfunc void func1(void) ),IAR 在链接的时候会将程序放在 SDRAM 的区域,并将函数的入口地址传给调用者。
# n8 \0 y8 _5 z# F4 r' A- T6 ~/ J, \/ B! U+ Q9 u
二. 客户问题描述及原因
/ K. V+ k  Y+ T客户反映使用外扩 SDRAM 运行程序(使用链接器将 code 存放在 SDRAM 中,与编译器无关,采用GCC 或者 IAR 都有这个问题)出错,Hard Fault 发生。单步运行,使能 Usage, Memory, Bus Fault,发现 Hard Fault 是由 Memory Fault(bit 0 IACCVIOL)引起的。$ B3 S" {' k- v/ E& F$ h7 {
参考 ARM 关于 Cortex-M4 内核 IACCVIOL 位的说明
2 W# [0 q0 P% |0 TInstruction access violation flag:% C3 S/ Q: k# y! x# s' A
0 = no instruction access violation fault
$ ?% e6 y+ n9 M4 i' k; y0 u: ~1 = the processor attempted an instruction fetch from a location that does not permit execution. The4 S! u/ q# B+ C6 A) ?1 Z" r
PC value stacked for the exception return points to the faulting instruction. The processor has not written a fault address to the MMAR. This fault condition occurs on any access to an XN (eXecute Never) region, even when the MPU is disabled or not present. Potential reasons:5 e% \1 |7 ^4 S
              a) Branch to regions that are not defined in the MPU or defined as non-executable.* N! X* j, p, }- X! C% E4 c6 X6 f
              b) Invalid return due to corrupted stack content.& W3 j8 ]* A* F' a/ g0 Z8 k# K: h
              c) Incorrect entry in the exception vector table, \/ D1 }$ s  ?# L5 Y
在 M4 内核中,0x2000 0000 以上的地址是通过 System Bus 来访问的,system bus 是可以对数据和指令读取的,但是内核的默认设置(即 MPU 处于 Disabled 的状况下),部分地址禁止执行指令,见下图(STM32F429 的 SDRAM 取值范围设置在 0xC000 0000 以上),因此会发生该错误。
2 U0 m) S; Z" c3 G( A. b+ F6 }
/ x0 J% S* Q5 }9 d+ G# `( ~ FASLKUKPR5I5}I%J8CYCM{A.png
9 g, S& |3 t/ y+ e6 V+ U
' {% _- Z. v0 ^' {/ ?: b, u因此有两种解决方案:1 g/ n8 y; e6 ^3 w5 M
1. 更改 MPU (Memory Protect Unit) 设置(通用性上来讲此方法更好,本文将介绍这种实现方式)。
5 I/ G+ @+ K7 I- _5 S& k1 r2. Memory Remap (将 SDRAM 调整到 I-Code 总线上)。
0 s; d6 c* c- Z7 v
; e$ ~2 k$ y' X2 W  }% ]0 H9 ^& |6 C三. MPU 设置方法
, U3 G* g* V* u$ s) D   关于 MPU 的讲解,强烈建议大家阅读《ARM Cortex-M3 权威指南》或者 ARM Cortex-M4 的官方文档。在与本文对应的例程中已给出了基本的实现方法(请参考 stm32_mpu.c)。同时,本文也给出了如何: q: c# [) E" j3 x
   将数据存放在 SRAM 及 CCMRAM 的方法(请参考 IAR_DevelopmentGuide)。/ I. K) t7 z3 S8 N1 ?! t) [' M# H
   
) j, |1 M0 ~+ `; K; w1 |8 c( B1 v( X3 w8 n
四. 结语' {8 }! _( q. ]' w" i# j0 x
   MPU 的主要作用是实施存储器的保护,它能够在系统或程序出现异常而非正常地访问不应该访问的存储空间时,通过触发异常中断而达到提高系统可靠性的目的。
' I7 y; Z0 C5 U+ Q# G   所谓非正常地访问不应该访问的存储空间,最常见的现象是存储器访问越界,更具体的表现可以是数组溢出、堆栈溢出、动态存储器分配失败等情况;另一种常见的现象是程序跑飞了。
' P; {/ h( E' ?( g5 V   事实上,MPU 可以 RTOS 中有着更广泛的应用(参考 FreeRTOS 相关资料)。
9 x% b# J! b, m- f! ~/ n, K9 o/ [% x( ~- ]; m& |% |2 X: G3 s
* {' @+ x+ K9 E9 ]8 X

点评

是否有相关的手册链接或样例程序参考 我现在使用STM32F446ZET6芯片,有16m的片外SDRAM。想把程序跑在SDRAM中运行,一直尝试没有成功,希望得到你的帮助  发表于 2026-3-6 16:29
赞 收藏 评论1 发布时间:2022-2-21 20:02

举报

1个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版