完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
问题比较复杂,请听我细细道来。
我把更新文件通过网口,下载到了STM32f427的download分区后 ,重启发现程序并未更新,不知道是怎么回事。 首先,BootLoader的制作,flash分区应该是没有问题的,因为我用Xshell中的Ymodem传输固件,发现能够升级成功。 我的步骤如下: 1、擦除download分区 2、将rtthread.rbl文件,通过网口传输到stm32f427中,每包1kb,边传输边更新download分区flash。 3、软件reboot。 网口接收部分代码如下: 接收文件部分: if(cmd == 0x14) { uint8_t buf[paramlen-4]; memcpy(&buf, &data_buf[10], paramlen-4); uint16_t packnumber = 0; packnumber = data_buf[6] + (data_buf[7] << 8); uint16_t packsum = 0; packsum = data_buf[8] + (data_buf[9] << 8); fal_partition_t fal_dev = RT_NULL; int fal_addr = (packnumber-1) * 1024; fal_dev = fal_partition_find("download"); if(fal_dev == RT_NULL) { rt_kprintf("can not find download partition "); return ; } if(fal_partition_write(fal_dev, fal_addr, buf, paramlen-4) < 0) { rt_kprintf("fal write download partition addr:%x size:%d fail "); return ; } rt_kprintf("receive length: %d packnumber: %d packsum: %d fal_addr: %d buf0: %x ", paramlen-4,packnumber,packsum,fal_addr,buf[0]); //传输完成 if(packnumber == packsum) { rt_thread_mdelay(1000); rt_hw_cpu_reset(); } } 擦除flash部分: fal_partition_t fal_dev = RT_NULL; fal_dev = fal_partition_find("download"); if(fal_dev == RT_NULL) { rt_kprintf("can not find download partition "); return 0; } if(fal_partition_erase_all(fal_dev) < 0) { rt_kprintf("erase download partition all fail "); return 0; } else { rt_kprintf("erase download partition all success "); } 上位机是用Qt做的部分代码如下: void MainWindow::slot_update() { qDebug() << "update"; if(!filepath.isNull()) { //初始 QFile* file = new QFile(filepath, this); qDebug() << "filename = " << file->fileName(); qDebug() << "size = " << file->size(); //打开 if (!file->open(QIODevice::ReadOnly | QIODevice::Text)) return; //读取 QByteArray data = file->readAll(); qDebug() << "qbytesize = " << data.size(); //拆包发送 每包1024 const int packsize = 1024; int num = data.size()/packsize + 1; for(int i=0 ; i //要发送的数据 QByteArray part = data.left(packsize); data.remove(0,packsize); QByteArray SendData; uint8_t head1 = 0xB5; uint8_t head2 = 0x5B; SendData.append(head1); SendData.append(head2); //cmd命令 在前是低位,在后是高位。 uint8_t temp0 = 0x14; uint8_t temp1 = 0x00; SendData.append(temp0); SendData.append(temp1); //参数长度 uint16_t paramlen = part.size() + 4; temp0 = BYTE0(paramlen); temp1 = BYTE1(paramlen); SendData.append(temp0); SendData.append(temp1); //当前包编号 uint16_t packnumber = i+1; temp0 = BYTE0(packnumber); temp1 = BYTE1(packnumber); SendData.append(temp0); SendData.append(temp1); //包总数编号 uint16_t packsum = num; temp0 = BYTE0(packsum); temp1 = BYTE1(packsum); SendData.append(temp0); SendData.append(temp1); //压入数据 SendData += part; //校验位 uint8_t temp_a[SendData.size()]; for(int j=0; j temp_a[j] = SendData.at(j); } uint16_t crc = crc16(temp_a, SendData.size(), crc_16_MODBUS); SendData.append(BYTE0(crc)); SendData.append(BYTE1(crc)); qDebug() << "part" << i << ":" << part.size(); qDebug("%x", (uint16_t)part[0]); socket->write(SendData); ui->bar_update->setValue( (i+1)*100/num ); //下面这个函数很重要 socket->waitForBytesWritten(); QThread::msleep(200); } } else { QMessageBox::critical(this,"critical","没有选择升级文件"); } } 打印信息: 经查,每个包的第一个uint8都没问题,传输应该未丢包 第一次做ota升级,各位老工程师们帮帮孩子。 是传输完成,写入flash后还要进行什么操作么? 我写到flash的download分区后,就直接rt_hw_cpu_reset();了 |
|
相关推荐
2个回答
|
|
如果我来调:等网络传输完后,我用JTAG把download区读回来对比校验,看是否完整写入应该就可以发现问题。
boot只是在启动时检查download是否完整,且有更新。不管里面数据怎么来的。 |
|
|
|
问题已经解决了,解决方法:
1、用自己的ota升级过后,先用jlink连接板子,打开jflash并选择对应芯片型号,file->new Project; 2、连接板子并读出flash,target->connect, target->manual programing->read back->entire chip;此时可读到板子对应寄存器的值 3、flash,target->connect, target->manual programing->read back->range,读取对应地址的值,我的是download分区0x08080000 - 0x080e0000,并保存为bin文件file->save date file as选择文件类型为bin。 4、比对文件,先用beyond compare比对,发现是有文件不同,但是无法直观查看,于是我用winhex打开对比,发现是有些byte缺失。 5、后来发现,传输与写入并无问题,最后检查出,原来是qt读取文件的问题,在读取文件时使能了QIODevice::Text,这个参数会导致读取二进制文件时,造成一些转义字符无法读取。修改后就成功了。 // if (!file->open(QIODevice::ReadOnly | QIODevice::Text)) if (!file->open(QIODevice::ReadOnly)) |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
830 浏览 0 评论
6169 浏览 0 评论
如何使用python调起UDE STK5.2进行下载自动化下载呢?
2808 浏览 0 评论
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
3099 浏览 0 评论
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
33131 浏览 11 评论
73602 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-3 06:10 , Processed in 0.674638 second(s), Total 72, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号