烧写flash出错:Bytes mismatch 0x00不等于0xFF

本文介绍了一种常见的烧写Flash过程中遇到的BytesMismatch问题,即0x00!=0xFF的情况,并给出了一个简单的解决方案:重启Vivado通常可以解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 问题

烧写flash 出现bytes mismatch 0x00 != 0xFF 之类的问题。

2 解决

暂时重启vivado可以解决。

串口OTA升级 数据格式均采用小端模式 1、选择扩展名为.hjc的升级文件 2、取文件前16字节,用来判断是否为升级文件,判断方法如下 headerList[16] 为取的文件前16字节,需要同时满足以下条件 headerList[6] == headerList[0] ^ 0x48 headerList[7] == headerList[1] ^ 0x4A headerList[8] == headerList[2] ^ 0x42 headerList[9] == headerList[3] ^ 0x4C headerList[10] == headerList[4] ^ 0x45 headerList[11] == headerList[0]^ headerList[3] 3、获取设备类型 下行 数据 {READ_OTA_TYPE} 上行 数据 {CONFIRMED-C-HJOTA} 4、切换OTA 下行 数据 {HJC + headerList数组中的最后4个字节 + } 上行 数据 {OK} 5、获取新固件存储基地址 下行 数据 010300 上行 Result Opcode Length(内容2字节) Payload 0x00 0x01 0x04 0x00 当前运行的代码在flash中存储的基地址(4字节) 为了方便下文说明,取名storage_baseaddr 6、擦除扇区,从storage_baseaddr地址开始,按照每次擦除0x1000递进擦除,直到到达够升级信息需要的长度,升级信息长度为文件长度-16,前16字节为校验字节 下行 Opcode Length(内容2字节) Base_addr 0x03 0x06 0x00 Flash中的基地址偏移(4字节,小端) 上行 Result Opcode Length(内容2字节) Payload 0x00 0x03 0x04 0x00 Flash中的基地址偏移(4字节) 7、入数据,因为hid固定521字节,所以,入的有效数据为groupSize=521-9个字节,发完前一包后,下一包,Base_addr也要加groupSize个字节 下行 Opcode Length(内容2字节) Base_addr Length(2字节) Payload 0x05 6+payload_len Flash中的基地址偏移(4字节,小端) Payload长度 要入的内容 上行 Result Opcode Length(内容2字节) Base_addr Length 0x00 0x05 0x06 0x00 入的基地址偏移(4字节) 入的长度(2字节) 8、校验并重启 下行 Opcode Length(内容) 固件大小 CRC校验 0x09 0x0a 0x00 入bin文件的大小(4字节) 入bin文件的CRC32校验(4字节) 上行 Result Opcode Length(内容 2字节) Slave端返回校验值 0x00(检验成功)/ 0x01(校验失败) 0x09 0x00 0x00 CRC32 (4个字节) 用c语言封装函数
03-08
char MQTT_Publish(int qos, int retain, char *post_topic, unsigned int id, char *message) { const int BUFF_SIZE = 512; char data[BUFF_SIZE] = {0}; int len = 0; int remaining_length; int encoded_remaining_len_bytes = 0; int temp_remaining_length; char remaining_encoded[4]; int encoded_len; int topic_length = post_topic ? strlen(post_topic) : 0; int message_length = message ? strlen(message) : 0; if (topic_length == 0 || topic_length > 65535) // 主题长度小于65535 return 1; if (!message) // 消息内容可为空 return 2; if (qos > 0 && id == 0) // QoS>0时必须提供有效id return 3; if (qos < 0 || qos > 2) return 4; /* 剩余长度计算 */ remaining_length = (2 + topic_length) + ((qos > 0) ? 2 : 0) + message_length; /* 缓冲区容量检查 */ temp_remaining_length = remaining_length; do { encoded_remaining_len_bytes++; temp_remaining_length /= 128; } while (temp_remaining_length > 0); /* 确保数据长度超过缓存大小 */ if ((1 + encoded_remaining_len_bytes + remaining_length) > BUFF_SIZE) { return 5; } /* 固定报头构造 */ data[len++] = 0x30 | (qos << 1) | retain; /* 剩余长度编码 */ encoded_len = encode_remaining_length(remaining_length, remaining_encoded); memcpy(&data[len], remaining_encoded, encoded_len); len += encoded_len; /* 可变报头与有效载荷 */ // 主题名 data[len++] = (topic_length >> 8) & 0xFF; data[len++] = topic_length & 0xFF; memcpy(&data[len], post_topic, topic_length); len += topic_length; /* 报文标识符(QoS > 0) */ if (qos > 0) { data[len++] = (id >> 8) & 0xFF; data[len++] = id & 0xFF; } /* 有效载荷 */ memcpy(&data[len], message, message_length); len += message_length; /* 数据发送 */ MQTT_SendData(data, 4); // 直接发送数据 mqtt_debug(data, len, "\r\n* 3、PUBLISH – 发布消息 *\r\n"); if(qos > 0) { data[0] |= 0x08; // 置位dup重发标志 Write_MQTT_TxDataBuff(data, len); // 将数据保存
03-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChipWeaver

觉得有用的话点个赞吧 :)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值