[求助] 【求助】请问MSP430F149的程序放在FLASH,怎么让他在RAM中运行?

glphighlj   2012-4-16 17:06 楼主
【求助】请问MSP430F149的程序放在FLASH,怎么让他在RAM中运行?有代码最好了,谢谢!!

回复评论 (9)

1. 在你的函数定义前面增加关键字 __ramfunc
例如, __ramfunc void clock_init(void);

2. 不清楚为什么你的代码要放在RAM中运行,一般这样用是因为主频很高时,FLASH的取指时间比CPU处理慢,所以把代码放在RAM中来提高MCU的运行速度。而MSP430的主频不高,单周期就能对FLASH取值,放在RAM中不会提高MCU的处理速度。
3. 如果是为了在RAM中去擦除FLASH,建议最好不要这样操作,风险大于,收益小。节约不了代码。也省不了空间。
点赞  2012-4-17 16:27
引用: 原帖由 Triton.zhang 于 2012-4-17 16:27 发表 1. 在你的函数定义前面增加关键字 __ramfunc 例如, __ramfunc void clock_init(void); 2. 不清楚为什么你的代码要放在RAM中运行,一般这样用是因为主频很高时,FLASH的取指时间比CPU处理慢,所以把代码放在RAM中 ...

高人
点赞  2012-4-17 21:29

回复 沙发 Triton.zhang 的帖子

谢谢你的建议,我用片内Flash存储数据,在RAM中运行是想提高Flash的速度,这样能提高吗?怎样才能提高Flash的速度?望指点下,非常感谢!!
点赞  2012-4-19 11:29
好像这样能提高写的速度。批量写好像就是需要在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);
}

如有用 ,要感谢我一声,毕竟帮你找了一下贴出来
没工作,没女人老婆,没宽带 ,  没钱
点赞  2012-4-19 22:43
1. 提高FLASH的操作速度和你放RAM里面运行代码没有关系。我上面的帖子已经分析了。
2. 如果你想提高写FLASH的速度,你需要优化写FLASH数据的代码。
点赞  2012-4-20 08:45

回复 5楼 wangfuchong 的帖子

非常感谢!对我还是很有价值的~
点赞  2012-4-21 23:30

回复 6楼 Triton.zhang 的帖子

好的,谢谢!
点赞  2012-4-21 23:30
引用: 原帖由 glphighlj 于 2012-4-21 23:30 发表 好的,谢谢!


如果您是用在内部FLASH存储数据上而且又关心存储速度的话,也许还是要放在RAM里运行,可能记错了,也许Triton.zhang说的不一定对,您再查查手册。
没工作,没女人老婆,没宽带 ,  没钱
点赞  2012-4-22 15:34
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 编辑 ]
没工作,没女人老婆,没宽带 ,  没钱
点赞  2012-4-23 10:20
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复