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.

关于MSP430FR4133写FRAM的怪问题?



当执行FRAMWrite_uint64((uint64_t *)FRAM_RECORD_ADDRESS,0); 时,后20*4会被修改为0
原来0xffffffff,0xffffffff,被改为0x0000ffff,0x00000000

当执行FRAMWrite_Long((uint32_t *)FRAM_RECORD_ADDRESS, 0);时,后10*4=40会被修改为0
原来0xffffffff,被改为0x0000ffff,

void FRAMWrite_uint64(uint64_t *pFRAM_write_ptr, uint64_t ui64data)
{
        SYSCFG0 &= ~DFWP;
        *pFRAM_write_ptr = ui64data;
        SYSCFG0 |= DFWP;
}

void FRAMWrite_Long(uint32_t *pFRAM_write_ptr, uint32_t ui32data)
{
        SYSCFG0 &= ~DFWP;
        *pFRAM_write_ptr = ui32data;
        SYSCFG0 |= DFWP;
}

#define FRAM_RECORD_ADDRESS  0x1812


FRAMWrite_uint64((uint64_t *)FRAM_RECORD_ADDRESS,0); 
FRAMWrite_Long((uint32_t *)FRAM_RECORD_ADDRESS, 0);

  • 这个函数是自己写的吗,没用过这个芯片,但是感觉你这个函数不大对。

    看了看数据手册,你只是使能写,然后操作了这么一句*pFRAM_write_ptr = ui32data,然后进行数据保护。写数据的过程呢?这句无法执行写数据的操作吧,重新写这个函数吧。


  • 建议先运行官网例程试试

  • 由于开发进度很紧,我直接用TI 《MSP430FR4xx 实现的水表》中的程序

    其中FRAM读写,只是他用的是程序区FRAM

    void FRAMWrite_Long(uint32_t *pFRAM_write_ptr, uint32_t ui32data)

    {

             SYSCFG0 &= ~PFWP;

             *pFRAM_write_ptr = ui32data;

             SYSCFG0 |= PFWP;

    }

     

    void FRAMWrite_Char(uint8_t *pFRAM_write_ptr, uint8_t ui8data)

    {

             SYSCFG0 &= ~PFWP;

             *pFRAM_write_ptr = ui8data;

             SYSCFG0 |= PFWP;

    }

     

    pAddress = (uint8_t *)(FRAM_RECORD_BASE + (tRTCData.ui8Year - 13)*120 + (tRTCData.ui8Month - 1)*10);

    FRAMWrite_Char(pAddress++,tRTCData.ui8Year);

     

    FRAMWrite_Long((uint32_t *)FRAM_RECORD_ADDRESS,ui32Sum);

     

    ui32Sum = *((uint32_t *)FRAM_RECORD_ADDRESS);

     

    // Fram record address

    #define FRAM_RECORD_ADDRESS 0xFF00     // Refresh every 1 second

    #define FRAM_RECORD_CHECK 0xFF40          // First record check address

    #define FRAM_RECORD_BASE 0xFA00        // Monthly record in stand-alone address

    我读写8 16 32 64都根据他改的

  • uint8_t  i;
    uint32_t *pAddress;
                    
                    
                    for(i=0;i<Freq_cn;i++)
                    {
                            pAddress = (uint32_t *)(FRAM_RECORD_Freq + i*4);
                      FRAMWrite_Long((uint32_t *)(pAddress),flow_Freq_k[i]);
                    }
                    
                    for(i=0;i<Freq_cn;i++)
                    {
                            pAddress = (uint32_t *)(FRAM_RECORD_rate + i*4);
                      FRAMWrite_Long((uint32_t *)(pAddress),flow_rate_k[i]);
                    }

    uint8_t  i;
    uint32_t *pAddress;
                    
                    for(i=0;i<Freq_cn;i++)
                    {
                            pAddress = (uint32_t *)(FRAM_RECORD_Freq + i*4);
                      flow_Freq_k[i] = *((uint32_t *)pAddress);
                    }
                    
                    for(i=0;i<Freq_cn;i++)
                    {
                            pAddress = (uint32_t *)(FRAM_RECORD_rate + i*4);
                      flow_rate_k[i] = *((uint32_t *)pAddress);
                    }

    FRAMWrite_uint64((uint64_t *)FRAM_RECORD_ADDRESS,0); //写FRAM (刷新)
    //FRAMWrite_Long((uint32_t *)FRAM_RECORD_ADDRESS, 0);
    //FRAMWrite_uint16((uint16_t *)FRAM_RECORD_ADDRESS, 0);


    一样的啊!

  • 这时你说的官方的程序

    void FRAMWrite_Long(uint32_t *pFRAM_write_ptr, uint32_t ui32data)

    {

             SYSCFG0 &= ~PFWP;

             *pFRAM_write_ptr = ui32data;

             SYSCFG0 |= PFWP;

    }

     

    void FRAMWrite_Char(uint8_t *pFRAM_write_ptr, uint8_t ui8data)

    {

             SYSCFG0 &= ~PFWP;

             *pFRAM_write_ptr = ui8data;

             SYSCFG0 |= PFWP;

    }

    你假如需要移植到数据区的话,需要测试下,单独写8位,16位,32位的数据进去,是否ok呢,以为msp430的寄存器是16位的,也就是说使用一次*pFRAM_write_ptr = ui8data这样的赋值,最大只能写16位的数据,你32位的数据,一次是肯定写不进去的,只能分两次写。

  • 结贴,是常量地址定义有错,FRAM读写没有问题!