大家好!
我现在要将PIC单片机程序做在线升级,也就是IAP,而且需求是必须不断电升级,也就是单片机重启复位时外围的输出信号必须能保持住。前两天看到有人说用锁存器,不知道这个具体怎么用法,大家有没有比较好的不断电升级方案,在此先谢谢了!
基于Monster 组和GPT的调写:
实现不断电升级需要满足两个条件:
在升级过程中保持数据存储的稳定性,以防止数据丢失。
在单片机复位后,外围的输出信号能够保持住。
其中,保持数据存储的稳定性可以通过使用锁存器来实现。锁存器可以将数据存储在寄存器中,并在需要时将其输出到下一级电路。在IAP过程中,当需要修改Flash存储器中的数据时,可以将数据读取到锁存器中,进行修改,然后再将修改后的数据写回Flash存储器。
保持输出信号的稳定性可以通过在单片机复位时将输出信号的状态保存在EEPROM中,并在复位后将其恢复。具体实现方法如下:
在代码中加入EEPROM读写函数,用于将输出信号的状态保存在EEPROM中,并在需要时将其恢复。
在单片机复位时,先从EEPROM中读取输出信号的状态,并将其输出到对应的外围设备。
在进行IAP过程时,先将输出信号的状态读取到锁存器中,并在IAP完成后将其写回EEPROM中。
在单片机正常运行时,使用锁存器来保存输出信号的状态,并在需要时将其输出到对应的外围设备。
需要注意的是,EEPROM的写入次数是有限的,因此需要控制好EEPROM的使用次数,以防止过度磨损。
除了使用锁存器和EEPROM来实现不断电升级,还可以考虑使用双Flash或者双EEPROM来实现,即在进行IAP时,先将程序下载到备用存储器中,再将程序复制到主存储器中。这种方法可以避免在IAP过程中丢失数据,同时也可以保持输出信号的状态。不过需要注意的是,双存储器的使用需要占用额外的空间,因此需要在设计时进行考虑。
在进行单片机的IAP(In-Application Programming)升级时,需要考虑到电源掉电等异常情况下程序的保护问题。为了保证程序升级过程中输出信号不中断,可以考虑使用锁存器。
具体实现方法如下:
在单片机的程序中加入检测外部存储器中是否有新程序的代码。
如果检测到新程序,将新程序的代码存放在内部RAM中的指定地址处。
在程序运行时,将输出信号通过锁存器进行锁存。这样,即使单片机复位,输出信号的状态也能够得到保持,直到新程序将锁存器的状态更新为止。
在新程序中加入检测锁存器状态的代码,如果锁存器状态为有效,则将锁存器的状态更新,并执行新程序的功能。
需要注意的是,在进行IAP升级时,需要确保程序的完整性和安全性。可以通过计算程序的校验和或数字签名来保证程序的完整性,同时通过使用加密算法来保证程序的安全性。
总之,IAP升级方案需要考虑多方面的因素,包括不断电升级、程序完整性和安全性等问题,具体实现需要结合具体的应用场景和需求进行。
可以用软件跳转的方式实现重启,这样就不会触发单片机的复位逻辑,IO状态就不会变了。C语言的方法就是定义个函数指针,让函数指针指向启动地址,然后调用
谢谢大家提供的思路,我先试下。