自编程就是用户进行的flash存储器写操作。
Block号,是进行擦写和非空检查操作的单元。
入口ram,是flash存储器自编程样例库所使用的RAM区域。用户程序需要保留着块区域,
当调用库时,需要指定这片区域的起始地址。
内部验证,再写入到flash存储器后,信号电平会内部检查,确认读到正确的数据。内部验
证错误时,对应的设备被认为有错。
第一章
自编程样例库是78K0/KX2提供的固件以及用来给flash存储器重写数据的软件。
用户程序通过调用自编程样例库,可以改写flash存储器的内容,从而,加快软件开发。
注意:
1自编程样例库重写flash存储器,需要使用KX2的CPU,寄存器和RAM,在运行自编程
样例库时用户程序无法执行。
2自编程样例库使用CPU(寄存器bank3)和工作区域(入口RAM区100字节)。于是,
用户调用自编程样例库之前必须自行保存此区域内的用户程序数据。
C和汇编中都可以调用自编程样例库。
如果C文件编译时使用-SM参数(把目标作为静态模式),用静态模式连接库。如果不用-SM,
库调用采用正常模式。
如果源文件是汇编格式,只能用静态模式连接库。
自编程的流程
1FLMD0引脚拉高。
2Flashstart
3设置操作环境
4Flashenv(入口RAM初始化)
5检查FLMD电平
6正常结束--〉Flashblock非空检查—〉字写入(1~64个字长)—〉block校验—〉Flash结
束—〉FLMD0拉低。
Bank编号和block编号
Kx2的flash存储器高达60KB,Block以1K为单位。
Bootcluster0000h~0FFFh,1000h~1ffffh。防止写入时掉电或者reset。第四章详细讲述引导
交换功能。
60KB的flash和96KB以上的flash不同。
60KB中0000h~F000h分为60个block区,F000h以上到F800h是内部扩展RAM区域。
0000h~003Fh存放64字节的向量表,003Fh~007Fh存放64字节的callt表,0080h~0081h参
数位,0081h~07FFh是1919字节的程序区域,0800h~0FFFh是2048字节的callf的entry。
96以上KB的空间0000h~8000h和60KB情况一样,8000h地址以上16KB的bank区间有6
个,8000h~C000h是block32~block47,bank0的C000h~DFFFh是保留区域,E000h~F800h
是内部扩展RAM区域。
1.4处理时间和中断响应
表1-1的情况是内部高速振荡器用作主系统时钟,表1-2的情况是外部系统时钟用于主系统
时钟。
当执行自编程样例库时,有函数可以检查是否有中断产生,还有函数可以进行中断后的处理。
FLMD0推荐10K电阻接地。正常操作模式下,FLMD0应该为低,flash重写模式下,自编
程时拉高。
自编程样例库将自己的程序放在用户区域,需要500字节左右的程序空间(正常模式525
字节,静态模式432字节,在0000h~7FFFh中,因为产品的内置固件位于8000h开始的区
间内),还需要占用CPU(寄存器Bank3),工作区域(入口RAM100字节,高速RAM中
的短寻址或者短直接寻址范围之外,首地址FE20h),堆栈(最大39字节)和数据缓冲区
1~256字节。(stack和databuffer在高速RAM中,不能占用FE20h~FE83h之间)。
用户最好将上述地址事前清理,并且自编程过程中不要对之操作。
2.2入口RAM
100字节自动分配,从初始库调用时指定的首地址开始,入口RAM地址可以指定在
FB00h~FE20h之间。
初始库使用的给flash存储器写入的数据缓冲器不能放在这个工作区域。
2.2.2堆栈和数据缓冲器
使用的堆栈是用户程序自己指定的。堆栈必须有自编程操作的堆栈过程来分配,这样入
口RAM和RAM不会被清除,所以在内部高速RAM区间但不能位于FE20h~FE83h之间。
数据缓冲器根据指定的写入字节数量从首地址自动分配。数据缓冲器的首地址和堆栈情
况一样。
要写入到flash存储器的数据要在字写入库调用之前正确设置和处理。
第三章自编程过程中的中断服务
在某些自编程样例库中,即使在执行自编程,仍然可以产生中断。和普通中断不同,用
户必须通过检查自编程样例库的返回值,决定被中断的处理过程是否要继续。
在响应中断,处理后返回。
Block非空检查库调用FlashBlockBlankCheck库赖返回。
Block擦除库调用FlashBlockBlankCheck库检查应该被擦除的block是否已经成功
擦除,然后调用FlashBlockErase库。
字写入库调用FlashWordWrite库来恢复数据写入过程。
Block验证库调用FlashBlockVerify库来恢复blcok验证过程。
设置信息库调用FlashSetInfo库来恢复信息设置过程。
Eeprom写入库调用FlashEEPROMWrite库来恢复模拟EEPROM写入过程。
上述过程执行过程中都是屏蔽中断的,所以必须要到这些自编程样例库的过程都完成后才会
响应。
3.2中断反应时间
和普通中断不同,中断的产生是通过字变成样例库中断后期服务程序完成的(比如丛自编程
样例库设置返回值为0X1F),所以反应时间比普通中断时间长。
采用内部高速振荡器,入口RAM位于短立即寻址区域(丛FE20h开始)min80ms,不
在短立即寻址区域,min390ms。如果采用外部晶振,则区域造成的差距140ms左右。
3.4在中断服务中需要注意的地方
--在中断服务中不要进行字变成相关操作,也不要修改相关设置。
--在中断服务中不要使用寄存器bank3。
--要保存和恢复中断服务程序中用到的寄存器。
--如果watchdog的时间设定的太短,设置信息库的过程可能完成不了。
如果中断在某个时期连续发生,此时正在执行设置信息库,如果设置信息库在被中断打
断后又恢复的话可能会产生无限循环,因为这个过程从头开始。所以不要让中断间隔时间小
于设置信息库的执行时间。
8Mhz时,设置信息库min108ms,max696ms。
如果自编程时有多个中断发生,那么操作不稳定。要关闭多重/多个中断。
如果自编程样例库的过程被中断打断后没有恢复,又开始操作另外的block,这时候再进行
另外的block操作之前需要调用初始化库。
--系列任务完成之前,不要擦除入口RAM,堆栈,数据缓冲器。
--中断程序不要放在将要被重写的block区域,自编程程序同样。
第四章引导交换
通过自编程的引导交换功能可以避免写入数据丢失,用户程序无法通过reset重起。重
写向量表数据,程序的基本功能,或者自编程区域损坏,掉电或者外部reset信号都会引发。
引导交换是用目标区域bootcluster1来代替引导程序区域bootcluster0。
在重新写入之前,新的引导程序写入1簇,0簇和1簇进行交换,1簇作为引导程序区
域使用。
即使在重写引导程序区时掉电,程序都可以正确执行,因为下次重起从1簇开始,然后0
促可以擦除或者写入。
Block擦除—〉字节写入—〉block校验—〉读取信息—〉设置信息—〉reset—〉结束。
引导交换的预处理过程:
--硬件环境设置
--声明自编程起始地址
--软件环境的设置
--初始化入口RAM
--检查电压水平
擦除引导簇1
通过调用FlashBlockErase库擦除block4~7。按block逐个擦除
拷贝引导簇0
调用字写入库FlashWordWrite来把0000h~0FFFh的内容写入1000F~1FFFh。
字写入库将数据按照字单元写入(最大256字节)
验证引导簇1
读取引导交换的设置状态
FlashGetInfo
设置引导交换位
调用FlashSetInfo库设置
事件发生此时有外部reset触发,则引导簇1作为引导程序区域使用。
擦除簇0
调用FlashBlockErase
给簇0写入新数据
新的程序写入0000h~0FFFh。
验证,然后读取引导交换设置状态。
设置引导交换位,不要从引导簇1启动
外部触发从引导簇0引导程序。
声明自编程结束,设置硬件环境。
第五章自编程样例库
包括有如下的库:
FlashGetInfo(&GetInfo,&DataBuffer);
FlashSetInfo(SetInfoData);
FlashEEPROMWrite(&WordAdder,WordNumber,&DataBuffer)
C语言voidFlashStart(void)
汇编CALL!_FlashStart
如果调用此库时中断没有关闭,那么不能保证。执行时请关闭中断响应。
占用12字节ROM。
CALL!_FlashEnv
AX中存储入口RAM的首地址。30字节堆栈,11字节ROM空间,不需要寄存器
首地址的初始值被固件设置为06h~16h(首地址+06h~+16h十个字节设置初始值),其他字
节清零。
入口地址可以在内部高速RAM中短立即寻址之外任何地方。
如果在内部高速RAM短立即寻址范围内,首地址设置为FE20h。
FlashEnv初始化库保存PSW,设置寄存器bank3,将入口RAM参数传递到HL寄存器,
C寄存器清零,CALL8100h,堆栈恢复PSW,恢复寄存器bank。
UCHARCheckFLMD(void)
返回值00,FLMD0为高,01为低。汇编返回值放在A寄存器中。
如果FLMD0为低,擦除和写入都无法进行,所以必须拉高。
Memory模式
正常模式A,BC清,X,DE,HL保持14字节ROM空间
静态模式A清,X,BC,DE,HL保持11字节ROM空间
堆栈28字节
CALL!_CheckFLMD;
MOV!Status,A;
存储PSW,设置寄存器bank3,C寄存器内容设0Eh,CALL8100h,PSW恢复,寄存器bank
恢复,设置寄存器bank3的B寄存器到寄存器bank的C寄存器(正常模式)或者A寄存器
(静止模式)。
非空检测
UCHARFlashBlockBlankCheck(UCHARBlankCheckBANK,UCHARBlankCheckBlock)
汇编时,A是bank编号,B是block编号。
返回值00正常,05h参数错误,1BhBlock非空,1Fh被中断停止。汇编返回值存在A寄
存器中。
每次检查一个block,需要多次运行,运行时需要屏蔽中断。
正常模式AX,BC寄存器清,DE,HL保持,37字节堆栈67字节ROM
静态模式A,BC寄存器清除,X,DE,HL保持,35字节堆栈54字节ROM
占用的ROM其中有30字节是共用的。
DI
CALL!_FlashBlockBlankCheck
MOV!Status,A
EI
计算block数量和编号,存储PSW堆栈,设置寄存器bank3,将block数量写入入口RAM+3
位置,C寄存器写入08h,CALL8100h,恢复PSW和寄存器bank,设置寄存器bank3的B
寄存器到寄存器bank的C寄存器(正常模式)或者A寄存器(静止模式)。
Block擦除库
汇编时A存bank编号,B存放block编号。如果设备没有bank,就把bank编号设置为0。
返回值00正常,05h参数错误,10h是保护错误(制定要擦除的block在引导区域而且被保
护),1Ah擦除错误,1Fh被中断停止。汇编返回值存在A寄存器中。
同样运行时也需要屏蔽中断,
正常模式AX,BC寄存器清,DE,HL保持,39字节堆栈67字节ROM
静态模式A,BC寄存器清除,X,DE,HL保持,37字节堆栈54字节ROM
占用的ROM其中有30字节是共用的。
MOV!Status,A;Storesstatusinformation.
EI
计算block数量和编号,存储PSW堆栈,设置寄存器bank3,将block数量写入入口RAM+3
位置,C寄存器写入03h,CALL8100h,恢复PSW和寄存器bank,设置寄存器bank3的B
寄存器到寄存器bank的C寄存器(正常模式)或者A寄存器(静止模式)。
字写入库
UCHARFlashWordWrite(structstWordAddress*ptr,UCHARWordNumber,
USHORTDataBufferAddress)
stWordAddress*ptr写起始地址结构的首地址,大小必须3个字节,要保证从4字节整数空
间开始,DataBufferAddress写数据缓冲器的首地址。
AX和C语言一样的数据结构首地址,B字节数长度,HL数据缓冲器首地址。
structstWordAddress{
USHORTWriteAddress;/*Writestartaddress*/
UCHARWriteBank;/*Banknumberofwritestartaddress*/
};
在调用之前,设置结构的每个成员值,把要写入的数据放入数据缓冲器。
注意写入起始地址和写入数据的数量,确保不回越过block的边界。
返回值00正常,05h参数错误,10h是保护错误(制定要擦除的block在引导区域而且被保
护),1Ch写入错误(写入结束后校验不符合),1Fh被中断停止。汇编返回值存在A寄存
器中。
在RAM中有一片作为数据缓冲器,一次最多写入256字节数据(4字节/单位),大于256
字节的数据需要多次调用写入库。写入后必须校验,否则正确性得到不到保障。同样运行时
也需要屏蔽中断,
正常模式AX,BC,DE寄存器清,HL保持,39字节堆栈117字节ROM
静态模式AX,C寄存器清除,B,DE,HL保持,39字节堆栈100字节ROM
占用的ROM其中有57字节是共用的。
structstWordAddressWordAddr;/*Declaresvariable.*/
UCHARDataBuffer[4];/*Declaresvariable.*/
UCHARWordNumber;/*Declaresvariable.*/
UCHARStatus;/*Declaresvariable.*/
DataBuffer[0]=0x11;/*Setsdatatobewritten.*/
DataBuffer[1]=0x22;/*Setsdatatobewritten.*/
DataBuffer[2]=0x33;/*Setsdatatobewritten.*/
DataBuffer[3]=0x44;/*Setsdatatobewritten.*/
WordNumber=1;/*Setsnumberofdatatobewritten.*/
WordAddr.WriteAddress=0xA000;/*Sets0xA000Haswritestartaddress.*/
WordAddr.WriteBANK=0;/*Setsbanknumberofwritestartaddressto0.*/
di();/*Disablesinterrupts.*/
Status=FlashWordWrite(&WordAddr,WordNumber,&DataBuffer);
ei();
计算block数量和编号,存储PSW堆栈,设置寄存器bank3,将写入数据起始地址写入入口
RAM+0,+1,+2位置,要写入的数据数量写入入口RAM+3,数据缓冲器起始地址放在入
口RAM+4,+5,C寄存器写入04h,CALL8100h,恢复PSW和寄存器bank,设置寄存器
bank3的B寄存器到寄存器bank的C寄存器(正常模式)或者A寄存器(静止模式)。
汇编DI;CALL!_FlashWordWrite;MOV!Status,A;EI
Block校验库
返回值00正常,05h参数错误,1Bh是校验错误,1Fh被中断停止。汇编返回值存在A寄
存器中。
多个block数据需要校验时,多次调用校验库。如果没有校验,写入数据正确性得到不到保
障。同样运行时也需要屏蔽中断,
正常模式AX,BC寄存器清,DE,HL保持,37字节堆栈67字节ROM
静态模式A,BC寄存器清除,X,DE,HL保持,35字节堆栈54字节ROM
占用的ROM其中有30字节是共用的。
计算block数量和编号,存储PSW堆栈,设置寄存器bank3,C寄存器写入06h,CALL
8100h,恢复PSW和寄存器bank,设置寄存器bank3的B寄存器到寄存器bank的C寄存器
(正常模式)或者A寄存器(静止模式)。
自编程过程结束库
voidFlashEnd(void)
CALL!_FlashEnd
占用12字节ROM空间
本库执行结束后,FLMD0拉低。要防止中断打扰。
获取信息库
UCHARFlashGetInfo(structstGetInfo*ptr,USHORTDataBufferAddress)
CALL!_FlashGetInfo
Flash信息获取结构的首地址,三字节长度,必须由用户保证(汇编时AX)。数据缓冲是
获取的数据信息存储缓冲区首地址。(汇编时BC)
StructstGetInfo{
UCHAROptionNumber;
UCHARGetInfoBank;
UCHARGetInfoBlock;
};
调用之前,各个成员需要有初始值,如果安全标志信息和引导标志信息被检查,则设置的
bank和block编号无效。
返回值00正常,05h参数错误,20h是读取错误(当option值设置为03h,安全标志两次读
取值不一致)。汇编返回值UCHAR类型存在A寄存器中。
一般用来检查Flash存储器的设置信息(安全标志,引导标志信息,制定block的最后有效地
址),同样需要屏蔽中断。
正常模式AX,BC,DE寄存器清,HL保持,38字节堆栈161字节ROM
静态模式AX,BC,HL寄存器清除,DE保持,38字节堆栈148字节ROM
占用的ROM其中有30字节是共用的。
MOVWAX,#GetInfo
MOVWBC,#DataBuffer
DI
CALL!_FlashGetInfo
MOV!Status,A
EI
参数为5?
是:从参数结构体成员计算bank和block编号,存储PSW堆栈,设置寄存器bank3,
block编号写入入口RAM+0地址。
否:存储PSW堆栈,设置寄存器bank3,(是:由此转入)参数结构成员optionnumber
写入入口RAM+3,数据缓冲起始地址写入入口RAM+4,+5h,C寄存器设置为09h,CALL
8100h,恢复PSW和寄存器bank,optionnumber为5?
是:将数据缓冲器中地址计算得到的bank和地址值写入数据缓冲,(进行运算)设置寄
存器bank3的B寄存器到寄存器bank的C寄存器(正常模式)或者A寄存器(静止模式)。
否:设置寄存器bank3的B寄存器到寄存器bank的C寄存器(正常模式)或者A寄存
器(静止模式)。
Optionnumber的值指定操作
03h安全标志信息(2字节)
04h引导标志信息(1字节)
05h指定block的最后地址(3字节)
1)读取安全标志信息时
数据缓冲首地址内容:安全标志信息
数据缓冲首地址+1内容:引导区域的最后block编号(固定为03h)
BIT0dis/enable整片擦除
BIT1dis/enable整块擦除
BIT2dis/enable允许写入
BIT4dis/enable引导区域重写
其他位保持为1
2)引导标志信息
在数据缓冲器中占据一个字节
00h不交换,01h交换
3)指定block的最后地址
三字节长度,数据缓冲器+0block最后地址低位
数据缓冲器+1block最后地址高位
数据缓冲器+2bank编号
设置信息库
UCHARFlashSetInfo(UCHARSetInfoData)
CALL!_FlashSetInfo汇编时A存储要写入的数据
Flash信息数据详细
BIT0:0/1-交换/不交换引导区
BIT1:0/1-dis/enable整片擦除
BIT2:0/1-dis/enable整块擦除
BIT3:0/1-dis/enable写入
BIT5:0/1-dis/enable写入引导区
其他位为1
返回值00正常,05h参数错误(信息标志的bit0被清零,但是产品不支持引导交换),10h
是保护错误(尝试设置被禁的标志或者引导标志),1Ah擦除错误,1Bh验证错误,1Ch写
入错误,1Fh被中断打断。汇编返回值UCHAR类型存在A寄存器中。
已经被标志禁止的进程不能被使能。??
一般用来改变Flash存储器的设置信息(安全标志,引导标志信息),同样需要屏蔽中断。
正常模式A,BC寄存器清,X,DE,HL保持,37字节堆栈27字节ROM
静态模式A寄存器清除,X,BC,HL,DE保持,37字节堆栈23字节ROM
把参数的Flash信息存入堆栈,存储PSW堆栈,设置寄存器bank3,将存入堆栈的flash
信息数据地址存入入口RAM+4,+5,并将此作为数据缓冲起始地址,C寄存器写入0Ah,
CALL8100h,恢复PSW和寄存器bank,设置寄存器bank3的B寄存器到寄存器bank的C
寄存器(正常模式)或者A寄存器(静止模式)。
EEPROM写入库
在EEPROM模拟中将1—64字的数据写入指定地址。
UCHAREEPROMWrite(structstWordAddress*ptr,UCHARWordNumber,
USHORTDataBufferAddress)
CALL!_EEPROMWrite
stWordAddress*ptr写起始地址结构的首地址,大小必须3个字节,要保证从4字节整数空
间开始,DataBufferAddress写数据缓冲器的首地址。
AX和C语言一样的数据结构首地址,B字节数长度,HL数据缓冲器首地址。
StructstWordAddress{
USHORTWriteAddress;
UCHARWriteBANK;
};
写入起始地址必须是4字节的整数倍。(因为1word长度为4个字节)
事先就要把将写入的数据放入数据缓冲区
确保在block内进行,不能跨界进行。
返回值00正常,05h参数错误(起始地址不是整字开始,要写入的数据数量为零,要写入
的数据长度超过了64字,写入结束地址超过了flash存储器区域),10h是保护错误(尝试
设置被禁的标志或者引导标志),1Ch写入错误,1Dh验证错误,1Ehblank错误(要写入数
据的区域非空,预留空间不足),1Fh被中断打断。
汇编返回值UCHAR类型存在A寄存器中。同样需要屏蔽中断。
正常模式AX,BC,DE寄存器清,HL保持,36字节堆栈117字节ROM
静态模式AX,C寄存器清除,B,HL,DE保持,36字节堆栈100字节ROM
其中57字节ROM空间通用。
从传递的参数得到写入地址和bank,存储PSW堆栈,设置寄存器bank3,将写入起始
地址存入入口RAM+0,+1,+2,写入数据长度存入入口RAM+3,数据缓冲起始地址写入
入口地址+4,+5,C寄存器写入17h,CALL8100h,恢复PSW和寄存器bank,设置寄存器
bank3的B寄存器到寄存器bank的C寄存器(正常模式)或者A寄存器(静止模式)。
第六章自编程控制的细节
专门解释控制flash存储器访问,和入口RAM的寄存器。
FLPMC此寄存器的写入需要特定顺序,为了防止噪声和误操作。
Bit3—〉0/1en/dis写入/擦除
Bit2—〉FLMD0为高,0;拉低置1。0/1dis/en写入/擦除
Bit3-2=01才能真正允许,其他组合都不行。
在普通模式下,bit3一定要置1。
Bit1-0=00;普通模式,全部寻址空间存储器开放
Bit1-0=01;自编程模式,可以调用CALL8100h,片上ROM以及0000h~
7FFFh(控制自编程的程序必须放在这里)全部开放。
除此外的值都不允许设置。
PFCMD保护flash不被无意的程序循环大量滥写。对写操作只有按照下面顺序时有效:
〈1〉给PFCMD写入A5H
〈2〉给FLPMC写入值(此时写入无效)
〈3〉将FLPMC的值取反写入(此时写入无效)
〈4〉将值写入FLPMC(此时写入有效)
每次修改FLPMC的值都需要按照上述顺序进行。
MOVPFCMD,#0A5H
MOVFLPMC,#05H
MOVFLPMC,#0FAH
MOVFLPMC,#05H
这样才能识别,才能把值写入到FLPMC寄存器中。如果不按照上述顺序,FLPMC不能被
正确设置,而且会保护错误。此时PFS寄存器的bit0为1。
设置条件:
当PFCMD寄存器写入的时候,对最近外围寄存器的存储指令操作不是给PFCMD寄存
器写入特定值(A5H)
当《1》之后的首个存储指令对象是FLPMC之外的外围寄存器
当《2》之后的首个存储指令对象是FLPMC之外的外围寄存器
当《2》之后的首个存储指令写入FLPMC寄存器的值不是取反值
当《3》之后的首个存储指令对象是FLPMC之外的外围寄存器
当《3》之后的首个存储指令写入FLPMC寄存器的值不是原来要写入的值
Reset条件:
0写入FPRERR位
系统reset时
自编程控制参数
寄存器bank3的参数
在自编程样例库中,寄存器bank3的C寄存器被用来选择自编程控制功能。B寄存器是用来
存储执行结果,HL用来指定入口RAM的起始地址。
由于寄存器bank3的设置都是在库内进行的,寄存器bank3应该包含在用户程序里。
入口RAM参数列表
入口RAM被用作自编程的工作区域,于是,除了参数,入口RAM区域的任何数据在自编
程过程中都不应该被改动。
数据缓冲器
数据缓冲器是用来传递数据以及与设置祥光的信息,内容根据自编程功能需要而定。起始地
址在入口RAM中指定,位置可以在高速RAM中任何位置。长度范围1~256字节。
数据缓冲参数列表
如果标注是“未使用”,此区域不能被用作数据缓冲。
获取信息功能的详细说明表
寄存器bank3参数列表
GetInfo
GetInfoData