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.

[参考译文] MSP430FR2355:系统时钟被编程为24MHZ 时、无法保存到信息 RAM 中

Guru**** 2478765 points
Other Parts Discussed in Thread: MSP430FR2355

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1293047/msp430fr2355-fails-to-save-to-info-ram-when-system-clock-is-programmed-to-24mhz

器件型号:MSP430FR2355
主题中讨论的其他器件: MSP430WARE

当系统时钟被设定为24 MHz 时、我在写入位于1800的信息 RAM 内存地址时遇到困难。 但是、当我将系统时钟减少到16 MHz 时、可以对信息 RAM 进行读取和写入、而不会出现任何问题。

我的问题是、这是否是 MSP430FR2355的一个已知问题、即信息 RAM 无法在24 MHz 中可靠写入、但在16 MHz 及以下版本中可以正常运行?

为了重现此问题、我使用了 TI 网站提供的示例代码: https://dev.ti.com/tirex/explore/node?node=A__AH2qBo.OVRaJLHNDd38Y4g__msp430ware__IOGqZri__LATEST
(如果链接不起作用、您可以像这样导航此示例代码:MSP430微控制器/嵌入式软件/ MSP430Ware (3.80.14.01)/Devices/MSP430FR2XX_4XX/MSP430FR2355/Peripheral 示例/寄存器级别/ msp430fr235x_framwrite)


上述示例代码成功写入并将值保留在信息 RAM 中。 但是、当我用以下内容修改上述示例代码时:

#ifdef SYSTEM_CLOCK_IS_24MHZ
    CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_7; // DCOFTRIM=7, DCO Range = 24MHz
    CSCTL2 = FLLD_0 + 731;                                     // DCODIV = 24MHz
#endif

#ifdef SYSTEM_CLOCK_IS_16MHZ
    CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_5;// DCOFTRIM=5, DCO Range = 16MHz
    CSCTL2 = FLLD_0 + 487;                                    // DCOCLKDIV = 16MHz
#endif


 定义 SYSTEM_CLOCK_IS_24MHZ 失败 to save to INFO RAM, while the define SYSTEM_CLOCK_IS_16MHZ, saves correctly to INFO RAM.

下面是突出显示此问题的完整代码。  希望这是足够的信息来了解它的底部。  

#include <msp430.h>

void FRAMWrite(void);

unsigned char count = 0;
unsigned long *FRAM_write_ptr;
unsigned long data;

#define FRAM_TEST_START 0x1800
//#define SYSTEM_CLOCK_IS_16MHZ
#define SYSTEM_CLOCK_IS_24MHZ


int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;               // Stop watchdog timer

    P1OUT &= ~BIT0;                         // Clear P1.0 output latch for a defined power-on state
    P1DIR |= BIT0;                          // Set P1.0 to output directionOUT

    PM5CTL0 &= ~LOCKLPM5;                   // Disable the GPIO power-on default high-impedance mode
                                            // to activate previously configured port settings


    __bis_SR_register(SCG0);  // disable FLL
    CSCTL3 |= SELREF__REFOCLK; // Set REFO as FLL reference source

#ifdef SYSTEM_CLOCK_IS_24MHZ
    CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_7; // DCOFTRIM=7, DCO Range = 24MHz
    CSCTL2 = FLLD_0 + 731;                                     // DCODIV = 24MHz
#endif

#ifdef SYSTEM_CLOCK_IS_16MHZ
    CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_5;// DCOFTRIM=5, DCO Range = 16MHz
    CSCTL2 = FLLD_0 + 487;                                    // DCOCLKDIV = 16MHz
#endif

    __delay_cycles(3);
    __bic_SR_register(SCG0);
    CSCTL4 = SELMS__DCOCLKDIV;


    data = 0x11111111;                      // Initialize dummy data


    while(1)
    {
        data += 0x00010001;
        FRAM_write_ptr = (unsigned long *)FRAM_TEST_START;
        FRAMWrite();
        count++;
        if (count > 100)
        {
            P1OUT ^= 0x01;                  // Toggle LED to show 512 bytes
            count = 0;                      // have been written
            data = 0x11111111;
        }
    }
}

void FRAMWrite (void)
{
    unsigned int i=0;
    SYSCFG0 = FRWPPW | PFWP;
    for (i = 0; i < 128; i++)
    {
        *FRAM_write_ptr++ = data;
    }
    SYSCFG0 = FRWPPW | DFWP | PFWP;
}

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

    我似乎您没有设置 FRAM 访问等待状态  

    //根据 MCLK 的器件数据表需要配置两个 FRAM 等待状态
    //在配置时钟系统之前在24MHz (超出8MHz)下进行操作。
    FRCTL0 = FRCTLPW | NWAITS_2;