📄 flash.lst
字号:
(0060) asm ("bsr _delay1"); //⑧10us
A11E AD 09 bsr 0xA129
(0061) FLCR=0b00000000; //⑨0->HVEN(取消高压)
A120 4F clrA
A121 C7 FE08 stA 0xFE08
(0062) asm ("bsr _delay1"); //⑩延时10us
A124 AD 03 bsr 0xA129
A126 A7 01 aiS #1
A128 81 rts
_delay1:
j --> X+0
A129 A7 FF aiS #-1
A12B 95 tSX
(0063) }
(0064) void delay1(void) //延时一定时间,供上述程序调用
(0065) { unsigned char j;
A12C 7F clr 0,X
A12D 20 01 bra 0xA130
(0066) for (j=0;j<10;j++); }
A12F 7C inc 0,X
A130 F6 ldA 0,X
A131 A1 0A cmp #10
A133 25 FA bcs 0xA12F
A135 A7 01 aiS #1
A137 81 rts
(0067) void EarseFlash_END(void) //擦除程序的末地址
(0068) { }
_EarseFlash_END:
A138 81 rts
_WriteFlash:
addr --> X+2
A139 95 tSX
(0069) /*WriteFlash:向addr指向的flash区写入数据---------------*
(0070) *功 能:向指定flash地址写入数据 *
(0071) *参 数:addr要写入的首址 *
(0072) *返 回:无 *
(0073) *-----------------------------------------------------*/
(0074) void WriteFlash(unsigned int addr)
(0075) {
A13A E6 02 ldA 2,X
A13C C7 0046 stA _faddr
A13F E6 03 ldA 3,X
A141 C7 0047 stA _faddr+1
(0076) faddr=addr; //写入flash的首地址
(0077) //将写入程序从Flash区拷贝到RAM区PrgOfRam
(0078) asm("ldhx #_DoWriteFlash"); //写入程序的首地址->HX
A144 45 A17D ldHX #0xA17D
(0079) asm("sthx _pbase"); //HX->内存变量pbase
A147 35 4A stHX *_pbase
(0080) asm("ldhx #_WriteFlash_END");//写入程序的末地址->HX
A149 45 A1FF ldHX #0xA1FF
(0081) asm("sthx _pend"); //HX->内存变量pend
A14C 35 48 stHX *_pend
(0082) //将写入程序从Flash区拷贝到RAM区PrgOfRam
(0083) memcpy((void *)PrgOfRam,(void *)pbase,pend-pbase);
A14E C6 0049 ldA _pend+1
A151 C0 004B sub _pbase+1
A154 B7 41 stA *__r1
A156 C6 0048 ldA _pend
A159 C2 004A sbc _pbase
A15C B7 40 stA *__r0
A15E B6 41 ldA *__r1
A160 87 pshA
A161 B6 40 ldA *__r0
A163 87 pshA
A164 C6 004B ldA _pbase+1
A167 87 pshA
A168 C6 004A ldA _pbase
A16B 87 pshA
A16C A6 8D ldA #-115
A16E 87 pshA
A16F A6 00 ldA #0
A171 87 pshA
A172 CD A331 jsr _memcpy
A175 A7 06 aiS #6
A177 95 tSX
(0084) //在RAM区执行写入程序
(0085) asm("LDHX #_PrgOfRam"); //写入程序在RAM的首地址
A178 45 008D ldHX #0x008D
(0086) asm("jsr ,X"); //执行RAM区的写入程序
A17B FD jsr 0,X
A17C 81 rts
_DoWriteFlash:
i --> X+0
j --> X+1
A17D A7 FE aiS #-2
A17F 95 tSX
(0087) }
(0088) /*DoWriteFlash:实际执行的写入函数----------------------*
(0089) *功 能:调入内存执行擦除指定flash地址的数据 *
(0090) *参 数:无 *
(0091) *返 回:无 *
(0092) *内部调用:延时函数delay2(用嵌入汇编调用) *
(0093) *-----------------------------------------------------*/
(0094) void delay2(void);
(0095) void DoWriteFlash(void)
(0096) {
A180 A6 01 ldA #1
A182 C7 FE08 stA 0xFE08
(0097) unsigned char i;
(0098) unsigned char j;
(0099) FLCR=0b00000001; //①1->PGM
(0100) i=FLBPR; //②读FLBPR
A185 C6 FF7E ldA 0xFF7E
A188 F7 stA 0,X
(0101) //③任意数->faddr,选中flash行
(0102) *((volatile unsigned char *)faddr)=56;
A189 C6 0047 ldA _faddr+1
A18C B7 41 stA *__r1
A18E C6 0046 ldA _faddr
A191 B7 40 stA *__r0
A193 A6 38 ldA #56
A195 55 40 ldHX *__r0
A197 F7 stA 0,X
A198 95 tSX
(0103) asm ("bsr _delay2"); //④延时10us
A199 AD 55 bsr 0xA1F0
(0104) FLCR=0b00001001; //⑤1->HVEN
A19B A6 09 ldA #9
A19D C7 FE08 stA 0xFE08
(0105) asm ("bsr _delay2"); //⑥延时10us
A1A0 AD 4E bsr 0xA1F0
(0106) //⑦将数据写入相应的flash地址
(0107) for(i=0;i<N;i++)
A1A2 7F clr 0,X
A1A3 20 35 bra 0xA1DA
(0108) { //数据送入flash地址
A1A5 3F 40 clr *__r0
A1A7 F6 ldA 0,X
A1A8 AB 4C add #76
A1AA B7 41 stA *__r1
A1AC B6 40 ldA *__r0
A1AE A9 00 adc #0
A1B0 B7 40 stA *__r0
A1B2 55 40 ldHX *__r0
A1B4 F6 ldA 0,X
A1B5 95 tSX
A1B6 B7 41 stA *__r1
A1B8 3F 42 clr *__r2
A1BA F6 ldA 0,X
A1BB CB 0047 add _faddr+1
A1BE B7 43 stA *__r3
A1C0 B6 42 ldA *__r2
A1C2 C9 0046 adc _faddr
A1C5 B7 42 stA *__r2
A1C7 B6 41 ldA *__r1
A1C9 55 42 ldHX *__r2
A1CB F7 stA 0,X
A1CC 95 tSX
(0109) *((volatile unsigned char *)faddr+i)=data[i];
(0110) for (j=0;j<30;j++); //⑧延时30us,不能调用延时程序
A1CD 6F 01 clr 1,X
A1CF 20 02 bra 0xA1D3
A1D1 6C 01 inc 1,X
A1D3 E6 01 ldA 1,X
A1D5 A1 1E cmp #30
A1D7 25 F8 bcs 0xA1D1
(0111) }
A1D9 7C inc 0,X
A1DA F6 ldA 0,X
A1DB C1 008C cmp _N
A1DE 25 C5 bcs 0xA1A5
(0112) FLCR=0b00001000; //⑨0->PGM
A1E0 A6 08 ldA #8
A1E2 C7 FE08 stA 0xFE08
(0113) asm ("bsr _delay2"); //⑩延时10us
A1E5 AD 09 bsr 0xA1F0
(0114) FLCR=0b00000000; //⑾0->HVEN
A1E7 4F clrA
A1E8 C7 FE08 stA 0xFE08
(0115) asm ("bsr _delay2"); //⑿延时6us
A1EB AD 03 bsr 0xA1F0
A1ED A7 02 aiS #2
A1EF 81 rts
_delay2:
j --> X+0
A1F0 A7 FF aiS #-1
A1F2 95 tSX
(0116) }
(0117) void delay2(void) //延时一定时间
(0118) { unsigned char j;
A1F3 7F clr 0,X
A1F4 20 01 bra 0xA1F7
(0119) for (j=0;j<10;j++); }
A1F6 7C inc 0,X
A1F7 F6 ldA 0,X
A1F8 A1 0A cmp #10
A1FA 25 FA bcs 0xA1F6
A1FC A7 01 aiS #1
A1FE 81 rts
(0120) void WriteFlash_END(void) //写入程序的末地址
(0121) { }
_WriteFlash_END:
A1FF 81 rts
FILE: F:\01科研~1\编著2005\HC08嵌~1\GP32程序\HC08EX~2\C\C06_FL~1\setup.c
(0001) /*_HC08Setup:GP32系统初始化子程序----------------------*
(0002) *功能:系统初始化设置:设置CONFIG1和CONFIG2寄存器 *
(0003) CGM的寄存器设置:由外部晶振f=32.768kHz,产生内部 *
(0004) 总线时钟2.4576MHz *
(0005) *参数:无 *
(0006) *返回:无 *
(0007) *-----------------------------------------------------*/
(0008) #include "GP32C.h" //映像寄存器地址头文件
(0009) void _HC08Setup(void)
(0010) {
__HC08Setup:
A200 A6 01 ldA #1
A202 B7 1E stA 0x1E
(0011) //初始化CONFIG2
(0012) CONFIG2=0b00000001; //SCIBDSRC=1内部总线时钟用作SCI
(0013) //时钟;OSCSTOPENB=0在stop模式下
(0014) //禁止振荡器工作
(0015) //初始化CONFIG1
(0016) CONFIG1=0b00111101; //COPD=1 禁止COP模块
A204 A6 3D ldA #61
A206 B7 1F stA 0x1F
(0017) //STOP=0 禁止STOP指令
(0018) //SSREC=1 32个CGMXCLK周期退出
(0019) //STOP模式
(0020) //LVI5OR3=1 LVI工作在5V
(0021) //LVIPWRD=1 禁止LVI模块电源
(0022) //LVIRSTD=1 允许LVI复位信号
(0023) //LVISTOP=0 在stop模式下禁止LVI
(0024) //COPRS=0 COP溢出范围使用长的时间
(0025) PCTL=0x00; //①禁止PLL:清零PLL控制寄存器PCTL
A208 3F 36 clr 0x36
(0026) PCTL=0x01; //②将P、E写入PTCL,置VCO的参考频率
A20A A6 01 ldA #1
A20C B7 36 stA 0x36
(0027) // 为2
(0028) PMSH=0x01; //③将N写入PMSH、PMSL,置VCO的倍
A20E A6 01 ldA #1
A210 B7 38 stA 0x38
(0029) // 频因子为$12C
(0030) PMSL=0x2C;
A212 A6 2C ldA #44
A214 B7 39 stA 0x39
(0031) PMRS=0b10000000; //④将L写入PMRS,置VCO的输出频率范
A216 A6 80 ldA #-128
A218 B7 3A stA 0x3A
(0032) // 围系数为$80
(0033) PRDS=0x01; //⑤将R写入PRDS
A21A A6 01 ldA #1
A21C B7 3B stA 0x3B
(0034) PCTL|=(1<<5); //⑥置PCTL.PLLON=1,启动PLL电路
A21E 1A 36 Bset 5,0x36
(0035) PBWC|=(1<<7); //⑦PBWC自动带宽控制位=1,选择自动
A220 1E 37 Bset 7,0x37
(0036) // 控制方式
(0037) PCTL|=(1<<4); //⑧PCTL.BCS=1,选择PLL电路为时钟源
A222 18 36 Bset 4,0x36
A224 81 rts
FILE: F:\01科研~1\编著2005\HC08嵌~1\GP32程序\HC08EX~2\C\C06_FL~1\SCIInit.c
(0001) /*SCIInit:串行口初始化子程序---------------------------*
(0002) *功 能:对串行口进行初始化,默认为允许SCI,正常码输出,8位 *
(0003) * 数据,无校验等,允许发送器允许接收器.查询方式收发,*
(0004) * 波特率为9600(设fBUS=2.4576MHz) *
(0005) *参 数:无 *
(0006) *返 回:无 *
(0007) *-----------------------------------------------------*/
(0008) #include "GP32C.H"
(0009) void SCIInit(void)
(0010) { //总线频率fBUS=2.4576MHz,定义波特率Bt=9600
_SCIInit:
A225 A6 02 ldA #2
A227 B7 19 stA 0x19
(0011) SCBR=0b00000010;
(0012) //设置允许SCI,正常码输出、8位数据、无校验
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -