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.

[参考译文] CCS/MSP430FR6989:将数据存储在 MSP430FR6989的 FRAM 中

Guru**** 2220740 points
Other Parts Discussed in Thread: MSP430FR5989, MSP430FR6989
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/751943/ccs-msp430fr6989-data-storage-in-fram-of-msp430fr6989

器件型号:MSP430FR6989
主题中讨论的其他器件:MSP430FR5989

工具/软件:Code Composer Studio

我 有一个问题:

我已经使用了您的示例 msp430fr69xx_framwrite.c 和 msp430fr69xx_LCDC_03.c、如果我关闭电源、则表  FRAM_WRITE 为空。

当然、我在"Program"设置中使用了"Debug Configuration"、我设置了"Load symbols Only"。

我做了哪些不正确的事情?

计划:

#include "msp430.h"
#define pos1 9     /*数字 A1从 S18 I S19开始*/
#define pos2 5     /*数字 A2从 S10 I S11开始*/
#define pos3 /*     数字 A3从 S6 I S7开始  */
#define pos4 18    /*数字 A4从 S36 I S37开始*/
#define pos5 14    /*数字 A5从 S28 I S29开始*/
#define pos6 7     /*数字 A6从 S14 I S15开始*/
#define pos1e 10   /*数字 A1从 S20 I S21开始 */
#define pos2e 6    /*数字 A2从 S12 I S13开始 */
#define pos3e 4    /*数字 A3从 S8 I S9开始 */
#define pos4e 19   /*数字 A4从 S38 I S39开始 */
#define pos5e 15   /*数字 A5从 S30 I S31开始 */
#define pos6e 8    /*数字 A6从 S16 I S17开始*/

const unsigned char LCD_num[10]={
   0xFC、       // 0
   0x60、       // 1.
   0xDB、       // 2.
   0xF3、       // 3.
   0x67、       // 4.
   0xB7、       // 5
   0xBF、       // 6.
   0xE4、       // 7.
   0xFF、       // 8.
   0xF7、       // 9.
};

                                        //左侧是第一个位置,右侧是7
// LCD 段定义。

静态常量 unsigned char char_gen_asci[92][2]=

         { 0x00、0x00 }、  // sp 0
         {0x00、0x00}、  //!  1 (nieda sie)
         { 0x00、0x00 }、  //" 2.
         {0x00、0x00}、  //# 3 (nie da sie)
         {0x00、0x00}、  //$ 4
         {0x00、0x00}、  //% 5 (nie da sie)
         {0x00、0x00}、  //& 6 (nie da sie)
         {0x00、0x00}、  //' 7
         {0x00、0x00}、  //( 8 (nie da sie)
         { 0x00、0x00 }、  //) 9 (nie da sie)
         {0x00、0x00}、  //* 10 (nie da sie)
         {0x03、0x50}、  //+ 11
         { 0x00、0x00 }、  //、 12.
         {0x03、0x00}、  //- 13
         { 0x00,0x00 },  //。  14.
         {0x00、0x28}、  /// 15 /* dziesietni*/
         { 0xFC、0x28 }、  // 0 16
         {0x60、0x00}、  // 1 17
         { 0xDB、0x00 }、  // 2 18
         {0xF3、0x00}、  // 3 19
         {0x67、0x00}、  // 4 20
         { 0xB7、0x00 }、  // 5 21
         { 0xBF、0x00 }、  // 6 22
         {0xE4、0x00}、  // 7 23
         { 0xFF、0x00 }、  // 8 24
         {0xF7、0x00}、  // 9 25
         { 0x00,0x00 },  //: 26
         {0x00、0x00}、  //; 27 (nie da sie)
         {0x00、0x22}、  //< 28
         {0x00、0x00}、  //= 29 (nie da sie)
         {0x00、0x88}、  //> 30
         { 0x00、0x00 }、  //?  31.
         {0x00、0x00}、  //@ 32 (nie da sie)
         { 0xEF、0x00 }、  // A 33
            małe 0xF1、0x50}、// B 34 μ F
         {0x9C、0x00}、  // C 35
         {0xF0、0x50}、  // D 36
         { 0x9E、0x00 }、  // E 37
         {0x8E、0x00}、  // F 38
         { 0xBD、0x00 }、  // G 39
         {0x6f、0x00}、  // H 40
         {0x90、0x50}、  // I 41
         {0x78、0x00}、  // J 42
         {0x0E、0x22}、  // K 43
         {0x1C、0x00}、  // L 44
         {0x6C、0xA0}、  // M 45
         {0x6C、0x82}、  // N 46
         { 0xFC、0x00 }、  // O 47
         { 0xCF、0x00 }、  // P 48
         {0xFC、0x02}、  // Q 49 hm……
         { 0xCF、0x02 }、  // R 50
         { 0xB7、0x00 }、  // S 51
         {0x80、0x50}、  // T 52
         {0x7C、0x00}、  // U 53
         {0x0C、0x28}、  // V 54
         {0x6C、0x0A}、  // W 55
         {0x00、0xAA}、  // X 56
         {0x47、0x10}、  // Y 57
         {0x90、0x28}、  // Z 58
         {0x00、0x00}、  //[ 59
         {0x00、0x00}、  // 55 60 (nie da sie)
         { 0x00、0x00 }、  //] 61.
         {0x00、0x00}、  // // 62
         {0x10、0x00}、  //_ 63
         {0x00、0x00}、  //' 64
         {0x1A、0x10}、  // a 65 (nie da sie)
         {0x3F、0x00}、  // b 66
         {0x1B、0x00}、  // c 67
         {0x7B、0x00}、  // d 68
         {0x9F、0x00}、  // e 69 hm..
         {0x8E、0x00}、  // f 70
         {0xF7、0x00}、  // g 71
         {0x2F、0x00}、  // h 72
         { 0x00、0x10 }、  // I 73
         {0x30、0x00}、  // j 74
         {0x01、0x52}、  // k 75
         {0x00、0x50}、  // l 76
         {0x2B、0x10}、  // m 77
         {0x0A、0x10}、  // n 78
         {0x3B、0x00}、  // o 79
         { 0xCF、0x00 }、  // p 80
         {0xE7、0x00}、  // q 81
         { 0x0A、0x00 }、  // r 82
         {0xB7、0x00}、  // s 83
         {0x03、0x50}、  // t 84
         {0x38、0x00}、  // u 85
         {0x08、0x08}、  // v 86
         {0x28、0x0A}、  // w 87
         {0x00、0xAA}、  // x 88
         {0x00、0xB0}、  // y 89
         {0x90、0x28}、  // z 90
         {0xC2、0x44}   // st 91
      };
