新闻中心

EEPW首页>嵌入式系统>设计应用> 写MSP430片内flash

写MSP430片内flash

作者: 时间:2016-11-25 来源:网络 收藏

本文引用地址://m.amcfsurvey.com/article/201611/321246.htm

再来个块写入的(TI例程)

//****************************************************************************

//MSP430F14x Demo - Flash In-System Programming, BlockWrite

//

//Description: This program first copies the FlashWrite routine to RAM, then

//erases flash seg A, then it increments all values in seg A using the 64

//byte block write mode.

//

//Assumed default MCLK = DCO ~800 kHz.

//Minimum RAM requirement = 512 bytes

//

//** Set Breakpoint on NOP in the Mainloop to avoid Stressing Flash **

//

//MSP430F149

//-----------------

///||XIN|-

//| ||

//--|RSTXOUT|-

//||

//

//H. Grewal / L. Westlund

//Texas Instruments Inc.

//Jun 2006

//Built with IAR Embedded Workbench Version: 3.30A

//******************************************************************************

#include

// Global variables

char value = 0;// 8-bit value to write to segment A

char* Flash_ptr;// Flash pointer

char* RAM_ptr;// RAM pointer

char* END_ptr;// End of FlashWrite routine

// Function prototypes

void FlashWrite();

void CopyRoutine();

void End_of_FlashWrite();

void main(void)

{

WDTCTL = WDTPW + WDTHOLD;// Stop watchdog timer

_DINT();// Diable Interrupts

CopyRoutine();// Copy FlashWrite routine to RAM

_EINT();// Enable Interrupts

while(1)// Repeat forever

{

Flash_ptr = (char *) 0x1000;// Initialize Flash pointer

FCTL2 = FWKEY + FSSEL1 + FN0;// MCLK/2 for Flash Timing Generator

FCTL1 = FWKEY + ERASE;// Set Erase bit

FCTL3 = FWKEY;// Clear Lock bit

*Flash_ptr = 0;// Dummy write to erase Flash segment

while(!(FCTL3 & WAIT));// WAIT until Flash is ready

asm("CALL #300h");// Execute FlashWrite from RAM

// Inline Assembly

value++;// Increment value

_NOP();// SET BREAKPOINT HERE

}

}

void CopyRoutine()

{

Flash_ptr = (char*)FlashWrite;// Set pointer to FlashWrite routine

RAM_ptr = (char*)0x0300;// Set pointer to RAM

END_ptr = (char*)End_of_FlashWrite;// Set pointer to End_of_FlashWrite

while(END_ptr != Flash_ptr)// Check for end of FlashWrite

{

*RAM_ptr = *Flash_ptr;// Copy word to RAM

Flash_ptr++;// Increment Flash pointer

RAM_ptr++;// Increment RAM pointer

}

}

void FlashWrite()

{

volatile int i;// Use as write counter

Flash_ptr = (char*)0x1000;// Initialize Flash pointer

while(FCTL3 & BUSY);// Check Flash BUSY bit

FCTL1 = FWKEY + BLKWRT + WRT;// Enable block-write operation

for(i = 0; i < 64; i++)

{

*Flash_ptr = value;// Write value to flash

Flash_ptr++;// Double-increment Flash pointer

while(!(FCTL3 & WAIT));// WAIT until Flash is ready

}

FCTL1 = FWKEY;// Clear BLKWRT & WRT bits

while(FCTL3 & BUSY);// Check Flash BUSY bit

FCTL3 = FWKEY + LOCK;// Reset LOCK bit

return;// Exits routine

}

void End_of_FlashWrite(){}// Marks end of FlashWrite

内容摘要:一、MSP430单片机FLASH存储器模块特点1.8~3.6V工作电压,2.7~3.6V编程电压;擦除/编程次数可达100000次:数据保持时间从10年到100年不等:60KB空间编程时间<5秒:保密熔丝烧断后不可恢复,不能再对JTAG进行任何访问;FLASH编...

