stm32在linux端的串口下載程序代碼

先打開文件並且初始化stm32的下載接口,其中 InitStm32Isp 用來初始化下載接口

int main (int argc, char *argv[])
{
	unsigned char *codebuf;
	int len,rst;
	FILE *fp;

	if(argc<2)	
	{
		printf("no bin file\n");
		return 1;
	}

	fp=fopen(argv[1],"rb");
	if(fp<=0)
	{
		printf("open file error\n");
		return 2;
	}

	//把文件的位置指針移到文件尾
	fseek(fp,0,SEEK_END);
	//獲取文件長度;
	len=ftell(fp);
	fseek(fp,0,SEEK_SET);
	codebuf=malloc(len);
	rst=fread(codebuf,1,len,fp);
	printf("read:%d %d\n",len,rst);
	InitStm32Isp(opencom,writecom,readcom,flushcom,closecom );
	rst=DemoPro(codebuf,len);
	printf("pro rst=%d\n",rst);
	free(codebuf);
	return 0;
}

燒錄過程:

int DemoPro(unsigned char *pdata,int len)
{
	int ret=0;
	stm32isp.fd=stm32isp.open();
	printf("fd:%d\n",stm32isp.fd);
	while(1){
		if(TestLink()!=0)					{ret= 1;break;}				//握手失敗
		if(GetVersionAndCmd()!=0)	{ret= 2;break;}				//獲取版本失敗
		printf("ver:%d.%d\n",stm32isp.ver>>4,stm32isp.ver&0x0f);
		if(stm32isp.ver!=0x22)		{ret= 3;break;}				//下載器的版本不對,暫時只針對2.2版本的程序
		if(GetProtectState()!=0)	{ret= 4;break;}				//其實讀取不了是不是保護的狀態的
		if(GetStm32TypeId()!=0)		{ret= 5;break;}				//獲得stm32的型號
		printf("stm32 type:%X\r\n",stm32isp.typeid);
		if(ReadMemory(0x1FFFF7E8,12,(unsigned char*)stm32isp.onlyId)!=0)	//讀取唯一id,讀取失敗則解鎖再讀取
		{
			printf("read id eror\n");
			if(UnRdProtect()!=0)	{ret= 6;break;}
			continue;			
		}
		else printf("stm32id:%08X%08X%08X\n",stm32isp.onlyId[0],stm32isp.onlyId[1],stm32isp.onlyId[2]);

		if(EraseFlash()!=0)
		{
			//擦除失敗 就擦除讀保護
			printf("Erase Chip error\n");
			if(UnRdProtect()!=0)	{ret= 7;break;}
			continue;
 		}

		//if(WriteMemory(0x8000000,sizeof(testcode),testcode)!=0)	{ret= 8;break;}
		//printf("Write Rom ok\n");
		//if(EnRdProtect()!=0)																		{ret= 9;break;}
		//printf("read protect\n");1
		//if(EnWrProtectX(0,2)!=0)																{ret= 10;break;}
		//printf("write protect ok\n");
		if(WriteBin2Flash(pdata, len)!=0)	{ret= 8;break;}												
		if(VerifyRom(pdata, len)!=0)			{ret= 9;break;}

		if(EnWrProtectX(0,64)==0)	
		{
			//寫入寫保護之後 系統會重啓
			if(TestLink()!=0)								{ret= 1;break;}					//握手失敗
		}else {ret= 10;break;}
		
		if(RunProgram(0x8000000)!=0)			{ret= 11;break;}
		break;
	}
	stm32isp.release(stm32isp.fd);
	return ret;
}

源碼下載地址 linux下stm32串口下載 源碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章