307 IAP方案疑问

我的分区为:

IAP:40k(实际7k,不带libnet库)

APP1:76k(实际56k,带libnet库)

APP2:76k(实际56k,带libnet库)


Link.ld配置为:

MEMORY

{

FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 192K

RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K

}


芯片频率:SYSCLK_FREQ_144MHz_HSE


测试代码,IAP逻辑相当简单,就是读取APP2ADDR+76k-256处的一个标志,不判断,然后直接利用下面代码跳转

__asm("li? a6, 0xA000");

__asm("jr? a6");



我将IAP代码和APP代码合并成一个bin并下载到芯片,但是未执行APP1代码。

个人感觉是IAP不带libnet库导致的,如果是这个原因,是否可以将IAP放到APP后面,如果放后面,那跳转时需要的地址是0x13000,能跳过去吗?

合并代码如下:

IAP_FILE = "../IAP/obj/IAP.bin"

APP_FILE = "../APP/obj/APP.bin"

OUT_FILE = "APP.bin"


with open(IAP_FILE, "rb") as fd:

? ? iap_data = fd.read()


with open(APP_FILE, "rb") as fd:

? ? app_data = fd.read()


with open(OUT_FILE, "wb") as fd:

? ? fd.write(iap_data)

? ? for i in range(int(40*1024) - len(iap_data)):

? ? ? ? fd.write(bytearray([0]))

? ? fd.write(app_data)



您好,若你是不进中断跳转,直接在函数中调用两个指令进行跳转的话,建议你将IAP工程启动文件中mstatus寄存器的值按照下图修改一下再测试一下,应该没问题,应该和网络库无关,你可以试一下,后续若有问题,可通过邮箱(lzs@wch.cn)和我沟通。

image.png



这个能直接跳吗?看例子是通过中断实现的


您好,可以不通过中断直接跳转,注意不通过中断跳转时要配置在机器模式下 ,要修改工程启动文件中mstatus寄存器的值,可以修改成0x7888,如下图

image.png



只有登录才能回复,可以选择微信账号登录