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.

[参考译文] 当 RAM 大小超过4KB 时、程序 CAN#39;t 启动(从仅使用 RAM 扇区0到使用 RAM 扇区0和扇区1)

Guru**** 2539500 points
Other Parts Discussed in Thread: MSP430F5419

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1161596/program-can-t-start-when-ram-size-over-4kb-from-using-ram-sector-0-only-to-using-ram-sector0-and-sector-1

器件型号:MSP430F5419

您好!

我们在 电源管理项目中使用 MSP430F5419AIPZ。 它使用 IAR for MSP430 7.20.1。 使用 MCU 时一切都正常。 我们几乎完成了编码和验证工作。 但是、如今、我们被分配了一个有关该项目的新功能。 它需要计算几个电源在最近1分钟内的平均电压和电流。 因此、我们需要将 最近1分钟内的所有电压和电流样本值存储在 RAM 中。 它需要大约3.1KB 的额外 RAM。 因此、我们在全局数组中添加了以下值缓冲区、如下所示:

静态 U_word 主机电流[261];
静态 U_word ACVol[261];
静态字 BatCurrent [2][261];
静态 U_word BatVol[2][261];

在添加这些缓冲区后、我们编译了项目并将十六进制文件烧写到目标板中、就像以前一样。 它不起作用、甚至不起作用(在程序开始时、我们点亮 LED。 但在本例中 LED 未亮起。)。  当我们使用 IAR 来调试程序时,程序没有像以前那样在 main()的开头中断。

我们已查看 MSP430F5419的数据表、其中显示4个扇区中有16KB RAM (每个扇区为4KB)。 我们在程序的 Debug/List/文件夹中选中了.map。  映射文件中的数据存储器字节显示其当前为6649字节、在我们更改代码之前为3516字节。 因此、我们猜在使用扇区0以外的 RAM 扇区时可能会有一些技巧用途。

此外、我们还知道有一个 RCCTL0寄存器来控制每个 RAM 扇区的 RAM 功率。 它的复位值为0x6900、这意味着所有扇区都处于加电状态。 此外、我们从未更改过代码中的 RCCTL0值。

那么、有人对我们的问题有什么想法可以帮助我们吗? 谢谢!

此致、

Ricky

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

    我的第一个猜测是 C 初始化现在需要更长的时间来清除.bss --只要看门狗计时器在触发(重复复位)之后你才会到达 main()。 解决此问题的最简单方法是在使用其中一个启动挂钩进行 C 初始化之前停止 WDT、如下所示:

    int _system_pre_init (void){WDTCTL = WDTPW | WDTHOLD;return (1);}//在 C init 前停止 WDT

    [参考 CCS C 编译器用户指南(SLAU132X)第6.9.1]节

    [编辑:少量澄清。]

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

    是的、你是对的。 此外、我还在这个论坛上找到了一个包含一些中文建议的 TT (MSP430F5438A RAM使用问题- MSP 低功耗微控制器论坛- MSP 低功耗微控制器- E2ETm 设计支持(TI.com))。 它显示了如何以类似的方式实现__low_level_init()函数:

    /********
    在执行此操作之前、函数__low_level_init 由启动代码调用
    数据段的正常初始化。 如果返回值为零、
    未执行初始化。

    在运行时库中有一个虚拟__low_level_init、确实如此
    只返回1。 这意味着启动例程继续执行
    数据段的初始化。

    若要替换此虚拟版本、请编译自定义版本(如示例)
    )并将其与您的其他代码链接。
    (三 /
    int __low_level_init (void)

    /*停止内部看门狗以避免 MCU 启动失败(看门狗复位
    RAM 大小超过4KB */的情况下)
    WDTCTL = WDTPW + WDTHOLD;

    /*================================================ *
    /*选择是否进行段初始化*/
    /*是否应完成。 *
    /*返回:0以忽略 seg_init */
    /* 1运行 seg_init */
    /*================================================ *
    返回(1);

    我已经对此进行了测试、它解决了问题。 感谢您的善意回复!

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

    Bruce 和 Qi 大家好

    感谢您的讨论和分享!