本帖最后由 buzhichi 于 2019-5-12 20:26 编辑
我修改的程序hex文件分享给大家,现在优化到了788字节的程序量,等更改到少于512字节或者更少,我就把源码发出来。
更改了官方的几个不好的地方,一个是串口收到任意数据会与pc失去连接,
一个是烧写完app没有自动会跳转到APP、
一个是根据实际的app程序量去擦除flash,例如app是10K那么就擦除10K,是2K就擦除2K,单位是128字节的。不要求必须是1K的倍数。官方的是固定死的。前面也有说明
其他的与官方2016版本的功能一样。没有减少任何功能。
这个单片机的boot结构,做的很简单,具体跟STM8,STM32,等相比,区别在于
不用考虑中断向量搬移,应用程序地址偏移。 这里用过stm或者avr的都知道,编写boot引导程序,要考虑app在flash中的实际偏移地址,并且要做中断向量搬移,因为他们的结构是一片flash,程序分为boot和app的话,那么一般是boot在flash的前面,app在后,而内核一般都是固定从一个位置开始执行,所以要考虑中断向量搬移和app的偏移地址。这个芯片是可以认为 aprom和ldrom是完全独立的两片flash,地址都是从0开始的,无论从哪个开始执行,都完全不用考虑中断向量搬移和aap的地址偏移,中断随便用,在boot程序中也随便用中断。
首先要说明的是程序从哪片flash执行这个是由config配置字决定的,可以用nulike设置。
如何从ldrom跳转到aprom?
这个就是说默认程序从ldrom执行,然后看是否需要更新aprom,如果需要就执行ldrom内的程序,不需要就跳转到aprom执行用户程序。
从ldrom跳转到aprom的程序如下
TA = 0xAA;
TA = 0x55;
CHPCON &= 0xFD; //设置从aprom开始执行
TA = 0xAA;
TA = 0x55;
CHPCON |= 0x80; //软件重启。
如何从arom跳转到ldrom?
这个就是说默认程序从aprom执行,然后收到更新程序命令后跳转到ldrom,去更新aprom。
从aprom跳转到ldrom的程序如下
TA = 0xAA;
TA = 0x55;
CHPCON |= 02; //设置从ldrom开始执行
TA = 0xAA;
TA = 0x55;
CHPCON |= 0x80; //软件重启。
这里需要注意的一点是,只有软件重启才能自由选择是从ldrom还是aprom执行程序,如果是其他的任何重启,例如硬件重启,看门狗,外部复位,欠压复位,错误复位等都是由config来决定是从哪里启动。意思就是你设计的程序是从ldrom跳转到aprom,并且你的config也做了相应的配置,那么每次上电都会执行ldrom。你设计的程序是从aprom执行,收到更新命令或者满足更新条件后才执行ldrom,那么进入到ldrom执行,无论执行成什么样,断电重启还是从aprom开始执行。当然这里说的是你不在程序中去修改config的设置从哪里启动的情况下。
|
|