星光电子技术


首页 -- STC单片机解密-- STC芯片解密-- STC单片机开发-- STC单片机资料 --关于我们
 

STM32F429使用外扩 SDRAM运行程序的方法

SDRAM运行程序基本原理
STM32的高端产品429/439添加了新的外设,SDRAM控制器(FMC总线)。不少客户都使用外扩的SDRAM作为变量的存储区,也有可能作为C stack和heap的存放区,因此,需要在IAR链接前(数据的拷贝)完成SDRAM控制器的初始化工作,ST已经提供相关代码供客户参考(初始化程序在system_stm32f4.c中)。
若对函数使用IAR链接器关键字 (例:__ramfunc void func1(void) ),IAR在链接的时候会将程序放在SDRAM的区域,并将函数的入口地址传给调用者。
二. 客户问题描述及原因
客户反映使用外扩SDRAM运行程序(使用链接器将code存放在SDRAM中,与编译器无关,采用GCC或者IAR都有这个问题)出错,Hard Fault发生。
单步运行,使能Usage, Memory, Bus Fault,发现Hard Fault是由Memory Fault(bit 0 IACCVIOL)引起的。
参考ARM关于Cortex-M4内核IACCVIOL位的说明
Instruction access violation flag:
0 = no instruction access violation fault
1 = the processor attempted an instruction fetch from a location that does not permit execution. The 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:
a) Branch to regions that are not defined in the MPU or defined as non-executable.
b) Invalid return due to corrupted stack content.
c) Incorrect entry in the exception vector table
在M4内核中,0x2000 0000以上的地址是通过System Bus来访问的,system bus是可以对数据和指令读取的,但是内核的默认设置(即MPU处于Disabled的状况下),部分地址禁止执行指令,见下
图(STM32F429的SDRAM取值范围设置在0xC000 0000以上),因此会发生该错误。
因此有两种解决方案:
1. 更改MPU (Memory Protect Unit) 设置(通用性上来讲此方法更好,本文将介绍这种实现方式)。
2. Memory Remap (将SDRAM调整到I-Code总线上)。
三. MPU设置方法
关于MPU的讲解,强烈建议大家阅读《ARM Cortex-M3权威指南》或者ARM Cortex-M4的官方文档。
在与本文对应的例程中已给出了基本的实现方法(请参考stm32_mpu.c)。同时,本文也给出了如何将数据存放在SRAM及CCMRAM的方法(请参考IAR_DevelopmentGuide)。
四. 结语
MPU的主要作用是实施存储器的保护,它能够在系统或程序出现异常而非正常地访问不应该访问的存储空间时,通过触发异常中断而达到提高系统可靠性的目的。 所谓非正常地访问不应该访问的存储空间,最常见的现象是存储器访问越界,更具体的表现可以是数组溢出、堆栈溢出、动态存储器分配失败等情况;另一种常见的现象是程序跑飞了。
事实上,MPU可以RTOS中有着更广泛的应用(参考FreeRTOS相关资料)。
返回顶部


2013-2015 星光电子技术 All Rights Reserved.
如有任何问题和建议请联系:498187676@qq.com

深圳市星光芯电子有限公司 版权所有

电话:0755-83987315 QQ: 498187676 地址:深圳市龙岗区南湾街道平吉大道1号建昇大厦B栋1618(李朗软件园对面)
手机:13713820066 联系人:周工

 


站点地图

粤ICP备12084176号