奇怪,stc8g1k08的程序到了stc8h1k08上面,EEP相关程序不动了
8G和8H最大的差别是(至少就我的认识)8G有PCA,没有高级PWM,
而8H有高级pwm而没有PCA,
除此之外,看pdf这2个芯片几乎是一样的,
差异部分经过修改,用PWM替代PCA部分动起来了,
但是之前在8G上正常运行的EEP读写却失效了,有点莫明其妙.
烧录附件例程到芯片里测一下试试看
莫名其妙的解决了,虽然仍然运行不稳定,但是初步解决了,
原因是IAP操作后要2个nop,1个nop不行,原因不明 你程序贴出来大家看看,没这个要求啊 本帖最后由 zealot 于 2023-9-12 10:37 编辑
读eep用的movc,这基本没有什么可以说,出问题的可能也不大,忽略.
主要是写和擦的部分吧.
擦:
// void erase_page(u8 Addr); // Addr是地址,要清除第一页,Addr为第一页内任意地址(原则上可以随意指定,实际上必须页头00位)
void erase_page(void){
IAP_CONTR = 0b10000000; // IAPEN x x CMD_FAIL x x x x
IAP_TPS = 24; // system on 24M.
IAP_ADDRL = 0; IAP_ADDRH = 0;
IAP_CMD = 3; // 00 nop; 01 read(movc更好); 10Write; 11Erase;
IAP_TRIG = 0x5A; IAP_TRIG = 0xA5;
__asm
nop
nop // 2nop系统正常,删除第2nop,eep就崩了
__endasm;
}
数据写入eep:
void SaveData2EEP(void){
// 此子程序耗时超长,甚至到xx ms(毫秒)的程度,
// 保存所有数据从Xram(或者全局变量设置等)到EEP, 包括xxxx 总之就是保存数据到EEP的意义.
EA=0;// TPOff(); //Disable_accessEXxram();
erase_page(); // 清除所有数据
__asm
// 这里和eep无关,删除了.基本是数据处理
// 数据都在Xram里面了,循环写到EEP里面.
mov r0, #0
mov r1, #16
1$:
movx a, @r0
mov _IAP_CONTR, #0x80
mov _IAP_TPS, #24
mov _IAP_DATA, a
mov _IAP_ADDRL, r0
mov _IAP_ADDRH, #0
mov _IAP_CMD, #2
mov _IAP_TRIG, #0x5A
mov _IAP_TRIG, #0xA5
nop
nop // 2nop系统正常,删除第2nop,eep就崩了
inc r0
djnz r1, 1$
__endasm;
IAP_DATA=0; IAP_ADDRL=0; IAP_ADDRH=0x80; IAP_CMD=0; IAP_CONTR=0; IAP_TRIG=0; // set IAP system to Idle.
EA=1;
}
注意,这里的C和asm都是sdcc风格,不是kali风格,因为我这里编译是通过,并且连警告都没有的,基本上领会思想就好,格式问题忽略掉吧. 读eep的部分,不过应该没有用
void ReadEEPdata(void){
EA=0;// TPOff(); //Disable_accessEXxram();
// 直接汇编写,省的概念混淆.
// 从EEP到XRAM
__asm
// eep地址0,对应movc其实是0x2000
mov dptr, #0x2000
mov r0, dpl
// Xram地址正常
mov r1, #0
// 总共16个数据,其实没有那么多,但是先多预一点
mov r3, 16
1$:
mov dpl, r0
clr a
movc a, @a+dptr
movx @r1, a
inc r0
inc r1
djnz r3, 1$
// 读EEP完成,开始解析XRAM中的数据
mov r0, #a1
movx a, @r0
mov _a1, a
inc r0
movx a, @r0
mov _a1+1, a
mov r0, #a2
movx a, @r0
mov _a2, a
inc r0
movx a, @r0
mov _a2+1, a
mov r0, #addr_a3bit
movx a, @r0
mov c, acc.0
mov _a3bit, c
mov r0, #a4
movx a, @r0
mov _a4, a
__endasm;
EA=1;
}
页:
[1]