📄 flash_operation.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 + -