/*
 * UserFlash.c
 *
 *  Created on: 2014-4-17
 *      Author: zdl
 */
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "inc/hw_gpio.h"
#include "driverlib/sysctl.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom_map.h"
#include "driverlib/gpio.h"
#include "driverlib/flash.c"
#include "UserFlash.h"



//========================================================
//        Flash address  00000000-00040000
// 		      TIVC 123GXL 256Kb Flash
//========================================================
//
//BlockN 0-255  Pos 0-256
//
//=======================================================


//
//uint32_t teststring[]={222,333,444,555};
//uint32_t data=0;
//uint32_t *pvadr;
//uint32_t ui32ReadBuf[4];
//int main(void) {
//
//	SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
//
//	//FlashErase(BaseAddr(100,12));
//	_nop();
//	FlashWrite(BaseAddr(100,20),teststring,16);
//	_nop();
//	FlashRead(BaseAddr(100,20),ui32ReadBuf,16);
//	_nop();
//	while(1)
//	{
//
//		_nop();
//
//	}
//}

//========================================================
//FlashRead Flash  Ŀĵַ ȡ Ϊ4
//========================================================
void FlashRead(uint32_t ui32DstAddr, void *pui8SrcData,
        uint32_t ui32Length)
{
	uint32_t *ui32TmpAddr;
	uint32_t *ui32SrcAddr =(uint32_t*)pui8SrcData;
		ui32TmpAddr=(uint32_t*)ui32DstAddr;
	while(ui32Length)
	{
		*ui32SrcAddr=*ui32TmpAddr;
		ui32SrcAddr++;
		ui32TmpAddr++;
		ui32Length-=4;
	}
}
//========================================================
//FlashWrite дFlash  Ŀĵַ ȡ Ϊ4
//========================================================
void FlashWrite(uint32_t ui32DstAddr, void *pui8SrcData,
        uint32_t ui32Length)
{
	uint32_t ui32Block=0,ui32BlockBuf[256]; 	//ֽڶȡ
	uint32_t ui32Pos,ui32Cnt;
	uint32_t *ui32SrcAddr =(uint32_t*)pui8SrcData;

	ui32Block=ui32DstAddr/BLOCK_SIZE;
	ui32Pos=ui32DstAddr%BLOCK_SIZE;

	FlashRead(ui32Block*0x400,ui32BlockBuf,BLOCK_SIZE);

	for(ui32Cnt=0;ui32Cnt<ui32Length;ui32Cnt+=4)
	{
		ui32BlockBuf[(ui32Pos+ui32Cnt)/4]=*ui32SrcAddr++;
	}
	FlashErase(ui32Block*0x400);
	FlashProgram(ui32BlockBuf,ui32Block*0x400,BLOCK_SIZE);

}
unsigned char char2Hex(unsigned char val)
{
	unsigned char temp =0;
	if(val<=9)
	{
		temp = val +0x30;
	}
	else
	{
		switch(val)
		{
			case 10:
				temp = 'a';
			break;
			case 11:
				temp = 'b';
			break;
			case 12:
				temp = 'c';
			break;
			case 13:
				temp = 'd';
			break;			
			case 14:
				temp = 'e';
			break;			
			case 15:
				temp = 'f';
			break;
			default:
			break;			
		}
	}
	return temp;
}