6807|9

29

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

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

【求助】请问MSP430F149的程序放在FLASH,怎么让他在RAM中运行?有代码最好了,谢谢!!

最新回复

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
 
点赞 关注

回复
举报

400

帖子

0

TA的资源

五彩晶圆(中级)

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

2. 不清楚为什么你的代码要放在RAM中运行,一般这样用是因为主频很高时,FLASH的取指时间比CPU处理慢,所以把代码放在RAM中来提高MCU的运行速度。而MSP430的主频不高,单周期就能对FLASH取值,放在RAM中不会提高MCU的处理速度。
3. 如果是为了在RAM中去擦除FLASH,建议最好不要这样操作,风险大于,收益小。节约不了代码。也省不了空间。
 
 

回复

2002

帖子

24

TA的资源

五彩晶圆(高级)

板凳
 
原帖由 Triton.zhang 于 2012-4-17 16:27 发表 1. 在你的函数定义前面增加关键字 __ramfunc 例如, __ramfunc void clock_init(void); 2. 不清楚为什么你的代码要放在RAM中运行,一般这样用是因为主频很高时,FLASH的取指时间比CPU处理慢,所以把代码放在RAM中 ...

高人
 
 
 

回复

29

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 沙发 Triton.zhang 的帖子

谢谢你的建议,我用片内Flash存储数据,在RAM中运行是想提高Flash的速度,这样能提高吗?怎样才能提高Flash的速度?望指点下,非常感谢!!
 
 
 

回复

5276

帖子

5

TA的资源

裸片初长成(中级)

5
 
好像这样能提高写的速度。批量写好像就是需要在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);
}

如有用 ,要感谢我一声,毕竟帮你找了一下贴出来
 
个人签名没工作,没女人老婆,没宽带 ,  没钱
 
 

回复

400

帖子

0

TA的资源

五彩晶圆(中级)

6
 
1. 提高FLASH的操作速度和你放RAM里面运行代码没有关系。我上面的帖子已经分析了。
2. 如果你想提高写FLASH的速度,你需要优化写FLASH数据的代码。
 
 
 

回复

29

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 5楼 wangfuchong 的帖子

非常感谢!对我还是很有价值的~
 
 
 

回复

29

帖子

0

TA的资源

一粒金砂(中级)

8
 

回复 6楼 Triton.zhang 的帖子

好的,谢谢!
 
 
 

回复

5276

帖子

5

TA的资源

裸片初长成(中级)

9
 
原帖由 glphighlj 于 2012-4-21 23:30 发表 好的,谢谢!


如果您是用在内部FLASH存储数据上而且又关心存储速度的话,也许还是要放在RAM里运行,可能记错了,也许Triton.zhang说的不一定对,您再查查手册。
 
个人签名没工作,没女人老婆,没宽带 ,  没钱
 
 

回复

5276

帖子

5

TA的资源

裸片初长成(中级)

10
 
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 编辑 ]
 
个人签名没工作,没女人老婆,没宽带 ,  没钱
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表