unsigned int numb=0;
void updateLcd (void);

void FRAMWrite (void);

#define WRITE_SIZE     100

unsigned char count = 0;
unsigned int 数据;


pragma NOINIT (FRAM_WRITE)
unsigned int FRAM_WRITE[WRITE_SIZE];

int main (空)

   WDTCTL = WDTPW | WDTHOLD;              //停止 WDT

   PJSEL0 = BIT4 | BIT5;                  //对于 LFXT

   //初始化 LCD 段0 - 21;26 - 43
   LCDCPCTL0 = 0xFFFF;
   LCDCPCTL1 = 0xFC3F;
   LCDCPCTL2 = 0x0FFF;

   //禁用 GPIO 上电默认高阻抗模式
   //激活先前配置的端口设置
   PM5CTL0 &=~LOCKLPM5;

   //配置 LFXT 32kHz 晶振
   CSCTL0_H = CSKEY >> 8;                 //解锁 CS 寄存器
   CSCTL4 &=~LFXTOFF;                    //启用 LFXT
   操作
   {
     CSCTL5 &=~LFXTOFFG;                 //清除 LFXT 故障标志
     SFRIFG1 &=~OFIFG;
   } while (SFRIFG1 & OFIFG);             //测试振荡器故障标志
   CSCTL0_H = 0;                          //锁定 CS 寄存器

   //配置 RTC_C
   RTCCTL0_H = RTCKEY _H;                  //解锁 RTC
   RTCCTL0_L = RTCTEVIE | RTCRDYIE;       //启用 RTC 读取就绪中断
                                           //启用 RTC 时间事件中断

   RTCCTL1 = RTCBCD | RTCHOLD | RTCMODE;  // RTC 使能、BCD 模式、RTC 保持

   RTCYEAR = 0x2010;                      //年= 0x2010
   RTCMON = 0x4;                          //月= 0x04 =四月
   RTCDAY = 0x05;                         //天= 0x05 =第5个
   RTCDOW = 0x01;                         //周中某天= 0x01 =星期一
   RTCHOUR = 0x04;                        //小时= 0x04
   RTCMIN = 0x30;                         //分钟= 0x30
   RTCSEC = 0x45;                         //秒= 0x45

   //初始化 LCD_C
   // ACLK、分频器= 1、预分频器= 16;4引脚 MUX
   LCDCCTL0 = LCDDIV_1 | LCDPRE__16 | LCD4MUX | LCDLP;

   // VLCD 在内部生成,
   // V2-V4在内部生成,v5接地
   //将 VLCD 电压设置为2.60v
   //启用电荷泵并为其选择内部基准
   LCDCVCTL = VLCD_1 | VLCDREF_0 | LCDCPEN;

   LCDCCPCTL = LCDCPCLKSYNC;              //时钟同步被启用

   LCDCMEMCTL = LCDCLRM;                  //清除 LCD 存储器

   //显示时间
   updateLcd();

   //显示2个冒号
 //  LCDMEM[6]= 0x04;
   LCDMEM[19]= 0x04;

   //打开 LCD
   LCDCCTL0 |= LCDON;

   RTCCTL1 &=~(RTCHOLD);                 //启动 RTC
   DATA=FRAM_WRITE[1];

   _bis_SR_register (LPM3_bits | GIE);
   __no_operation();

   返回0;


