一. 初步版本的建立。(2023-02-01,by dazhi)
1. OTA程序来自网络,根据自己使用的gd32库进行了一些函数的替换。
2.本程序只在gd32f103vbt6上进行测试,其他单片机注意修改
3.本程序上电启动后,初始化串口(115200),单片机上电时在串口终端按ctrl+c可以进入下载模式,时间大概在200ms以内
4.下载模式使用Ymoden,建议使用secCRT等类似软件连接串口(115200,8N1).
5.编译该程序,需要安装GD32F103的固件库



二。2023-02-02
1. 调整OTA到flash的末尾,在单片机的应用层跳转过去。
2.链接地址改为0x801d0000,最后保留12K字节给OTA程序。总大小0x2000000,128K字节
3.跳转之前需要关闭总中断,导致OTA的systick中断不可触发了。

三、2023-02-03
1. 可以使用OTA串口的方式升级了单片机应用程序,添加了脚本,自动生成bin文件,串口下载使用ymodem,传输应用bin文件
2.OTA程序在flash的头部位置,经验证,应用程序可以使用keil下载和在线调试功能。
3.如果批量升级的话,建议合并ota和本程序的bin文件。最终下载合并文件。(我是用jflash工具完成)
4.OTA程序大小10K左右,应用程序设置在偏移地址12K的位置。一定要注意OTA程序大bin文件大小,然后调整适当偏移值。


四、2023-04-12
1.现在增加了从rk3399升级的功能,目前下载正常,但是不太稳定,有时无法进入app运行。
2.rk3399的程序,请参考库https://github.com/zhaozhi0810/mcu_update_uart_ymodem
3.虽然使用串口1(PA2,3)下载,但是打印信息还是从调试串口(串口0,PA9,10)输出,可以进行终止输入。
4.OTA程序保留了24K字节,实际使用前23K,第24K(0x5c00)做了一些记录,方便重启时的状态识别。
5.app的起始地址修改到了0x8006000,偏移24K字节。单片机app收到升级命令后,设置相关标志,并让单片机重启进入iap程序。
6.现在主要还要考虑重复升级(如何识别版本)的问题,以及升级失败的处理。
7.本程序的flash写(擦除)操作目前被注释掉了,暂时只是调试了下载功能。
8.iap考虑保存md5码。用来识别版本,md5实际需要32个字节保存。



五、2023-04-12-2
1.分成三个区,0~0x6000-1(OTA+flag,共24K),0x6000~0x13000-1(APP区,共52K),0x13000~0x20000-1(back区,共52K)
2.rk3399串口下载时,先下载到back区,下载成功后,更新到app区。 目前该功能已经完成。
3.对下载的数据进行了判断,对文件的前8个字节判断,0x20000000和0x8006000,如果不是对应,则认为不是对应的bin文件,传输中止
4.写入flash的app分区的时候,做3同样的判断,不符合则不更新。
5.两个标志,need_update:0xffff是需要升级(把down分区更新到app分区,同时表示升级不成功),0x00ff表示升级成功
	   need_download://需要升级吗?0xffff是不需要下载(同时表示下载成功),0x00ff表示需要下载,
6.下载成功之后会对标志分区进行一次擦除操作,此时need_download为0xffff表示不需要下载,need_update为0xffff表示需要进行升级。
	同时把文件大小写入到flash中(4个字节),还有md5码也写入到flash中(字符串,共32字节)。
7.完成把down分区更新到app分区,need_update 设置为0xff,表示升级成功,下次启动不需要再次升级。
8.app程序收到升级信号时,修改need_download为0xff,单片机重启后,检查到该标志,就进行串口升级操作。之后的步骤参考6
9.目前这个功能基本正常。





六、2023-04-27
1.目前已经完成调试串口(uart0)与通讯串口(uart1)的升级功能.
2.调试串口的升级需要选择菜单1,等待下载之后,使用secureCRT,的ymodem的方式发送bin文件进行升级。
3.通讯串口不需要特殊操作,在rk3399的系统中,使用命令./xyzmodem_send -f hj22134-gd32f103-freertos.bin即可进行升级。
4.通讯串口升级会对比md5码(一个是升级文件的md5码,一个是单片机发送回来的md5码),md5相同,则不再进行升级。
5.因为通讯串口升级使用了md5码,所以文件名最长不能操作64字节(包含结尾符\0),文件长度最长不能超过16个字节(包含结尾符\0),md5本身长度32字节。
6.调试串口因为不能发送md5码,所以文件名可以长一点,但最长受到128字节的限制。
7.在这次调试过程中,发现文件长度的末尾一定要跟一个空格符,软件通过空格符进行分离。