⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prg0.cpp

📁 单片机对FLASH芯片的烧写,源程序,原理图,PCB图
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Prg0.cpp : implementation file
//

#include "stdafx.h"
#include "prgx.h"
#include "Prg0.h"
#include "PrgDlg0.h"
#include "FileAcess.h"
#include "EraseSel.h"
#include "RWset.h"

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <string.h>
#include <iostream.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CPrg0 dialog


CPrg0::CPrg0(CWnd* pParent /*=NULL*/)
	: CDialog(CPrg0::IDD, pParent)
{
	//{{AFX_DATA_INIT(CPrg0)
	m_Dsp = _T("");
	m_DspState = _T("缓冲区没有数据");
	m_DspDeviceInf = _T(" FLASH: 29LV160T    厂商代码:       器件ID:  ");
	m_ProgressNum = _T("");
	//}}AFX_DATA_INIT
}


void CPrg0::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CPrg0)
	DDX_Control(pDX, IDC_STATES, m_DspStCtl);
	DDX_Control(pDX, IDC_INFOX, m_DspDeviceInfoCtl);
	DDX_Control(pDX, IDC_PROGRESS1, m_Progr);
	DDX_Text(pDX, IDC_BUF, m_Dsp);
	DDV_MaxChars(pDX, m_Dsp, 100000000);
	DDX_Text(pDX, IDC_STATES, m_DspState);
	DDX_Text(pDX, IDC_INFOX, m_DspDeviceInf);
	DDX_Text(pDX, IDC_STATIC7, m_ProgressNum);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CPrg0, CDialog)
	//{{AFX_MSG_MAP(CPrg0)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_OPENFILE, OnOpenfile)
	ON_BN_CLICKED(IDC_SAVEFILE, OnSavefile)
	ON_BN_CLICKED(IDC_TESTCOMM, OnTestcomm)
	ON_BN_CLICKED(IDC_READ, OnRead)
	ON_BN_CLICKED(IDC_ERASE, OnErase)
	ON_BN_CLICKED(IDC_PROG, OnProg)
	ON_BN_CLICKED(IDC_NEXTPAGE, OnNextpage)
	ON_BN_CLICKED(IDC_LASTPAGE, OnLastpage)
	ON_BN_CLICKED(IDC_CLEARFILEBUF, OnClearfilebuf)
	ON_BN_CLICKED(IDC_LOCATEBUF, OnLocatebuf)
	ON_BN_CLICKED(IDC_VERIFY, OnVerify)
	ON_BN_CLICKED(IDC_STOPX, OnStopx)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPrg0 message handlers

BOOL CPrg0::OnInitDialog() 
{
	CDialog::OnInitDialog();

//	m_Progr.SetWindowText("9999999999999");
	m_ProgressNum=_T("");
	w=(BYTE *)malloc(MAXFILELEN);	//最大长度
	if(!w)
ext:
	{AfxMessageBox("内存不足,请退出部分应用程序后在运行本程序。");
	 return FALSE;
	}
	r=(BYTE *)malloc(MAXFILELEN);	//最大长度
	if(!r)
	{//AfxMessageBox("内存不足,请退出部分应用程序后再运行本程序。");
	 free(w);
	 goto ext;
//	 return FALSE;
	}
	Dsp_flag=0;	
	Dsp_Cnt=0;
	fstart=1;
	rfile_flag=wfile_flag=0;
	Cur_FilePtr=Cur_RDataPtr=0;
	MaxLen=Cur_Ptr=0;
	FileLen=RDataLen=0;
	in_erase=in_prgF=in_readF=0;
	m_Progr.SetRange(0,100);
	Cur_progressPtr=0;
	m_Progr.SetPos(0);

	b_FOpen=(CButton *)GetDlgItem(IDC_OPENFILE);
	b_CommTest=(CButton *)GetDlgItem(IDC_TESTCOMM);
	b_RFlash=(CButton *)GetDlgItem(IDC_READ);
	b_WFlash=(CButton *)GetDlgItem(IDC_PROG);
	b_EFlash=(CButton *)GetDlgItem(IDC_ERASE);
	b_FSave=(CButton *)GetDlgItem(IDC_SAVEFILE);
	b_BufClr=(CButton *)GetDlgItem(IDC_CLEARFILEBUF);
	b_BufLocate=(CButton *)GetDlgItem(IDC_LOCATEBUF);
	b_Verify=(CButton *)GetDlgItem(IDC_VERIFY);
	b_Stop=(CButton *)GetDlgItem(IDC_STOPX);
	b_NextPage=(CButton *)GetDlgItem(IDC_NEXTPAGE);
	b_LastPage=(CButton *)GetDlgItem(IDC_LASTPAGE);

	B_FOpen=B_CommTest=B_RFlash=B_WFlash=B_EFlash=1;
	B_FSave=B_BufClr=B_BufLocate=B_Verify=B_Stop=B_NextPage=B_LastPage=0;
	DspButton();
	UpdateData(FALSE);
	SetTimer(111,50,0);	//
	return TRUE;
}

void CPrg0::OnTimer(UINT nIDEvent) 
{
	CDialog::OnTimer(nIDEvent);
	if(fstart)
	{CPrgDlg0	Dlg;
	 KillTimer(nIDEvent);
	 fstart=0;
	 Dlg.flag=1;	//init comm232
	 Dlg.prg=this;
	 int r=Dlg.DoModal();
	 if(r!=IDOK){comm_OK=0;}//CDialog::OnCancel();}
	 else comm_OK=1;
	 SetTimer(111,50,0);
	 return;
	}
	if(in_erase || in_prgF || in_readF)
	{	TmOut--;
		if(!TmOut)
			{tmp=m_DspState;
			 Stopx(1);
			 KillTimer(nIDEvent);
			 AfxMessageBox("超时错误!\n\n操作终止。\n");
			 SetTimer(111,50,0);
			}
		else {KillTimer(nIDEvent);
				Rcv();
				if(in_erase)SetTimer(111,1000,0);
				else SetTimer(111,1,0);
			}
	}
	if(Dsp_flag)
	{	Dsp_Cnt++;
		if(Dsp_Cnt>100)
		{m_DspState = _T("请选择操作类型");
		 Dsp_flag=0;	Dsp_Cnt=0;
		 m_Progr.SetPos(0);
		 DspID(0);
		 UpdateData(FALSE);
		}
	}
/*	if(in_erase)
	{	DataLenx+=50;
		Cur_progressPtr=(int)(DataLenx*100/DataLen);
	}
	else if(in_prgF)
	{
	}
	else if(in_readF)
	{
	}
*/	//if(in_erase || in_prgF || in_readF)m_Progr.SetPos(0);
//	UpdateData(FALSE);
}

