|
发表于 2011-2-28 09:42:31
|
显示全部楼层
我写的一个LOADER部分,你参考一下。
#pragma segment="RAMLOADER" 1
#pragma segment="ROMLOADER" 1
#pragma location="RAMLOADER"
void Loader(uint16_t BlockNum)
{
uint8_t *Flash_ptr; // Flash pointer
uint8_t *pData; //写入数据地址
uint16_t i;
Flash_ptr = (uint8_t *) (BlockNum); // Initialize Flash Block pointer
pData=(uint8_t *)DATA_ADDR;
// FCTL1 = FWKEY + ERASE; // Set Erase bit
// FCTL3 = FWKEY; // Clear Lock bit
// *Flash_ptr = 0; // Dummy write to erase Flash segment D
while(FCTL3 & BUSY);
FCTL1 = FWKEY +WRT; // Set WRT bit for write operation
FCTL3 = FWKEY;
for (i=0; i<64; i++)
{
*Flash_ptr++ = *pData++; // copy value segment C to segment D
while(!(FCTL3 & WAIT)); // WAIT until Flash is ready
}
FCTL1 = FWKEY; // Clear WRT bit
while(FCTL3 & BUSY); // Check Flash BUSY bit
FCTL3 = FWKEY + LOCK + LOCKA; // Set LOCK bit
}
//
#pragma location="ROMLOADER"
void write_Seg (uint16_t BlockNum)
{
uint8_t *Flash_ptr; // Flash pointer
uint8_t *pData; //写入数据地址
uint16_t i;
Flash_ptr = (uint8_t *) (BlockNum); // Initialize Flash Block pointer
pData=(uint8_t *)DATA_ADDR;
// FCTL1 = FWKEY + ERASE; // Set Erase bit
// FCTL3 = FWKEY; // Clear Lock bit
// *Flash_ptr = 0; // Dummy write to erase Flash segment D
while(FCTL3 & BUSY);
FCTL1 = FWKEY +WRT; // Set WRT bit for write operation
FCTL3 = FWKEY;
for (i=0; i<64; i++)
{
*Flash_ptr++ = *pData++; // copy value segment C to segment D
while(!(FCTL3 & WAIT)); // WAIT until Flash is ready
}
FCTL1 = FWKEY; // Clear WRT bit
while(FCTL3 & BUSY); // Check Flash BUSY bit
FCTL3 = FWKEY + LOCK + LOCKA; // Set LOCK bit
}
在工程选项里设置一下,在 options --> linker -->Extera options下面加上
-Z(DATA)RAMLOADER=200-27F
-Z(CODE)ROMLOADER,ROM_4=F000-FFDF,F000-FFDF
后面的是地址,你看看放在那里好。在IAR帮助里有,很详细。
#pragma location="ROM_4"
#pragma language=extended
void CopyLoaderToRAM(void)
{
void * ram_start = __sfb("RAMLOADER"); // start of RAMCODE
void * ram_end = __sfe("RAMLOADER"); // end of RAMCODE
void * rom_start = __sfb("ROMLOADER"); // start of ROMCODE
// compute the number of bytes to copy
unsigned long size = (unsigned long)(ram_end) - (unsigned long)(ram_start);
// copy the contents of ROMCODE to RAMCODE
memcopy( ram_start, rom_start, size );
}
#pragma language=default
上面的是拷贝函数,要在调用LOADER前调用。
Loader 和 write_Seg 两个函数是一样的,分别在RAM里和ROM里。当然可以只写一个函数
在链接选项里加上
-QRAMCODE=ROMCODE
我写成两个是为了,两个函数可以放在RAM 和 ROM里的任何地址。
我没贴擦除函数,写FLASH之前要先擦除。一个意思,好好看看IAR的帮助吧。 |
|