文章目录
前言
在之前的文章中,介绍过STM32对应的CANoe上位机软件的制作,当时开发的只支持单个flash块的刷写,本文接着介绍拓展为多个flash块刷写的CAPL脚本修改。同时增加一个BT勾选项,为实现上电进boot等待使用,防止APP异常时不能正常刷程序
Pannel新增check勾选框
勾选框对应的模块如下:
增加勾选框对应的系统变量
配置Check Box,关联到对应系统变量
解析hex文件脚本更改
之前的脚本解析hex文件多个flash块时,解析的不对。需要修改HexBlockTotalNumber++的位置
switch(Type){
case 0x00: //数据
if (Addr > (ReLen + ReAddr)){ //判断为新数据块
if(RowDataByte == 0) //是否为首行数据字节数
{
hexfile[HexBlockTotalNumber].BlockStartAddr = Addr; //记录新数据块的起始地址
}
else //不是首行
{
hexfile[HexBlockTotalNumber].BlockDataLength = RowDataByte; //数据长度
RowDataByte = 0; //重新开始计数
HexBlockTotalNumber++;
hexfile[HexBlockTotalNumber].BlockStartAddr = Addr; //记录新数据块的起始地址
}
}
刷写脚本更改
hex文件块改大
之前定义的数组大小只有5,不够,目前扩展到50,如果hex块更多,也需要更改下数组大小
struct Block hexfile_app[50];
开始刷写时判断是否勾选BT
如果勾选了BT,则跳过前面的步骤(也就是在APP中响应的步骤),直接到ProgrammingSession,目前发10 02这个还需要通过IG发送
if(@CheckBox::BT == 1)
{
prog_step = ProgrammingSession;
Resp_True_Flag = 1;
}
else
{
prog_step = EnterExtendedSession;
}
也就是说,在没有APP的情况下,需要上电之前先用IG循环发送10 02,然后再上电,勾选BT后,取消IG发送1002,点击刷写就可以了.
计算BlockSequence数量修改
之前返回值为int,导致BlockSequence超过32767之后,就会导致CANOE自动停下来,报溢出错误,查看原因是flash块太大,此处返回值修改为dword
dword getBlockSequenceAmount(struct Block hexfile)
{
dword blockSequenceAmount = 0;
if (hexfile.BlockDataLength % (maxNumberOfBlockLength - 2) == 0)
{
blockSequenceAmount = hexfile.BlockDataLength / (maxNumberOfBlockLength - 2);
}
else
{
blockSequenceAmount = hexfile.BlockDataLength / (maxNumberOfBlockLength - 2) + 1;
}
return blockSequenceAmount;
}
同理,其他的涉及到长度的变量,都修改为dword,以防万一溢出。
writeBlockData函数修改
第一个block进入writeBlockData函数是判断过34服务的,但后面的block没有判断,所以后面的block需要等待34服务正响应后才能继续
switch(prog_state)
{
case prog_req:
if(blockNumberCount >= 1)//后面进34 服务需要等待31 checksum应答
{
if(Resp_True_Flag && Resp_ID == 0x71)
{
requestDownLoad(hexfile[blockNumberCount]);
Resp_True_Flag = 0;
prog_state = prog_trans;
sum = 0;
j=0;
for(i = 0;i<HexBlockTotalNumber;i++)
{
sum = sum + hexfile[i].BlockDataLength;
}
write("sum data length: %i ", sum);
}
}
else
{
requestDownLoad(hexfile[blockNumberCount]); //第一次进入34 不需要判断响应
prog_state = prog_trans;
write("HexBlockTotalNumber %i ", HexBlockTotalNumber);
sum = 0;
for(i = 0;i<HexBlockTotalNumber;i++)
{
sum = sum + hexfile[i].BlockDataLength;
}
write("sum data length: %i ", sum);
}
至此,拓展为多个flash块刷写的上位机就修改完了。