void CPrg0::OnOpenfile() 
{
//	tmp = _T("请选择操作类型");
	m_Progr.SetPos(0);
	Dsp_flag=0;
	CFileAcess	dlg;
	dlg.flag=1;
	tmp=m_DspState;
	m_DspState = _T("执行打开文件操作");
	UpdateData(FALSE);
	int r=dlg.DoModal();
	if(r!=IDOK)
	{if(in_erase || in_prgF || in_readF)m_DspState = tmp;//_T("请选择操作类型"); 	
	 else m_DspState = _T("请选择操作类型"); 	
	 UpdateData(FALSE);	
	 return;
	}
	tmp = _T("请选择操作类型");
	FileName=dlg.m_FileName;
	FileLen=dlg.FileLen;
	HANDLE hd;
	DWORD	lenx;
	m_DspState = _T("正在打开文件...");
	UpdateData(FALSE);
	hd=CreateFile((LPCTSTR)FileName,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	if(hd!=INVALID_HANDLE_VALUE)
	{
	 ReadFile(hd,(void*)w,FileLen,&lenx,NULL);
	 CloseHandle(hd);
	}
	else {AfxMessageBox("文件操作错误!!\n\n无法完成文件装载。"); 	m_DspState = _T("文件操作发生错误!"); 	UpdateData(FALSE);	return;}

/**********************************************************
	BYTE dd=0;
	for(int i=0;i<10000;i++)
	{w[i]=dd;
	 dd++;
	}
	FileLen=10000;
*///**********************************************************

	m_DspState = _T("文件装载完毕。");
	Cur_FilePtr=0;
	Cur_RDataPtr=0;
	Cur_Ptr=0;
	wfile_flag=1;
	MaxLen=__max(FileLen,RDataLen);
	OnDspFile();
	if(FileLen>(MAXLINESINONEPAGE*MAXBYTESINONELINE))B_NextPage=1;
	B_FOpen=B_CommTest=B_RFlash=B_WFlash=B_EFlash=1;
	B_BufClr=B_BufLocate=1;
	DspButton();
//	Dsp_flag=1;
//	AfxMessageBox(FileName);
}

void CPrg0::OnSavefile() 
{
	HANDLE hd;
	DWORD	lenx;
	hd=CreateFile("c:\\flash.bin",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	if(hd!=INVALID_HANDLE_VALUE)
	{
	 WriteFile(hd,(void*)r,RDataLen,&lenx,NULL);
	 CloseHandle(hd);
	}
	AfxMessageBox("数据已经保存到文件:\n   c:\\flash.bin\n");
}

void CPrg0::OnTestcomm() 
{
	Dsp_flag=0;
	CPrgDlg0	Dlg;
	Dlg.flag=0;
	Dlg.prg=this;
	m_DspState = _T("执行通讯测试操作");
	UpdateData(FALSE);
	int r=Dlg.DoModal();	//don't init comm232
	if(r==IDOK)comm_OK=1;
	else comm_OK=0;
	m_DspState = _T("通讯测试完毕");
	UpdateData(FALSE);
//	Dsp_flag=1;
}

void CPrg0::OnRead()
{
	Dsp_flag=0;
	tmp = _T("请选择操作类型");
	m_Progr.SetPos(0);
	DspID(0);
//	tmp=m_DspState;
	m_DspState = _T("执行读FLASH操作");
	UpdateData(FALSE);
	CRWset dlg;
	dlg.flag=1;
	dlg.Addrf1=0x1fffff;
	if(dlg.DoModal()!=IDOK){DspErrMessage("");	return;}
	if(Comm_Test(1))return;
	BYTE *x;	//	DWORD LenX;
	DataLen=dlg.Addrf1-dlg.Addrf0+1;
	dlg.Addrf0/=2;	//字节地址->字地址
//	dlg.Addrf1/=2;	//字节地址->字地址
//	dlg.Addrb0/=2;	//字节地址->字地址
	x=(BYTE *)&dlg.Addrf0;
	FlashAddr=dlg.Addrf0;
	BufAddr=dlg.Addrb0;
	SBuf[1]=8;			//len
	SBuf[2]=CMD_READ;	//command
	SBuf[3]=x[2];		//起始地址
	SBuf[4]=x[1];
	SBuf[5]=x[0];
	x=(BYTE *)&DataLen;
	SBuf[6]=x[2];		//长度
	SBuf[7]=x[1];
	SBuf[8]=x[0];
	if(!PrepareComm(CMD_READ))m_DspState = _T("正在执行读FLASH操作...");
	else {DspErrMessage("发送指令时出错!"); return;}
	Cur_CMD=CMD_READ;
	DataLenx=0;	Cur_RDataPtr=0; Cur_Ptr=0;	RDataLen=0;
//	MaxLen=FileLen;
//	OnDspFile();
//	comm_OK=0;
	TmConst=50;		//超时定时1.5s: 30*50ms
	TmOut=50;
	in_x=0;
	Cur_progressPtr=0;
	m_Progr.SetPos(0);	
	in_readF=1;	B_Stop=1; 
	B_FOpen=B_CommTest=B_RFlash=B_WFlash=B_EFlash=B_BufClr=B_BufLocate=0;
	B_NextPage=B_LastPage=0;
	DspButton();
	tmp=m_DspState;
	st=time(NULL);
//	Dsp_flag=1;
}

void CPrg0::OnErase() 
{
	Dsp_flag=0;
	tmp = _T("请选择操作类型");
	m_Progr.SetPos(0);
//	tmp=m_DspState;
	CEraseSel dlg;
	m_DspState = _T("执行FLASH擦除操作");
	DspID(0);
	UpdateData(FALSE);
	if(dlg.DoModal()!=IDOK){m_DspState = _T("请选择操作类型"); 	UpdateData(FALSE);	return;}
	char s[100];
	BYTE *x;
	DWORD addr;
	sprintf(s,"%x",dlg.sel);//	AfxMessageBox(s);
	if(Comm_Test(1))return;
	if(!dlg.sel)
	{if(!PrepareComm(CMD_CHIP_ERASE))m_DspState = _T("正在执行芯片擦除操作(约15秒)...");
	 else {DspErrMessage("发送指令时出错!"); return;}
	 Cur_CMD=CMD_CHIP_ERASE;
	 DataLen=18000;		//用于进度显示:ERASE初始化约需15s
	 TmConst=50;		//超时定时1.5s: 30*50ms
	 TmOut=50;
	}
	else
	{if(dlg.sel>=1 && dlg.sel<=31)addr=(dlg.sel-1)*0x8000;
	 else if(dlg.sel==32)addr=0xf8000;
	 else if(dlg.sel==33)addr=0xfc000;
	 else if(dlg.sel==34)addr=0xfd000;
	 else if(dlg.sel==35)addr=0xfe000;
	 x=(BYTE *)&addr;//	 sprintf(s,"%x-%x-%x-%x",x[3],x[2],x[1],x[0]);//	 AfxMessageBox(s);
	 SBuf[1]=5;			//len
	 SBuf[2]=CMD_SECT_ERASE;	//command
	 SBuf[3]=x[2];
	 SBuf[4]=x[1];
	 SBuf[5]=x[0];
	 if(!PrepareComm(CMD_SECT_ERASE))m_DspState = _T("正在执行扇区擦除操作(约8秒)...");
	 else {DspErrMessage("发送指令时出错!"); return;}
	 Cur_CMD=CMD_SECT_ERASE;
	 DataLen=6000;		//ERASE初始化约需8s
	 TmConst=60;		//超时定时1.5s: 30*50ms--
	 TmOut=60;
	}
	DataLenx=0;
//	comm_OK=0;
	in_x=0;
	Cur_progressPtr=0;
	m_Progr.SetPos(0);	
	in_erase=1;	B_Stop=1;
	B_RFlash=B_WFlash=B_EFlash=B_CommTest=0;
	DspButton();
	tmp=m_DspState;
	st=time(NULL);
//	Dsp_flag=1;
}

void CPrg0::OnProg() 
{
	Dsp_flag=0;
	if(!wfile_flag){AfxMessageBox("缓冲区没有数据!\n\n请先用打开文件操作装载编程数据。"); return;}
	tmp = _T("请选择操作类型");
	m_Progr.SetPos(0);
//	tmp=m_DspState;
	m_DspState = _T("执行 FLASH 编程操作");
	DspID(0);
	UpdateData(FALSE);
	CRWset dlg;
	dlg.flag=2;
	dlg.Addrf1=FileLen+10;
	if(dlg.DoModal()!=IDOK){DspErrMessage("");	return;}
	if(Comm_Test(1))return;
	BYTE *x;	//	DWORD LenX;
	DataLen=dlg.Addrf1-dlg.Addrf0+1;
	dlg.Addrf0/=2;	//字节地址->字地址/
//	dlg.Addrf1/=2;	//字节地址->字地址
//	dlg.Addrb0/=2;	//字节地址->字地址
	x=(BYTE *)&dlg.Addrf0;
	FlashAddr=dlg.Addrf0;
	BufAddr=dlg.Addrb0;
	SBuf[1]=8;			//len
	SBuf[2]=CMD_PROG;	//command
	SBuf[3]=x[2];		//起始地址
	SBuf[4]=x[1];
	SBuf[5]=x[0];
	DataLenx=0;
	x=(BYTE *)&DataLen;
	SBuf[6]=x[2];		//长度
	SBuf[7]=x[1];
	SBuf[8]=x[0];
	if(!PrepareComm(CMD_PROG))m_DspState = _T("正在执行 FLASH 编程操作...");
	else {DspErrMessage("发送指令时出错!"); return;}
	Cur_CMD=CMD_PROG;
//	comm_OK=0;
	TmConst=50;		//超时定时1.5s: 30*50ms
	TmOut=50;
	in_x=0;
	Cur_progressPtr=0;
	m_Progr.SetPos(0);	
	in_prgF=1;	B_Stop=1;
	B_FOpen=B_CommTest=B_RFlash=B_WFlash=B_EFlash=B_BufClr=0;
	DspButton();
	tmp=m_DspState;
	st=time(NULL);
//	Dsp_flag=1;
}

int CPrg0::InitComm232()// return : 0--正常, 1--错误状态
{
  COMSTAT    ComStat ;
  ComStat.fEof=1; 
  COMMTIMEOUTS  CommTimeOuts ;

  BYTE       bSet ;//	BOOL    fconnected;
  DCB dcb;		//	 OVERLAPPED OverLapped;
  BOOL   fRetVal ;
  DWORD lpEvtMask=EV_RXCHAR;

  HComm232= CreateFile(COMMPORT, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL );
  if (!HComm232)return 1;
  SetupComm(HComm232, 100000, 4096 ) ;

	CommTimeOuts.ReadIntervalTimeout =0; //0xFFFFFF;
	CommTimeOuts.ReadTotalTimeoutMultiplier =1;	// 2000;
	CommTimeOuts.ReadTotalTimeoutConstant =10;	//2000;
	CommTimeOuts.WriteTotalTimeoutMultiplier =0;//50*CBR_9600/9600;
	CommTimeOuts.WriteTotalTimeoutConstant = 0;//11111111;
	SetCommTimeouts(HComm232, &CommTimeOuts);
   
	dcb.DCBlength = sizeof( DCB ) ;

	GetCommState( HComm232, &dcb ) ;

	dcb.BaudRate =BAUDRATE;
	dcb.ByteSize =BYTESIZE;
	dcb.Parity =2;//MARKPARITY;
	dcb.StopBits =STOPBITS;
	dcb.fBinary = TRUE ;
	dcb.fParity =FPARITY;
	dcb.fOutxCtsFlow=FALSE;
	dcb.fOutxDsrFlow=FALSE;
	dcb.fDtrControl=DTR_CONTROL_DISABLE;
	bSet = (BYTE) ((0x04) != 0) ;

	dcb.fInX=dcb.fOutX=FALSE;
	dcb.XonLim = 100 ;
	dcb.XoffLim = 100 ;
	fRetVal = SetCommState(HComm232, &dcb )	;
	if (fRetVal)return 0;
	else return 1;
}

void CPrg0::OnCancel() 
{
	if(in_erase || in_prgF || in_readF)
	{if(DspHint()!=IDOK){return;}
	}
	else if(AfxMessageBox("FLASH 编程器程序即将退出!",MB_OKCANCEL)!=IDOK)return;
	CloseHandle(HComm232);
	free(w);
	free(r);
	CDialog::OnCancel();
}


BOOL CPrg0::PrepareComm(int CommType)
{
	BYTE flag=1;
//	int	i,j,r;
	
	if(CommType==CMD_OK)	//通讯测试
	{SBuf[1]=2;			//len
	 SBuf[2]=CMD_OK;	//command
	}//CMD_CHIP_ERASE,CMD_SECT_ERASE,CMD_PROG,CMD_READ,CMD_RSTFLASH,CMD_CHIP_ID,
	else if(CommType==CMD_CHIP_ERASE)//擦除FLASH
	{	SBuf[1]=2;			//len
		SBuf[2]=CMD_CHIP_ERASE;	//command
	}
	else if(CommType==CMD_RSTFLASH)//擦除FLASH
	{	SBuf[1]=2;			//len
		SBuf[2]=CMD_RSTFLASH;	//command
	}
//	else if(CommType==CMD_SECT_ERASE)	//扇区擦除
//	{SBuf[1]=5;			//len
//	 SBuf[2]=CMD_SECT_ERASE;	//command
//	 SBuf[3]=
//	}

	return Comm232();
}

int CPrg0::Comm232()
{
//	int	i,Num,x;
	BOOL	r;
	BYTE	Sum;
    DWORD Len,Lenx;
//	memset(&Lstatex,0,sizeof(LocalState));	//当前状态清零
//TX
	if(SBuf[1] && SBuf[1]<=MAXLEN)	//SBuff[1]--发的字节数
	{Len=SBuf[1]+2;

⌨️ 快捷键说明

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