⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash_operation.c

📁 IC卡水表的源程序
💻 C
字号:
//****************************************************************************
//  MSP430-41X Demo - Flash In-System Programming 
//
//  Description; This program first erases flash seg A, then it increments all
//  values in seg A, then it erases seg B, then  copies seg A to seg B.
//  Assumed MCLK 550kHz - 900kHz.
//
//               MSP430F413
//            -----------------
//        /|\|              XIN|-  
//         | |                 | 
//         --|RST          XOUT|-
//           |                 |
//
//  Donghai CHeng
//  Lierda, Inc
//  NOVEMBER 2004
//  Built with IAR Embedded Workbench Version: 2.21B
//******************************************************************************

#include "msp430x41x.h"

/****************擦除信息断数据*************************/
void info_flash_erase(unsigned char *erase_address)
{
 FCTL2 = FWKEY + FSSEL_1 + FN4;
 FCTL1 = FWKEY + ERASE;
 FCTL3 = FWKEY;
 *erase_address = 0xFF;
}

/**********将RAM区数据copy至Flash信息段***************/
void info_flash_copy(unsigned char *source_address,unsigned char *target_address,unsigned int flash_length)
{
 unsigned int i;
 FCTL2 = FWKEY + FSSEL_1 + FN4;
 FCTL3 = FWKEY;
 FCTL1 = FWKEY + WRT;
 for (i=0; i<flash_length; i++)
  {
    *target_address++ = *source_address++;         // Write value to flash
  }
 FCTL1 = FWKEY;                  // Clear WRT bit
 FCTL3 = FWKEY + LOCK; 
}

/**********连续写数据至Flash信息段*****************/
void info_flash_write(unsigned char target,unsigned char *target_address,unsigned int flash_length)
{
 unsigned int i;
 FCTL2 = FWKEY + FSSEL_1 + FN4;
 FCTL3 = FWKEY;
 FCTL1 = FWKEY + WRT;
 for (i=0; i<flash_length; i++)
  {
    *target_address++= target;         // Write value to flash
  }
 FCTL1 = FWKEY;                  // Clear WRT bit
 FCTL3 = FWKEY + LOCK;
}

/**********将Flash信息段数据copy至RAM区************/
void flash_to_ram_copy(unsigned char *source_address,unsigned char *target_address,unsigned int length)
{
    unsigned int i;
    for (i=0; i<length; i++)
    {
     *target_address++= *source_address++;
    }
}

/***************数据从A段copy 至B段**************/
void infoA_to_infoB(void)     
{
 unsigned int i;
 char *Flash_ptrA;
 char *Flash_ptrB;
 Flash_ptrA=(char *) 0x1080;
 Flash_ptrB=(char *) 0x1000;
 info_flash_erase((unsigned char *)0x1080);
 FCTL2 = FWKEY + FSSEL_1 + FN4;
 FCTL3 = FWKEY;
 FCTL1 = FWKEY + WRT;
 for (i=0; i<128; i++)
  {
    *Flash_ptrA++=*Flash_ptrB++ ;         // Write value to flash
  }
 FCTL1 = FWKEY;                  // Clear WRT bit
 FCTL3 = FWKEY + LOCK;
}

/****主程序*****/
void main(void)
{
  unsigned char Data[10]={1,2,3,4,5,6,7,8,9,10};        //数据缓存区
  WDTCTL = WDTPW + WDTHOLD;
  SCFQCTL=31;                 //MCLK=32*ACLK=1024KHz,DCO+=0
  SCFI0=0;
  FLL_CTL0 |= XCAP18PF;
  
  info_flash_write(0x11,(unsigned char *)0x1000,10);     //从从0x1000开始连续写10个字节0x11;
  info_flash_erase((unsigned char *)0x1000);               //擦除B段数据(0x1000--0x1080)
  info_flash_copy((unsigned char *)&Data[0],(unsigned char *)0x1000,10);   //将DATA【10】数据写到以0x1000开始的连续10个字节
  Data[0]=11;Data[1]=12;
  flash_to_ram_copy((unsigned char *)0x1000,(unsigned char *)&Data[0],10); //将以0x1000开始的连续10个字节写到DATA【10】
  infoA_to_infoB();                                     //数据从A段copy 至B段
  LPM3;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -