flash.c

来自「arm开发很好的例程」· C语言 代码 · 共 126 行

C
126
字号

#include "bios.h"
#include "flash.h"
#include "utils.h"
#include "uart.h"







void Flash_send_commmand(UNS8 com)
{
	UNS16 *ptr = Flash_address_base;
	
	
	*(ptr + 0x555) = 0xaa;
	*(ptr + 0x2aa) = 0x55;
	*(ptr + 0x555) = com;
	
}

void Flash_reset(void)
{
	Flash_send_commmand(0xf0);	
}



void Flash_read_id(UNS16 *buf)
{
	UNS16 *ptr = Flash_address_base;
	
	
	Flash_send_commmand(0x90);
	*buf = *(ptr);
	buf++;
	ptr++;
	*buf = *(ptr);
	buf++;
	ptr+=0x0d;
	*buf = *(ptr);
	buf++;
	ptr++;
	*buf = *(ptr);
	Flash_reset();
	
}

UNS8 Flash_write(UNS32 size)
{
	UNS16 *ptr = Flash_address_base;
	UNS16 *Tptr = Flash_address_base;
	UNS16 *Sptr = (UNS16 *)0x1000;
	UNS32 i;
	UNS16 temp;
	
	Flash_send_commmand(0x20); //in to fast mode
	
	for( i = 0; i<size ; i+=2)
	{
		*ptr = 0xa0;
		temp = *Sptr;
		*Tptr = temp;
		
		//Delay_us(20);
		do{
			Delay_us(2);
		}while((*Tptr) != temp);
		
		Tptr ++;
		Sptr ++;
		
	}
	Flash_reset();
	return 0;
	
}

UNS8 Flash_sector_erase(UNS32 address)
{
	
	UNS16 *ptr = Flash_address_base;
	Flash_send_commmand(0x80);
	
	*(ptr + 0x555) = 0xaa;
	*(ptr + 0x2aa) = 0x55;
	ptr += address;
	*ptr = 0x30;
	do{
		Delay_ms(10);
	}while(((*ptr)&0x00ff) != 0x00ff);
	return 0;
}


UNS32 Flash_Verify(UNS32 size)
{
	
	UNS8 String[16];
	
	UNS32 i;
	UNS16 *Tptr = Flash_address_base;
	UNS16 *Sptr = (UNS16 *)0x1000;
	UNS16 temp;
	
	Flash_reset();
	size >>=1;
	for(i = 0;i < size;i++)
	{
		if( *Tptr != *Sptr )
		{
			my_printf("Target Value :0x%04x\n\r",*Tptr);
			my_printf("Source Value :0x%04x\n\r",*Sptr);
			break;
		}
		Tptr ++;
		Sptr ++;	
	}
	return i;
}



⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?