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

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

[复制链接]
STMCU小助手 发布时间:2022-2-21 20:02
一. SDRAM 运行程序基本原理; @" _8 I6 `( ?( d* C( \, {  s
STM32 的高端产品 429/439 添加了新的外设,SDRAM 控制器(FMC 总线)。不少客户都使用外扩的SDRAM 作为变量的存储区,也有可能作为 C stack 和 heap 的存放区,因此,需要在 IAR 链接前(数据的拷贝)完成 SDRAM 控制器的初始化工作,ST 已经提供相关代码供客户参考(初始化程序在system_stm32f4.c 中)。- T9 w8 V. T! h; R( j$ y: W3 G; O( G
若对函数使用 IAR 链接器关键字 (例:__ramfunc void func1(void) ),IAR 在链接的时候会将程序放在 SDRAM 的区域,并将函数的入口地址传给调用者。+ ~' a9 k% L: S* Q( v" L. K) f
, H% A7 q+ x' u
二. 客户问题描述及原因* Y; D; x  o* j2 ^2 W6 h
客户反映使用外扩 SDRAM 运行程序(使用链接器将 code 存放在 SDRAM 中,与编译器无关,采用GCC 或者 IAR 都有这个问题)出错,Hard Fault 发生。单步运行,使能 Usage, Memory, Bus Fault,发现 Hard Fault 是由 Memory Fault(bit 0 IACCVIOL)引起的。1 A0 ^9 O% x6 p" R* j* v9 y) ?$ `
参考 ARM 关于 Cortex-M4 内核 IACCVIOL 位的说明
, b, Z4 c- }' K1 t& MInstruction access violation flag:+ G; g) V$ ^7 u1 D  V
0 = no instruction access violation fault6 C3 F0 c7 }/ p" k$ u8 f! L
1 = the processor attempted an instruction fetch from a location that does not permit execution. The
/ f$ K; n( V1 B9 xPC 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:; k+ g/ F9 \; ^0 N- ]
              a) Branch to regions that are not defined in the MPU or defined as non-executable.4 n! m& z5 j* s9 z  F; b
              b) Invalid return due to corrupted stack content.
, z) |6 d1 t/ e6 a' \0 u# t9 i6 t              c) Incorrect entry in the exception vector table' @/ H6 ^. R# i' Z
在 M4 内核中,0x2000 0000 以上的地址是通过 System Bus 来访问的,system bus 是可以对数据和指令读取的,但是内核的默认设置(即 MPU 处于 Disabled 的状况下),部分地址禁止执行指令,见下图(STM32F429 的 SDRAM 取值范围设置在 0xC000 0000 以上),因此会发生该错误。
3 _  f% ], P0 u3 j# G0 i0 `3 E% v& n0 n9 m: \. B% R, i% W
FASLKUKPR5I5}I%J8CYCM{A.png
6 [/ ]2 {, e# p/ @% m* M  c8 h
9 l# B) M% N. W9 a因此有两种解决方案:
6 S, w! [$ q( K; F& b7 l1. 更改 MPU (Memory Protect Unit) 设置(通用性上来讲此方法更好,本文将介绍这种实现方式)。
  [0 A' E4 D  y4 n, x6 q2. Memory Remap (将 SDRAM 调整到 I-Code 总线上)。
  J2 Q; _; _! O3 |# Z
" s) x' {$ |1 s$ D, D" E6 ~三. MPU 设置方法
/ N. i2 ]1 ~  @8 x3 ^9 s+ g   关于 MPU 的讲解,强烈建议大家阅读《ARM Cortex-M3 权威指南》或者 ARM Cortex-M4 的官方文档。在与本文对应的例程中已给出了基本的实现方法(请参考 stm32_mpu.c)。同时,本文也给出了如何7 c! k; E4 Q% q) B; O
   将数据存放在 SRAM 及 CCMRAM 的方法(请参考 IAR_DevelopmentGuide)。2 E/ }% E* y" v
   % O* [: r! `2 X, \

5 x% y. ?) i: V) O) w% A# P- [四. 结语
2 c/ _  q! X- k4 p6 m   MPU 的主要作用是实施存储器的保护,它能够在系统或程序出现异常而非正常地访问不应该访问的存储空间时,通过触发异常中断而达到提高系统可靠性的目的。% [+ \3 i- i2 @) o0 [$ B# b1 S
   所谓非正常地访问不应该访问的存储空间,最常见的现象是存储器访问越界,更具体的表现可以是数组溢出、堆栈溢出、动态存储器分配失败等情况;另一种常见的现象是程序跑飞了。- S8 t' ^0 |- O: @: P$ k/ E
   事实上,MPU 可以 RTOS 中有着更广泛的应用(参考 FreeRTOS 相关资料)。/ B( G8 n( ]" o- g+ y, z' e
  t6 {" S( \  E! _* r# `) h% u9 A
- o* m9 o) T* h& t3 U2 z
收藏 评论0 发布时间:2022-2-21 20:02

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版