一、MSP430 FLASH模块特点
1.8~3.6V工作电压,2.7~3.6V编程电压;
擦除/编程次数可达100000次:
数据保持时间从10年到100年不等:// 来自 :ST_M_8.C_N
60KB空间编程时间<5秒:
保密熔丝烧断后不可恢复,不能再对JTAG进行任何访问;
FLASH编程/擦除时间由内部硬件控制,无任何软件干预;

二、FLASH存储器的操作
由于FLASH存储器由很多相对独立的段组成,因此可在一个段中运行程序,而对另一个段进行擦除或写入操作。正在执行编程或擦除等操作的FLASH段是不能被访问的,因为这时该段是与片内地址总线暂时断开的。对FLASH模块的操作可分为3类:擦除、写入及读出。而擦除又可分为单段擦除和整个模块擦除;写入可分为字写入、字节写入、字连续写入和字节连续写入
1.FLASH擦除操作:对FLASH要写入数据,必须先擦除相应的段,对FLASH存储器的擦除必须是整段地进行,可以一段一段地擦除,也可以多端一起擦除,但不能一个字节或一个字地擦除。擦除之后各位为1。擦除操作的顺序如下:
选择适当的时钟源和分频因子,为时序发生器提供正确时钟输入
如果Lock=1,则将它复位:
BUSY标志位,只有当BUSY=0时才可以执行下一步,否则不行
如果擦除一段,则设置ERASE=1
如果擦除多段,则设置MERAS=1
如果擦除整个FLASH,则设置RASE=1,同时MERAS=1
对擦除的地址范围内的任意位置作一次空写入,用以启动擦除操作。
在擦除周期选择的时钟源始终有效
在擦除周期不修改分频因子
在BUSY=1期间不再访问所操作的段
电源电压应符合芯片的相应要求// 来自 :ST_M_8.C_N
对FLASH擦除要做4件事
对FLASH控制寄存器写入适当的控制位
BUSY位
空写一次
等待
2.FLASH编程操作。对FLASH编程按如下顺序进行:
选择适当的时钟源和分频因子
如果Lock=1,则将它复位
BUSY标志位,只有当BUSY=0时才可以执行下一步,否则不行
如果写入单字或单字节,则将设置WRT=1
如果是块写或多字、多字节顺序写入,则将设置WRT=1,BLKWRT=1
将数据写入选定地址时启动时序发生器,在时序发生器的控制下完成整个过程
块写入可用于在FLASH段中的一个连续的存储区域写入一系列数据。一个块为64字节长度。块开始在0XX00H、0XX40H、0XX80H、0XXC0H等地址,块结束在0XX3FH、0XX7FH、0XXBFH、0XXFFH等地址。块操作在64字节分界处需要特殊的软件支持,操作如下:
等待WAIT位,直到WAIT=1,表明最后一个字或字节写操作结束
将控制位BLKWRT复位
保持BUSY位为1,直到编程电压撤离FLASH模块
在新块被编程前,等待trcv(编程电压恢复时间)时间
在写周期中,必须保证满足以下条件:
被选择的时钟源在写过程中保持有效
分频因子不变
在BUSY=1期间,不访问FLASH存储器模块
对FLASH写入要做4件事
对FLASH控制寄存器写入适当的控制位
BUSY位
写一个数据
继续写一直到写完
3.FLASH错误操作的处理:在写入FLASH控制寄存器控制参数时,可引发以下错误:
如果写入高字节口令码错误,则引发PUC信号。小心操作可避免
在对FLASH操作期间读FLASH内容,会引发ACCVFIG状态位的设置。小心操作可避免
在对FLASH操作期间看门狗定时器溢出。建议用户程序在进行FLASH操作之前先停止看门狗定时器,等操作结束后再打开看门狗
所有的FLASH类型的MSP430器件0段都包含有中断向量等重要的程序代码,如果对其进行擦除操作,将会引起严重的后果
不要在FLASH操作期间允许中断的发生
4.FLASH操作小结
对FLASH的操作是通过对3个控制字中的相应位来完成的,只有控制位的唯一组合才能实现相应的功能。下表给出了正确的控制位组合:
功能BLKWRTWRTMerasEraseBUSYWAITLock
字或字节写入0100000
块写入1100010
段擦除并写入0001000
擦除A和B以外段0010000
全部擦除并写入00110x0

