c++读取bin文件()
c++读取bin文件(),新营销网红网本栏目通过数据整理汇集了c++读取bin文件()相关信息,下面一起看看。
本文的主要目的是为STM32F103提供固件升级服务。在之前的文章(STM32F103 BootLoader实现1(BootLoader跳转到应用))中提到,STM32F103正在开发BootLoader。判断BootLoader是否要跳转到应用程序,最好检查应用程序固件的CRC,这样才能保证应用程序固件的正确性。毕竟应用的固件是开发出来的,允许用户在线升级。如果升级失败,程序可能会在STM32的BootLoader不知道的情况下运行。如果增加了CRC校验,如果固件升级不成功,那么固件会留在BootLoader中,用户可以重新下载固件来“保存”下位机。
STM32F103中有一个计算CRC值的库函数,很方便,如以下代码所示
# define app _ RUN _ base addr0x8008400//32KforBootloader,andotherspace for app # define app _ CRC _ base addr0x 8008000//芯片应用的CRC值存储地址firmware # define app _ flash _ range(470 1024)//0x 8008000到0x 8008400的1K空间作为配置信息的存储空间,CRC校验值和其他uint 8 _ t flash _ CRC _ check(){ 1uint32_tcal_crc=0x00,store _ crc=0x00uint32 _ tindex/ CRCinputdatabufferindex // changecrperipheralstate /hcrc。State=HAL _ CRC _ STATE _ BUSY/ ResetCRCCalculationUnit(hcrc-Instance-INITis writteninhcrc-Instance-DR)/hcrc。instance-CR
=CRC _ CR _ RESET;/ enter 32-bitinputdatatotherccalculator /for(index=0U;索引APP _ FLASH _ RANGE){ hcrc。instance-DR=(_ _ iou int 32 _ t )(APP _ RUN _ base addr index);指数=指数4;} cal _ crc=hcrc。instance-store _ CRC=(_ _ iou int 32 _ t )(APP _ CRC _ base addr);if(cal _ CRC==store _ CRC){ status=0x 01;//应用程序计算的CRC值与芯片中存储的CRC值一致}/ changecrperipheralstate /hccr . state=Hal _ CRC _ state _ ready;returnstatus}STM32的CRC值计算不需要我们过多的干预,只需要将数据放入寄存器即可。那么,应用的CRC值是多少呢?如果用C#做的程序可以轻松计算,那么我们只需要把应用程序的FW编译的BIN文件导入到程序中,然后计算CRC值,再更新到应用程序的固件中,就方便多了。
那么C#如何读取BIN文件并计算出与STM32F103一致的CRC值呢?
直接装载代码
privatestringfile_path=String .空的;privatevoidcheck _ CRC _ value(){ file _ path= //文件的路径如果(文件路径!=字符串。空)//需要确保文件路径不为空{ uint 32 CRC _ value=0x fffffffftry//需要确保文件数据格式等正确{ filestream bin _ file=新文件流(文件路径.文本,文件模式。打开);//打开容器文件BinaryReaderbin _ reader=新的二进制读取器(bin _ file);//实例化binreaderint 32[]src _ data=new uint 32[256];int data _ length=0;bin_reader .读取字节(1024);//BIN文件前面1K数据为配置数据不参与循环冗余检验计算,舍弃掉;for(long temp=0;temp (bin_file .长度-1024)/4;temp){ byte[]data _ temp=新字节[4];if(data_length 256){//每1k字节进行循环冗余检验计算,先对数据进行重新整合数据_温度=bin _阅读器读取字节(4);src _ data[data _ length]=(uint 32)(0x 00000000
data _ temp[0]
(data _ temp[1]8)
(data _ temp[2]16)
(data _ temp[3]24));} else {//1k字节数据整合之后计算循环冗余检验值crc_value=gen_crc32(false,crc_value,src_data,256);data _ length=0;数据_温度=bin _阅读器读取字节(4);src _ data[data _ length]=(uint 32)(0x 00000000
data _ temp[0]
(data _ temp[1]8)
(data _ temp[2]16)
(data _ temp[3]24));}数据_长度;}//对数据进行补偿,即斌。长度之后的数据补充为0XFF。整个文件大小为480 1024字节.length)480 1024){ int data _ fill _ length=0;if(data _ length 256){ data _ fill _ length=256-data _ length;for(int temp=0;临时数据填充长度;temp){ src _ data[data _ length]=0x ffffffff;数据长度;}crc_value=gen_crc32(false,crc_value,src_data,256);} else { crc_value=gen _ crc32(false,CRC _ value,src_data,256);}if((bin_file .长度数据_填充_长度 4)480 1024){ for(int temp=0;temp temp){ src _ data[temp]=0x ffffffff;} for(long temp=0;临时(4701024-bin_file .length-data _ fill _ length 4)/4/256 1;temp){ crc_value=gen _ crc32(false,CRC _ value,src_data,256);} }消息信息追加文本( filecrccalculatedvalue :0 x CRC _ value .ToString( X8 ) \ r \ n );}else{MessageInfo .AppendText( filecrccalculatedvalue :错误 \ r \ n );}bin_file .flush();bin_file .close();}catch{MessageInfo .追加文本( FileChecksumcalculatefailed失败!(FileOpenFailed!)\ r \ n’);}}}//产生循环冗余检验值,src_data为源数据,数据长度为数据长度,crc_value上一次的循环冗余检验值private uint 32 gen _ crc32(bool reset _ flag,UInt32crc_value,UInt32[]src_data,uint 32 data _ length){ const uint 32 ST _ crc32 _ const=0x 04c 11 db 7;UInt32xbit,bits,I;uint 32 CRC _ initial _ value if(reset _ flag){ CRC _ initial _ value=0x ffffffff;}否则{ CRC _ initial _ value=CRC _ value } for(I=0;我数据长度;I){ xbit=0x 80000000;对于(位=0;bits bits){ if((CRC _ initial _ value0x 80000000)==0x 80000000){ CRC _ initial _ value=1;crc_initial_value^=st_crc32_const;} else { CRC _ initial _ value=1;} if((src _ data[i]xbit)==xbit){crc_initial_value^=st_crc32_const;} xbit=1;} } returncrc _ initial _ value}上述代码已经验证没有问题,与STM32F103可以匹配。这样,应用程序编译之后的容器文件,导入到C#开发的程序,计算出循环冗余检验值,然后将循环冗余检验值填入到对应的应用的配置参数区域,这样,应用程序重新编译,然后应用的固件就完整了,并且可以实现应用的固件的循环冗余检验校验。
如何打开容器文件
更多c++读取bin文件()相关信息请关注本文章,本文仅仅做为展示!