个人有个项目要使用OTA,就是使用wifi模块,接收云端的数据,就是升级包,下载到我的板子上,进行远程,非接触式升能。用了春节8天时间,终于搞定,在此记录下,方便其人也,也可以参考下。
日期:2026年2月23日星期一 总体框架说明 单片机型号:STC8H4K64TL FLASH容量 64K 支持ISP功能,内存划分如下图
应用程序与ISP程序是两个完全独立的程序,但是需要相互配合,使用ISP调用eeprom内容要求一致的地址。 一、首先说下ISP程序的编写与设置 1.1程序编写,主要逻辑是:读取指定eeprom地址的标识位,是不是要升级,如果不是,则跳到指定应用程序段,我用的是0x1000(4K空间)。如果要升级的标识位,执行一段函数,实现功能是从指定位置(我用的是0x7000开始的)到0x0000地址。目的就是将保存的数据,覆盖到现在的应用程序段中。 1.2 程序写好,在Keil编辑器中,不需要做额外设置,直接编译就行,拿到ISP.hex后面使用。
二、应用程序编写与设置 2.1 应用端的程序按正常内容编写,我使用的是涂鸦的WIFI通迅模块,使用官网例程写的框架,加上自己设备控制逻辑。 2.2 在最后编译时,需要在KEIL中进行相关设置,设置如下: 1起始地址,2文件大小,3 中断地址,按图所示写入特定值
2.3 编译成APP.hex后面使用
三、hex文件处理 3.1 1清空区域,2 设置 4K eeprom ,3打开程序文件,4找到刚才编译出来的APP.hex文件。
3.2hex文件编辑 将刚才载入的APP.hex,0x0000开始的地方最前面3个字节内容,拷贝到0x1000处,那里本来应该是3个0xff,将那3个0xff换成这3个字节内容。如下图,6,8指示的地方。
3.3修改好后,将从0x0000至0x1000之间的全部oxff数据删除掉。 3.4删除好后,点击右下角的 “保存数据”,在跳出的窗口中,填入新的文件名:PY_APP.BIN后面使用。
四、程序合并烧录 4.1打开STC的ISP下载软件,进行如下设置 1 eeprom选60K,这样程序才能实现ISP,以前设错了,总是不能正常拷贝数据。 2 在程序文件框,EEPROM文件框中,分别去点清空区域,目的是不要让原来数据破坏后面的程序文件。 3 在程序文件界面下,点“打开程序文件”在跳出的窗口中,选中ISP.hex 文件,程序内容会出现在编辑框中。 4 在EEPROM文件界面下,点“打开EEPROM文件””在跳出的窗口中,选中PY_APP.BIN 文件,程序内容会出现在编辑框中 5 晶振依实际程序里的填就行 6 最后点 “下载/编程”
软件调试过程记录: 问题一:我的程序用一个35号中断(触摸中断),汇编转13号的中断。但是加入后,应用程序不能正常工作。所以给去掉了。还没找到兼容的办法
问题二:在下位机有一个保存数据的功能,#define EEPROM_SECTOR_ADDR 0xe000 //如果是偏移了0x1000,实际就是0xf000 ==60K的地方保存数据 这个值要依实际情况改,如果写错了,会直接改到应用程序段,造成程序直接死机。就是自己的应用程序在保存数据时,一定不能有操作应用程序段(0x0000至0x7000)的内容,不然一定是死机。
|