关于MSP430FR4133写FRAM的怪问题?

[复制链接]
2500|8
 楼主| 自民 发表于 2017-1-4 17:24 | 显示全部楼层 |阅读模式
当执行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);
dirtwillfly 发表于 2017-1-4 22:19 | 显示全部楼层
运行下面程序试试
dirtwillfly 发表于 2017-1-4 22:19 | 显示全部楼层
  1. //******************************************************************************
  2. //   MSP430FR413x Demo - Long word writes to FRAM
  3. //
  4. //   Description: Use long word write to write to 512 byte blocks of FRAM.
  5. //   Toggle LED after every 100 writes.
  6. //   NOTE: Running this example for extended periods will impact the FRAM
  7. //   endurance.
  8. //   ACLK = REFO, MCLK = SMCLK = default DCODIV = ~1MHz
  9. //
  10. //           MSP430FR4133
  11. //         ---------------
  12. //     /|\|               |
  13. //      | |               |
  14. //      --|RST            |
  15. //        |               |
  16. //        |          P1.0 |---> LED
  17. //
  18. //   Cen Fang
  19. //   Texas Instruments Inc.
  20. //   August 2013
  21. //   Built with IAR Embedded Workbench v5.60 & Code Composer Studio v5.5
  22. //******************************************************************************
  23. #include <msp430.h>

  24. void FRAMWrite(void);

  25. unsigned char count = 0;
  26. unsigned long *FRAM_write_ptr;
  27. unsigned long data;

  28. #define FRAM_TEST_START 0x1800


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

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

  34.     PM5CTL0 &= ~LOCKLPM5;                   // Disable the GPIO power-on default high-impedance mode
  35.                                             // to activate previously configured port settings
  36.     data = 0x11111111;                      // Initialize dummy data

  37.     while(1)
  38.     {
  39.         data += 0x00010001;
  40.         FRAM_write_ptr = (unsigned long *)FRAM_TEST_START;
  41.         FRAMWrite();
  42.         count++;
  43.         if (count > 100)
  44.         {
  45.             P1OUT ^= 0x01;                  // Toggle LED to show 512K bytes
  46.             count = 0;                      // ..have been written
  47.             data = 0x11111111;
  48.         }
  49.     }
  50. }

  51. void FRAMWrite (void)
  52. {
  53.     unsigned int i=0;

  54.     SYSCFG0 &= ~DFWP;
  55.     for (i = 0; i < 128; i++)
  56.     {
  57.         *FRAM_write_ptr++ = data;
  58.     }
  59.     SYSCFG0 |= DFWP;
  60. }


 楼主| 自民 发表于 2017-1-5 09:22 | 显示全部楼层
由于开发进度很紧,我直接用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
 楼主| 自民 发表于 2017-1-5 09:27 | 显示全部楼层
我读写8 16 32 64都根据他改的
 楼主| 自民 发表于 2017-1-5 10:38 | 显示全部楼层
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);


一样的啊!
 楼主| 自民 发表于 2017-1-9 14:28 | 显示全部楼层
结贴,是常量地址定义有错,FRAM读写没有问题!
wengh2016 发表于 2017-1-9 21:45 | 显示全部楼层
这是多少位的数据?
wengh2016 发表于 2017-1-9 21:48 | 显示全部楼层
你写入的数据变量是怎么定义的?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

47

主题

195

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部