This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RM48L952:SDRAM 未对齐访问时中止异常

Guru**** 2893300 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/811890/rm48l952-abort-exception-on-sdram-misaligned-accesses

器件型号:RM48L952

您好!

我注意 到、当尝试从外部64MB SDRAM (Alliance AS4C32M16SM)读取32位数据时、在某些情况下会触发中止异常。

当我尝试从 SDRAM 中读取4字节数据时、基于非4字节已排列的地址、在整个内存结束时从地址0x80800000处读取该错误。

如果我在地址高达 0x807FFFFC 的存储器中读取、我可以读取32位数据、而不会出现任何问题。 但是、从地址 0x80800000开始、我只能在4字节地址间隔内读取32位数据。 如果我尝试读取位置0x80800000、它读数正常、但如果我尝试0x80800001、 0x8080000002和 0x8080000003、则会触发中止异常。 对0x80800004的读取访问是正常的、依此类推。 这种行为在存储器的末尾重复出现。

执行以下代码可以重现例外情况(RM 在芯片修订版本 D 上)

--------------------------------------------------

uint32_t * SDRAM_ptr;
uint32_t var_test;

SDRAM_ptr =(uint32_t *) 0x8000000;
var_test =* SDRAM_ptr;// read OK */
SDRAM_ptr =(uint32_t *) 0x8000000001;
var_test =* SDRAM_ptr **读取 OK *;var_tr =


*(uint_t_tr = 0x800002 *)*(uint_t_tr = 8)
* SDRAM = uint_tr *(uint_t_tr = 8) /*读取正常*/
SDRAM_PTR =(uint32_t *) 0x800004;
var_test =* SDRAM_PTR;/*读取正常*/


SDRAM_PTR =(uint32_t *) 0x80800000;
var_test =* ptr_var;//读取正常*SDRAM_PTR
=(uint32_t *) 0x80800000;
* SDRAM =
* SDRAM =* 800t_tr_exception;*
/*触发中止异常*/
SDRAM_PTR =(uint32_t *) 0x80800003;
var_test =* SDRAM_PTR;//触发中止异常*/
SDRAM_PTR =(uint32_t *) 0x80800004;
var_test =* SDRAM_PTR;//读取 OK */ 

--------------------------------------------------

是否有人能指出我如何解决这个问题的方向?

提前感谢

Nton Armstrong

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这里是 EMIF 配置    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    请检查 MPU 状态寄存器以了解数据中止的原因。 如果指示对齐故障、则表示强制执行严格要求对齐读取地址以访问大小的设置。 这似乎是您观察到的内容。

    此致、

    Sunil

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sunil、

    感谢您的回复!

    实际上、我将区域类型从 MPU_STRONGLYORDERED_sharedable 更改为 MPU_normal_OIWBWA_NONSHARED、它运行良好!

    不过、它给我带来了另一个问题、但我会将其发布在另一个问题中。

    此致