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

2019-03-24 14:33发布

【求助】请问MSP430F149的程序放在FLASH,怎么让他在RAM中运行?有代码最好了,谢谢!! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
Triton.zhang
1楼-- · 2019-03-24 20:08
1. 在你的函数定义前面增加关键字 __ramfunc
例如, __ramfunc void clock_init(void);

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

高人
glphighlj
3楼-- · 2019-03-25 04:04
 精彩回答 2  元偷偷看……
wangfuchong
4楼-- · 2019-03-25 08:37
好像这样能提高写的速度。批量写好像就是需要在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);
}

如有用 ,要感谢我一声,毕竟帮你找了一下贴出来
Triton.zhang
5楼-- · 2019-03-25 14:00
1. 提高FLASH的操作速度和你放RAM里面运行代码没有关系。我上面的帖子已经分析了。
2. 如果你想提高写FLASH的速度,你需要优化写FLASH数据的代码。
glphighlj
6楼-- · 2019-03-25 15:15
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章