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/MSP430F5419A:访问闪存

Guru**** 2526700 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/703100/ccs-msp430f5419a-accessing-flash-memory

器件型号:MSP430F5419A

工具/软件:Code Composer Studio

大家好、我正在尝试将开关状态保存在闪存中。 因此、下次打开器件时、我将具有先前的开关设置。 以下是我 无法这样做的代码、请帮助 我。

#include 
volatile int RDATA;
volatile int SW1=0;
volatile int SW2=0;

//函数原型
void read (void);
void write (void);
void switching (unsigned int);

void main (void)
{
WDTCTL = WDTPW + WDTHOLD;//为方便起见,禁用看门狗计时器。
P1DIR |= BIT0;//将引脚4.1设置为输出方向。
P1DIR |= BIT1;
// P4SEL |= BIT1;//选择引脚4.1作为 PWM 输出

//配置开关
P2REN ||(BIT7 + BIT6);
P2OUT |=(BIT7 + BIT6);
P2IE |=(BIT7 + BIT6);
P2IES|=(BIT1)
~







(BIT1 + BIT1);(BIT1 + BIT1)(BIT1 + BIT1)(BIT1);(BIT7 + BIT1 (BIT1)(BIT1 + BIT1)(BIT1);(BIT1 (BIT1 + BIT1)(BIT1)(BIT1 + BIT2)(BIT1)(BIT1


如果(SW1 = 0)
{
切换(SW2);//根据计数器 SW2的值打开 LED
}
,否则(SW1 = 1)
{

切换(RDATA);//根据 SW1 = 1时写入闪存存储器上的计数器 SW2的值打开 LED;
write();

}
}


void switching (unsigned int a)
{
if (a =0)
{
P1OUT = BIT0;
}
否则(a =1)
{
P1OUT = BIT1;
}


void write (void)
{
__disable_interrupt ();//禁用

中断 int * Flash_ptr =(int *) 0x0E000;
while (BUSY & FCTL3
);}}} //检查闪存是否被使用
FCTL1 = FWKEY + ERASE;//设置擦除位
FCTL3 = FWKEY;//清除锁定位
* Flash_ptr = 0;//虚拟写入在
(BUSY & FCTL3)期间擦除闪存段
;//检查闪存是否被使用
FCTL1 = FWKEY; //清除 WRT 位
FCTL3 = FWKEY + LOCK;//设置 LOCK 位

FCTL1 = FWKEY + WRT;//设置 WRT 位以进行写操作

,同时(((FCTL3 & BUSY)!= 0)
;
* Flash_PTR= SW2;//向闪存写入值

FCTL1 = FWKEY; //清除 WRT 位
FCTL3 = FWKEY + LOCK;//设置 LOCK 位
_ENABLE_INTERRUPT ();
}

void 读取(void)
{

int * Flash_ptr =(int *) 0x0E000;


while (FCTL3 & Busy)!= 0)
;
RDATA =* Flash_void;

}
#pragma vector=port2_page_trader=(int *) 0x00_breake_page_translation_trand




(0x00);(偶数–0xP2IV_translation_range (0x00)(0x00_translation_breake_blue_blue_


//无
情形0x02:
break;//Pin0
情形0x04:
break;//Pin1
情形0x06:
break;//PIN2
情形0x08:
break;//pin3
情形0x0A:
break;//pin4
情形0x0C:
break;//pin5
情形0x0E:
{
if (SW1 < 1)
{
SW1+:break;// pin4情形0x0C:break;// bpin5案例0xbt;// bpin5 =






~= 0xbt;}= 0xbt;// bp2p2p1 = 1 = 1;buF




{
//pin7

if (SW2 < 1)
{
SW2++;

}
else
{
SW2 = 0;
}

P2IFG &&~BIT7;

break;

}


} 

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

    您好、Kary、

    您似乎有一些操作不按顺序执行、即您在写入闪存之前锁定闪存、这会阻止写入。 此外、您在解锁闪存之前尝试擦除、这也会阻止擦除。 我们提供了示例代码、展示了如何写入闪存、我建议按照示例代码执行正确的过程。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我今天早上想出来了、但闪存指针仍然指向-1、为什么?

    #include
    volatile int RDATA;
    volatile int SW1=0;
    volatile int SW2=0;

    //函数原型
    void read (void);
    void write (void);
    void 切换(unsigned int);

    void main (void)

    WDTCTL = WDTPW + WDTHOLD;//为方便起见,禁用看门狗计时器。
    P1DIR |= BIT0;//将引脚4.1设置为输出方向。
    P1DIR |= BIT1;
    // P4SEL |= BIT1;//选择引脚4.1作为 PWM 输出

    //配置交换机
    P2REN |=(BIT7 + BIT6);
    P2OUT |=(BIT7 + BIT6);
    P2IE |=(BIT7 + BIT6);
    P2IES |=(BIT7 + BIT6);
    P2IFG &=~(BIT7 + BIT6);

    _enable_interrupt ();

    while (1)




    如果(SW1 = 0)

    开关(SW2);//根据计数器 SW2的值来旋转 LED

    否则、如果(SW1 = 1)

    读();
    切换(RDATA);//根据 SW1=1时写入闪存的计数器 SW2的值来打开 LED;
    write();





    空切换(无符号 int a)

    如果(A ==0)

    P1OUT = BIT0;

    否则、如果(a = 1)

    P1OUT = BIT1;



    空写入(空)

    _disable_interrupt (); //禁用中断

    int * Flash_ptr =(int *) 0x0E000;
    while (忙和 FCTL3)
    ; //检查是否正在使用闪存
    FCTL1 = FWKEY + ERASE;//设置擦除位
    FCTL3 = FWKEY;//清除锁定位
    *闪存_ptr = 0;//虚拟写入以擦除闪存段

    FCTL1 = FWKEY + WRT;//为写入操作设置 WRT 位

    while ((FCTL3 & Busy)!= 0)

    *闪存_PTR= SW2;//将值写入闪存

    FCTL1 = FWKEY;//清除 WRT 位
    FCTL3 = FWKEY + LOCK;//设置 LOCK 位
    _enable_interrupt ();


    空读(空)


    int * Flash_ptr =(int *) 0x0E000;


    while ((FCTL3 & Busy)!= 0)

    RDATA =* Flash_ptr;


    #pragma vector=port2_vector
    _interrupt
    空端口_2 (空)


    开关(__evo_in_range (P2IV、0x10))

    情况0x00:
    中断;//无
    情况0x02:
    中断;//Pin0
    情况0x04:
    中断;//Pin1
    情况0x06:
    中断;//PIN2
    情况0x08:
    断开;//pin3
    情况0x0A:
    断开;//pin4
    情况0x0C:
    断开;//pin5
    情况0x0E:

    如果(SW1 < 1)

    SW1++;

    其他

    SW1 = 0;


    P2IFG &=~BIT6;
    中断;


    情况0x10:

    //pin7

    如果(SW2 < 1)

    SW2++;


    其他

    SW2 = 0;


    P2IFG &=~BIT7;

    中断;




  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是说闪存内容为-1还是指针地址为-1?
    您是否在内存查看器中观察到闪存内容?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、闪存指针的内容为-1、但我正在保存的闪存指针中的开关饱和为0或1。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我看到您的擦除操作在您解锁闪存控制器之前仍在进行、因此擦除操作实际上不会发生。
    尝试修复此问题并查看发生了什么。 我将再次查看我指向您的示例代码、并确保您遵循该代码。

    此外、还有一个可能有用的应用手册: http://www.ti.com/lit/slaa729

    最后、如果您要写入大量闪存(看起来是这样)、则可能会磨损闪存。 我建议您查看我们为这类应用提供的 FRAM 产品。