Bootloader流程: APP程序内通过通讯协议接收上位机程序更新命令:0x01,;收到0x01后单片机给上位机返回0x01,证明上位机和下位机连接成功,准备复位;复位后再bootloader程序内检查bootloader更新标志,如果成立则进行程序更新。不成立则跳转到APP内运行。 1. APP内通讯协议:0x01程序更新命令,收到后给上位机发送连接成功,写flashbootloader更新标志,并软件复位。代码如下: case 0x01: // 程序更新命令 { Flash_Write(addr_bootloader,flag_bootloader); if(flag_bootloader==Flash_flagboot_read(addr_bootloader)) { delay_ms(2000); sendbootloader(0x02); // 串口连接成功,准备复位 //USART_ITConfig(USART1, USART_IT_RXNE,DISABLE); SoftReset(); // 软件复位 } }break; 2. 软件复位后更具读取的flag_bootloader标志如果成立,则进行程序更新,不成立跳转到APP程序。 if(flag_bootloader==Flash_flagboot_read(addr_bootloader)) // addr_bootloader地址0x0800FFF6 { if( flag_reset==1) { delay_ms(2000); sendbootloader(0x04,0x02); //单片机已复位,准备进行程序擦出 delay_ms(2000); if(!Flashclearall(FLASH_APP1_ADDR)) // 从0x08010000 出开始擦出 delay_ms(2000); sendbootloader(0x04,0x03); // 程序已擦出,准备更新程序 flag_reset=0; } 但是当上位机发送过来更新的数据后,数据接收存在问题,如下所示: 上位机发送: CDFA040528F00E0020CD010108994801087706010895480108090301089B4F0108000000009524DC 串口接收:(从第四个数据开始一直是0x04…) CDFA04040404040404040404040404040040404040400404040404... 但是我在软件复位之前发送上述数据,串口接收的数据是正确的。 我怀疑是不是APP程序和bootloader的程序共用一个串口造成的???,软解复位后再串口接收冲突???
|