2019-03-24 14:33发布
原帖由 Triton.zhang 于 2012-4-17 16:27 发表 1. 在你的函数定义前面增加关键字 __ramfunc 例如, __ramfunc void clock_init(void); 2. 不清楚为什么你的代码要放在RAM中运行,一般这样用是因为主频很高时,FLASH的取指时间比CPU处理慢,所以把代码放在RAM中 ...
最多设置5个标签!
例如, __ramfunc void clock_init(void);
2. 不清楚为什么你的代码要放在RAM中运行,一般这样用是因为主频很高时,FLASH的取指时间比CPU处理慢,所以把代码放在RAM中来提高MCU的运行速度。而MSP430的主频不高,单周期就能对FLASH取值,放在RAM中不会提高MCU的处理速度。
3. 如果是为了在RAM中去擦除FLASH,建议最好不要这样操作,风险大于,收益小。节约不了代码。也省不了空间。
高人
*/
#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);
}
如有用 ,要感谢我一声,毕竟帮你找了一下贴出来
2. 如果你想提高写FLASH的速度,你需要优化写FLASH数据的代码。
一周热门 更多>