IT8528E,该芯片内部集成多个外设模块,内核为8032,使用8051指令集。
因此这颗 MCU“内核”为51核。
可以简单地认为这是一个外设资源更丰富的8051单片机,框图如下:
IT8528相关储存器主要有三个部分:
iRAM : 8032内部 256Byte 的 RAM,这部分属于8032内核。
XRAM : 内核外部 4K 的 RAM,这部分在 IT8528 芯片内部。
XROM : 外接 Flash ROM,大小不确定,一般为64K--128K,通过SPI连接。
内部RAM
它属于8032内核部分,访问速度快,容量很小。逻辑地址和 SFR 寄存器复用。
低128字节的数据存储器既可以直接寻址也可以间接寻址。
高128字节RAM与特殊功能寄存器区共用相同的地址范围,都使用0x80—0xFF地址空间。
地址空间重叠,但是物理上是独立的,使用时通过不同的寻址方式加以区别。高128字节只能间接寻址,特殊功能寄存器区只可以直接寻址。
低128字节RAM也称通用RAM区。工作寄存器组从0x00—0x1F共32字节,分为4组每组8个寄存器,标记为R0—R7,他们属于不同的物理空间。使用寄存器组可以提高运算速度。程序状态字PSW寄存器中的RS1和RS0组合决定当前使用的寄存器组。
可位寻址从0x20—0x2F共16字节,它既可以向普通字节一样按字节寻址,也可以按位寻址。按位寻址共128bit,位寻址范围是0x00—0x7F,这里要注意,看起来它和RAM低128字节寻址范围一样,但是二者有着本质的区别。位地址指向一个位,而字节地址指向一个字节,在程序中使用不同的指令区分。
内部RAM采用8bit数据总线寻址范围256Byte,内部RAM操作指令:MOV。
外部RAM
它虽然位于IT8528内部,但相对于8032内核来说是外部数据存储器,也称 XRAM。
--地址空间
内核可以访问的RAM地址范围就是地址空间。这个范围由数据总线决定,8051核对于外部数据存储器采用16bit数据总线,即他可以访问的RAM范围是0—64K。
内核可以访问的范围是这个范围,但是实际中外接RAM的物理大小可能没有64Kbyte,或者可供用户程序使用的大小没有64KByte。
RAM 地址空间有 64K,实际芯片设计中,分别会映射不同的“物理存储”。
--映射模块寄存器
IT8528内部众多外设模块使用时,每个模块都需要Data、Status、Control寄存器,这些寄存器映射在特定的RAM地址上,在软件中定义后即可访问。
这部分范围是0x1000—0x3000,实际的物理位置在各模块内。映射的物理空间,用户是无法改作他用。
--映射外部存储器
0x0000—0x0FFF(4K)。这部分空间映射的“物理存储”是8032的外部数据存储器XRAM。
该段地址空间,在IT8528中称之为Scratch RAM,也可以映射外部ROM存储器。
即内核执行指令,可以从外部ROM取,也可以从外部RAM取。
IT8528内部的4K RAM存储器,用于存储临时变量、全局变量等数据。
如下图,左边是64K的逻辑地址空间,右边是映射的“物理存储”。
简单地说,逻辑地址空间是0—64K,物理上可能没有相应的“物理存储”与之映射,或者映射的“物理存储”已经被其他部件作为寄存器使用,用户程序无法自定义使用。
外部RAM采用16bit数据总线寻址范围64K,外部RAM的操作指令:MOVX。
外部ROM
外部ROM,也叫外部 SPI Flash,用于存储程序指令,它通过SPI总线和IT8528相连。对于8032来说,没有内部ROM,支持外接Flash 。
同样的,8032内核采用16bit地址总线,16bit 程序计数器,程序指令可寻址范围是
0—64KByte。也就是说程序地址空间也是0—64KByte。
实际上IT8528支持外接最大 16M 的 Flash,那么这里出现了一个问题,8032内核的地址总线是16bit,无法访问大于64K的地址。应该如何解决?
对于51内核的 MCU 来说,设计了一种分 BANK的存储组织方式,以支持大于64K的ROM 存储器。
对于64K的程序地址空间划分方法如下:(Flash和 8032 代码空间的映射)
程序地址空间0x0000—0x7FFF,属于Common Bank,映射了“物理存储”,即Flash 的0x0000—0x7FFF区间。
程序地址空间0x8000—0xFFFF,属于Bank(0—3),四个Bank占用相同的程序地址空间,但是在 Flash中的物理区间不同。
CommonBank+Bank_x 的地址范围恰好是64K,因此8032在访问外部地址空间的时候,同一时间只能访问某一个Bank区间。如果编译的函数处于其他Bank,当发生跨Bank的函数调用时,就会自动切换Bank。实际上切Bank是Keil编译器生成的一段代码完成的。
IT8528切Bank相关的寄存器可以参考其 Datasheet。
通过链接文件,可以指定某个函数代码或者某段数据放在某个指定的Bank内。
外部ROM采用16bit地址总线寻址范围64K,外部ROM中的数据操作指令:MOVC。
IT8528固件更新原理
由上文可知,IT8528内核执行的每一条指令都是从外部SPI Flash实时读取的。
当需要更新 SPI Flash时就会出现冲突。
此时可以将 XRAM 存储器映射至代码地址空间,如此 8032 内核在取指令时就只会访问 XRAM,而不是访问SPI Flash 了。
IT8528内部的 XRAM存储器(Scratch RAM)一共4K,分别编号0--4,每一块的大小如下图所示。
4K的XRAM总是映射到数据空间。当需要时,配置代码空间映射寄存器使能,XRAM会映射到代码空间。
也就是同一时间,Scratch SRAM可能既映射到数据空间又映射到代码空间,映射至数据空间称之为Scratch RAM,映射至代码空间称之为Scratch ROM。
如下图,每一块映射至代码空间的位置由 SCARxH/M/L三个寄存器配置。
如下就是代码空间映射XRAM和 SPI Flash 的示意图。
为了兼容设计 IT8528 增加了一个寄存器FBCFG,以便完成一个快速映射。
即快速把 Scratch SRAM-0 映射至代码空间的 F800--FFFF位置。
有了上述映射关系,就解决了更新SPI Flash和8032取指令冲突的问题。
如下图,IT8528设计了一个SMFI模块,以便8032访问外接SPI Flash。
通过 Host端访问IT8528外挂的SPI Flash原理如下图。
更新固件流程
第一步,把更新SPI Flash的控制函数(限制在256个字节)copy至SRAM指定位置。
为何要把更新函数copy至SRAM 0x600位置?
由FBCFG寄存器可知,置位BIT7即可把Scratch SRAM-0映射至 0xF800--0xFFFF。
即把 XRAM 的 0x000--0x800的部分映射至代码空间的 0xF800--0xFFFF。
因此 XRAM 的 0x600--0x6FF 映射至代码空间的0xFE00--0xFEFF。
通过链接脚本把更新函数强制放置在0xFE00,当调用该函数时取指令位置就是
0xFE00。
由于代码空间0xFE00--0xFEFF映射了 XRAM 的0x600--0x6FF。
因此只需把更新函数copy至 XRAM 的0x600--0x6FF 即可。
注意:更新函数的代码不能超过256Byte。
第二步,配置 FBCFG 寄存器,把Scratch SRAM-0 映射至代码空间。
第三步,跳转至更新函数中。
第四步,在更新函数中循环处理 6266 或者 686C 接口的数据和指令,控制SMFI模块访问 SPI Flash。
上述步骤均由 UEFI 或者 OS 下的 UpdateTool 控制完成。
对于IT8987来说,有内部 Flash。其实对于8032内核来说仍然属于外部Flash。所谓的内部Flash,只是芯片内部“合封”而已。
另外对于IT557x系列的芯片来说,内部单独设计了一段存储空间(大约1K),用于内核8032临时取指令使用,可以不采用上述 copy 更新函数至 XRAM 的方法。
而是采用DMA方式将更新函数copy至“隐藏存储空间”,然后转去执行。