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.

[参考译文] RTOS/MSP430F5438A:如何访问64K 字节的闪存

Guru**** 2555630 points
Other Parts Discussed in Thread: MSP430F5438A

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/700554/rtos-msp430f5438a-how-to-access-the-flash-over-64-k-bytes

器件型号:MSP430F5438A

工具/软件:TI-RTOS

大家好、

我对超过64K 字节的内部闪存访问有疑问。

背景:

我使用的 MSP430F5438A 芯片具有256K 字节内部闪存和 TI-RTOS。

由于我们需要使用 XDCTool 来配置 TI-RTOS,因此我们只能使用编译器的小数据模型(IAR 7.11.1)。

(XDCTool 不支持大型或中型数据模型)。

我正在尝试访问整个闪存区域。 但地址似乎被限制在16位、然后不能大于0xFFFF。

可能的解决方案:

我已经对这一问题进行了一些调查,网上提出了三种可能的解决办法。

1)使用大数据模型(在本方案中不受支持)。

2) 2)使用汇编代码来访问大于0xFFFF 的地址。 (尚未证明)。

3) 3)使用 IAR 提供的__DATA20内在函数来定义指针或数据。 (小型数据模型不支持)。

4)是否有其他解决方案??

我们似乎只能使用选项2)? 我不太熟悉汇编语言、谁可以提供一些示例代码?

这是来自互联网、但存在一个编译错误:

http://msp430-gcc-users.1086195.n5.nabble.com/Accessing-20-bit-memory-range-issues-with-indirect-addressing-mode-td7110.html

/*

对闪存 func 进行* 20位写入访问
*
静态内联空 FlashWriteByte (uint32_t 地址、uint8_t 字节)

unsigned int SR、flash;
_asm volatile ("mov R2、%0":"=r"(SR):);
_dint();
_asm volatile ("movx.a %1、%0":"=r"(FLASH):"m"(地址));
_asm volatile ("movx.b %1、@%0":"=r"(FLASH):"m"(Byte));
_asm volatile ("mov %0、R2":"r"(SR));
_NOP();
_EINT();

或者、我想知道 TI-RTOS 是否有一些可以在这种情况下工作的存储器/闪存管理系统或 API?

谢谢  

艾伦

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

    访问闪存所有较高存储器部分的唯一方法是使用大数据模型。 这样做的原因是当 MSP430中引入了更高的存储器变体时、CPU 内发生了一些更改、以允许对闪存进行20位寻址。 这意味着引入了20位专用指令来寻址存储器的上部。 (如果您检查部件的用户指南、这些说明通常标有"X"以进行扩展。) 编译器/IDE 中的大数据模型设置允许编译器使用这些扩展指令。 提供了小型数据模型、以便向后兼容没有扩展指令集的旧器件。

    我知道 TI-RTOS 可以与更高存储器件搭配使用、并使用存储器的上部。 不过、我不确定您提到的 XDCTool。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jace、

    感谢您的回复。

    我已经尝试更改为大型数据模型、但是 XDCTool (版本3_32_00_06)将在执行预编译操作时报告错误。

    XDCTool 似乎不支持这个大数据模型。

    然后、我尝试使用一些汇编代码来访问较高的存储器、但由于我对汇编不是很熟悉、因此失败了。

    您对此有什么想法吗?

    提前感谢。

    艾伦

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    2) 2)如果地址> 0xFFFF 上的闪存仅用作存储器、则可以使用、因此写入和读取由汇编器的读取/写入函数完成。 如果地址> 0xFFFF 上的闪存必须用于编程、则无法实现、因为进入/离开函数(PUSH / POP -> PUSHx / POPL.x)相关的内容(20位 PC)将不起作用。