三、FLASH寄存器说明// 来自 :ST_M_8.C_N
允许编程、擦除等操作首先要对3个控制寄存器(FCTL1、FCTL2、FCTL3)的各位进行定义。它们使用安全键值(口令码)来防止错误的编程和擦除周期,口令出错将产生非屏蔽中断请求。安全键值位于每个控制字的高字节,读时为96H,写时为5AH。
1.FCTL1 控制寄存器1(用于控制所有写/编程或者删除操作的有效位),各位定义如下:
bit15~8bit7bit6bit5bit4bit3bit2bit1bit0
安全键值,读为96H,写5AHBLKWRTWRT------MERASERASE--
BLKWRT——段编程位。如果有较多的连续数据要编程到某一段或某几段,则可选择这种方式,这样可缩短编程时间。在一段程序完毕,再编程其它段,需对该位先复位再置位,在下一条写指令执行前WAIT位应为1。
0:未选用段编程方式
1:选用段编程方式
WRT——编程位
0:不编程,如对FLASH写操作,发生非法访问,使ACCVIFG位置位;
1:编程
MERAS——主存控制擦除位
0:不擦除
1:主存全擦除,对主存空写时启动擦除操作,完成后MERAS自动复位
ERASE——擦除一段控制位
0:不擦除
1:擦除一段。由空写指令带入段号来指定擦除哪一段,操作完成后自动复位
2.FCTL2 控制寄存器2(对进入时序发生器的时钟进行定义),各位定义如下:
bit15~8bit7bit6bit5bit4bit3bit2bit1bit0
安全键值,读为96H,写5AHSSEL1SSEL0FN5FN4FN3FN2FN1FN0
SSEL1、SSEL0——选择时钟源
0:ACLK
1:MCLK
2:SMCLK
3:SMCLK
FN5~FN0——分频系数选择位
0:直通
1:2分频
2:3分频
...... read datasheet
63:64分频
3.FCTL3 控制寄存器3(用于控制FLASH存储器操作,保存相应的状态标志和错误条件),各位定义如下:
bit15~8bit7bit6bit5bit4bit3bit2bit1bit0
安全键值,读为96H,写5AH----EMEXLockWAITACCVIFGKEYVBUSY
EMEX——紧急退出位。对FLASH的操作失败时使用该位作紧急处理
0:无作用
1:立即停止对FLASH的操作
Lock——锁定位,给已经编程好的FLASH存储器加锁
0:不加锁,FLASH存储器可读、可写、可擦除
1:加锁,加锁的FLASH存储器可读、不可写、不可擦除
WAIT——等待指示信号,该位只读。// 来自 :ST_M_8.C_N
0:段编程操作已经开始,编程操作进行中
1:段编程操作有效,当前数据已经正确地写入FLASH存储器,后续编程数据被列入计划
ACCVIFG——非法访问中断标志。当对FLASH阵列进行编程或擦除操作时不能访问FLASH,否则将使得该位置位
0:没有对FLASH存储器的非法访问
1:有对FLASH存储器的非法访问
KEYV——安全键值(口令码)出错标志位
0:对3个控制寄存器的访问,写入时高字节是0A5H
1:对3个控制寄存器的访问,写入时高字节不是0A5H,同时引发PUC信号
KEYV不会自动复位,须用软件复位
BUSY——忙标志位。该位只读。每次编程或擦除之前都应该检查BUSY位。当编程或擦除启动后,时序发生器将自动设置该位为1,操作完成后BUSY位自动复位
0:FLASH存储器不忙
1:FLASH存储器忙

可以在程序中擦写FLASH这样就不用判断Busy的标志,因为只有擦写完成的时候FLASH才有效!程序才能继续走!如果把程序拷到RAM中擦除就要判断BUSY了!
擦写完成后可以不用LOCK,用LOCK只是一个保险作用!防止你对FLASH的非法操作



上一页 1 2 3 4 下一页

关键词:MSP430片内flas

评论


技术专区

关闭