[求助]
【求助】请问MSP430F149的程序放在FLASH,怎么让他在RAM中运行?
【求助】请问MSP430F149的程序放在FLASH,怎么让他在RAM中运行?有代码最好了,谢谢!!
1. 在你的函数定义前面增加关键字 __ramfunc
例如, __ramfunc void clock_init(void);
2. 不清楚为什么你的代码要放在RAM中运行,一般这样用是因为主频很高时,FLASH的取指时间比CPU处理慢,所以把代码放在RAM中来提高MCU的运行速度。而MSP430的主频不高,单周期就能对FLASH取值,放在RAM中不会提高MCU的处理速度。
3. 如果是为了在RAM中去擦除FLASH,建议最好不要这样操作,风险大于,收益小。节约不了代码。也省不了空间。
引用: 原帖由 Triton.zhang 于 2012-4-17 16:27 发表
1. 在你的函数定义前面增加关键字 __ramfunc
例如, __ramfunc void clock_init(void);
2. 不清楚为什么你的代码要放在RAM中运行,一般这样用是因为主频很高时,FLASH的取指时间比CPU处理慢,所以把代码放在RAM中 ...
高人
回复 沙发 Triton.zhang 的帖子
谢谢你的建议,我用片内Flash存储数据,在RAM中运行是想提高Flash的速度,这样能提高吗?怎样才能提高Flash的速度?望指点下,非常感谢!!
好像这样能提高写的速度。批量写好像就是需要在RAM中运行
*/
#include "msp430x42x.h"
unsigned char Array[128]; //待写入的数组
unsigned char RamCode[80]; //临时存放块写函数的RAM空间
unsigned char *Ptr=(unsigned char *)0x1080;//定义字节型指针,指向InfoA段
/*****************************************************************
* 名 称:Flash_WriteBlock()
* 功 能:向Flash内写入一个块(64字节)
* 入口参数:*P_Blk:数据块目标指针(指向Flash)
*P_Dat:数据源指针(指向数据)
* 出口参数:无
* 说 明: 该函数不能直接调用,需要先整体拷贝到RAM中,再从RAM中执
行该函数。
*****************************************************************/
void Flash_BlockWrite(unsigned char *P_Blk,unsigned char *P_Dat)
{
int i;
for(i=0;i<64;i++) //每个块64字节
{
FCTL1 = FWKEY + WRT + BLKWRT; //Flash进入批量写状态
*(P_Blk++)=*(P_Dat++); //依次写入数据
while((FCTL3 & WAIT)==0); //等待字节写操作完成
}
FCTL1 = FWKEY; //Flash退出批量写状态
while(FCTL3 & BUSY); //等待块写操作完成
}
/*****************************************************************
* 名 称:主函数
* 功 能:演示Flash的块操作
*****************************************************************/
void main( void )
{
int i;
unsigned char *CodePtr = (unsigned char*)(Flash_BlockWrite); //指向Flash_BlockWrite()函数入口的字节型指针
void(*Flash_BlockWrite_RAM)(unsigned char *,unsigned char *);//指向RAM中的函数的指针
Flash_BlockWrite_RAM=(void(*)(unsigned char *,unsigned char *))RamCode;//RAM函数指针指向临时存放代码的数组
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
FLL_CTL0 |= XCAP18PF; // 配置晶振负载电容
FCTL2 = FWKEY + FSSEL_2 + FN1; // MCLK/3 =349kHz
for(i=0;i<128;i++) Array=i; //为示意,随意产生一些数据
//---------------------------例2.6.4----------------------------------------------
FCTL3 = FWKEY ; //清除Flash的锁定位
_DINT(); //Flash操作期间不允许中断,否则将导致不可预计的错误
for(i=0;i<80;i++) RamCode=CodePtr; //将块写函数复制到RAM内
Flash_BlockWrite_RAM((unsigned char *)0x1080,Array); //执行RAM中的块写函数,写一个块
Flash_BlockWrite_RAM((unsigned char *)0x10C0,Array+64); //再写第二个块,共128字节
_EINT();
FCTL1 = FWKEY; //Flash退出写状态
FCTL3 = FWKEY + LOCK; //恢复Flash的锁定位,保护数据
_NOP(); //在这里设断点,View->Memory窗查看0x1080~10FF内容(例2.6.4的结果)
//---------------------------例2.6.7----------------------------------------------
for(i=0;i<128;i++) //循环128次(InfoA段共128字节)
{
Array=Ptr; //依次读取InfoA的内容(例2.6.7)
}
_NOP(); //在这里设断点查看Array[]数组的内容
//---------------------------例2.6.5----------------------------------------------
FCTL1 = FWKEY + ERASE; //Flash进入单段擦除状态
FCTL3 = FWKEY ; //清除Flash的锁定位
_DINT(); //Flash操作期间不允许中断,否则将导致不可预计的错误
*Ptr=0; //发出擦除指令的方法:向被擦除段内任意单元写0,
while(FCTL3 & BUSY); //等待操作完成
_EINT();
FCTL1 = FWKEY; //Flash退出擦除状态
FCTL3 = FWKEY + LOCK; //恢复Flash的锁定位,保护数据
_NOP(); //在这里设断点,View->Memory窗查看0x1080~10FF内容是否已被擦除
while(1);
}
如有用 ,要感谢我一声,毕竟帮你找了一下贴出来
1. 提高FLASH的操作速度和你放RAM里面运行代码没有关系。我上面的帖子已经分析了。
2. 如果你想提高写FLASH的速度,你需要优化写FLASH数据的代码。
回复 5楼 wangfuchong 的帖子
非常感谢!对我还是很有价值的~
回复 6楼 Triton.zhang 的帖子
好的,谢谢!
引用: 原帖由 glphighlj 于 2012-4-21 23:30 发表
好的,谢谢!
如果您是用在内部FLASH存储数据上而且又关心存储速度的话,也许还是要放在RAM里运行,可能记错了,也许Triton.zhang说的不一定对,您再查查手册。
MSP430x2xx Family User's Guide (Rev. I)
slau144i
第325页中
The block write can be used to accelerate the flash write process when many sequential bytes or words
need to be programmed.
A block write cannot be initiated from within flash memory. The block write must be initiated from RAM
only.
[ 本帖最后由 wangfuchong 于 2012-4-23 10:22 编辑 ]