先打開文件並且初始化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串口下載 源碼