#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=RTC_vector
_interrupt void RTC_ISR (void)
#Elif defined (_GNU_)
void __attribute__((interrupt (RTC_vector))) RTC_ISR (void)
其他
错误编译器不受支持!
#endif


   switch (__evo_in_range (RTCIV、RTCIV_RT1PSIFG))
   {
       案例 RTCIV_NONE:     中断;       //无中断
       案例 RTCIV_RTCOFIFG: 中断;       // RTCOFIFG
       案例 RTCIV_RTCRDYIFG:              // RTCRDYIFG
           P1OUT ^= 0x01;                 //每秒切换 P1.0
           updateLCD();                   //更新分段的 LCD
           中断;
       案例 RTCIV_RTCTEVIFG:              // RTCEVIFG
           __no_operation();              //每分钟中断一次
           中断;
       案例 RTCIV_RTCAIFG:  中断;       // RTCAIFG
       案例 RTCIV_RT0PSIFG: 中断;       // RT0PSIFG
       案例 RTCIV_RT1PSIFG: 中断;       // RT1PSIFG
       默认值:break;
   }


void updateLcd (void)
{  LCDMEM[pos6]= LCD_num[(data%10)];
   LCDMEM[pos5]= LCD_num[(data/10)];
   LCDMEM[pos1]= char_gen_asci['U'-32][0];
   LCDMEM[pos1e]= char_gen_asci['U'-32][1];
   LCDMEM[pos2]= char_gen_asci['Z'-32][0];
   LCDMEM[pos2e]= char_gen_asci['Z'-32][1];
   LCDMEM[pos3]= char_gen_asci['W'-32][0];
   LCDMEM[pos3E]= char_gen_asci['W'-32][1];
   LCDMEM[pos4]= char_gen_asci['O'-32][0];
   LCDMEM[pos4e]= char_gen_asci['O'-32][1];
   LCDMEM[pos5e]= char_gen_asci[numb+4][1];
   LCDMEM[pos6]= char_gen_asci[numb+5][0];
   LCDMEM[pos6e]= char_gen_asci[numb+5][1];*/

   //显示2个冒号
          LCDMEM[19]= 0x04;
       Data++;

       如果(data>=65) data=1;
       FRAMWrite();



空 FRAMWrite (空)

 unsigned int i=0;

 对于(i=0;i<100;i++)
 {
     FRAM_WRITE[i]=数据;
 }



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

    感谢您发表您的问题。
    我刚刚在 MSP430FR5989 LaunchPad 上运行了代码、在我关闭电源后、我没有看到 FRAM_WRITE 变为空。
    我会为您做更多的研究、尽快回复您。

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

    您好、recyzysztof、

    • 将变量放置在 FRAM 中

    我知道您将 FRAM_WRITE 定义为#pragma NOINIT、这将确保不会初始化此变量 、但这不会将 FRAM_WRITE 放入 FRAM 中。

    为了将 FRAM_WRITE 放入 FRAM 中、您需要将其定义为#pragma PERSISTENT 并将其初始化为0。 这只会在首次下载时初始化它,然后在下载后不会初始化它。

    如果您想使用 NOINIT 并将其放置在 FRAM 中、则需要修改 lnk_msp430fr6989.cmd 文件。 删除".TI.noinit :{}>RAM"并将 .TI.noinit 添加 到与 .TI.persistent 相同的组中。 如下图所示。

    • 检查变量是否在 FRAM 中  

    要检查变量是否放置在 FRAM 中、您可以检查该变量的地址。 FRAM 原点= 0x4400、长度= 0xBB80。

    如果您有任何疑问、请告诉我。

    谢谢、

    是的

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

    不幸的是。

    如果我在 所有情况下都设置 PERSISTENT 或 NOINIT =、则 FRAM 中的值会被复位。 当然、地址是0x004400。

    但我看到了有趣的想法-如果我在表中只使用一个位置-例如读取这些 FRAM_WRITE[127]、我看到值为0、但表中的另一条记录具有最后的值。 我不理解这一点。

    我使用 CCS 6.1和 Launchpad FR6989。

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

    我尝试了您的代码并将变量定义为#pragma PERSISTENT、但无法重现您的情况。
    因此、当您将变量定义为#pragma PERSISTENT 时、您可以看到它们的地址为0x4400、但在断开电源后该值仍将复位?

    谢谢、
    是的