📄 flash_management.c
字号:
/*
+FHDR------------------------------------------------------------------
Copyright (c),
Tony Yang –51,AVR,ARM firmware developer
Contact:qq 292942278 e-mail:tony_yang123@sina.com.cn
Abstract:
$Id: flash_management.c,v 1.1.1.1 2007/02/24 07:59:45 yangwenbin Exp $
-FHDR-------------------------------------------------------------------
*/
#include "include\types.h"
#include "include\flash_management_cfg.h"
void SendByte(u8 data);
static u8 buf[4096];
/*
===============================================================================
函数
read flash sector
入口: buf:数据缓冲区首地址,sector_address:flash扇区地址
出口: SUCC
===============================================================================
*/
u8 read_flash_sector(u8 *buf_,u32 sector_address)
{
#if RAM_DISK
u32 address;
u16 i;
address = 0x80000000 + sector_address * 512 + 70 * 512;
for(i = 0; i < 512; i++)
{
buf_[i] = *((volatile u8 *)(address + i));
}
return(SUCC);;
#else
//u16 j;
u16 i;
u32 address;
address = 0x81000000 + sector_address * 512;
for(i = 0; i < 512; i++)
{
buf_[i] = *((volatile u8 *)(address + i));
//for(j = 0; j < 20;j++);
}
return(SUCC);
#endif
}
/*
===============================================================================
函数
Poll_Toggle_Bit
入口: 无
出口: 无
===============================================================================
*/
static void Poll_Toggle_Bit(void)
{
u16 PreByte,CurByte;
//u16 i;
// for(i = 0;i<5;i++);
PreByte = *((volatile u16 *)(0x81000002));
do{
CurByte = *((volatile u16 *)(0x81000002));
if((CurByte & 0x40) == (PreByte &0x40))
break;
PreByte = CurByte;
}while(1);
}
/*
===============================================================================
函数
write flash sector
入口: buf:数据缓冲区首地址,sector_address:flash扇区地址
出口: SUCC
===============================================================================
*/
u8 write_flash_sector(u8 *buf_,u32 sector_address)
{
#if RAM_DISK
u32 address;
u16 i;
address = 0x80000000 + sector_address * 512 + 70 * 512;
for(i = 0; i < 512; i++)
{
*((volatile u8 *)(address + i)) = buf_[i];
}
return(SUCC);
#else
u32 address;
u16 i;
u16 j;
/* 2K word sector save */
address = 0x81000000 + ((sector_address) / 8) * 4096 ;
for(i = 0; i < 4096; i+=2)
{buf[i] = (u8)(*((volatile u16 *)(address + i)) & 0xff);
buf[i+1] = (u8)(*((volatile u16 *)(address + i)) >> 8 & 0xff);
}
/* 2K word sector erased */
address = 0x81000000 + sector_address * 512;
*((volatile u16 *)(0x81000000+0x5555 * 2)) = 0xaa;
*((volatile u16 *)(0x81000000+0x2AAA * 2)) = 0x55;
*((volatile u16 *)(0x81000000+0x5555 * 2)) = 0x80;
*((volatile u16 *)(0x81000000+0x5555 * 2)) = 0xaa;
*((volatile u16 *)(0x81000000+0x2AAA * 2)) = 0x55;
*((volatile u16 *)(address)) = 0x30;
Poll_Toggle_Bit();
/* Write back sector 2k word */
address = (sector_address % 8) * 512;
for(i = 0;i < 512;i++)
{
buf[address + i] = buf_[i];
}
address = 0x81000000 + ((sector_address) / 8) * 4096;
for( i = 0;i < 4096;i += 2 )
{
*((volatile u16 *)(0x81000000 + 0x5555 * 2)) = 0xaa;
*((volatile u16 *)(0x81000000 + 0x2AAA * 2)) = 0x55;
*((volatile u16 *)(0x81000000 + 0x5555 * 2)) = 0xa0;
*((volatile u16 *)(address)) =* (u16*)( buf + i);
address += 2;
Poll_Toggle_Bit();
}
return(SUCC);
#endif
}
/*
+FFTR--------------------------------------------------------------------
$Log: flash_management.c,v $
-FFTR--------------------------------------------------------------------
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -