📄 flash.lst
字号:
__start:
__text_start:
9000 45 0240 ldHX #0x0240
9003 94 tXS
9004 CD 9035 jsr __HC08Setup
9007 45 0046 ldHX #0x0046
900A 65 0091 cpHX #0x0091
900D 27 06 beq 0x9015
900F 6F 00 clr 0,X
9011 AF 01 aiX #1
9013 20 F5 bra 0x900A
9015 45 0047 ldHX #0x0047
9018 94 tXS
9019 45 9000 ldHX #0x9000
901C 65 9000 cpHX #0x9000
901F 27 0B beq 0x902C
9021 E6 00 ldA 0,X
9023 9EE7 00 stA 0,S
9026 AF 01 aiX #1
9028 A7 01 aiS #1
902A 20 F0 bra 0x901C
902C 45 0240 ldHX #0x0240
902F 94 tXS
9030 CD 905A jsr _main
_exit:
9033 20 FE bra 0x9033
FILE: 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:
9035 A6 01 ldA #1
9037 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模块
9039 A6 3D ldA #61
903B 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
903D 3F 36 clr 0x36
(0026) PCTL=0x01; //②将P、E写入PTCL,置VCO的参考频率
903F A6 01 ldA #1
9041 B7 36 stA 0x36
(0027) // 为2
(0028) PMSH=0x01; //③将N写入PMSH、PMSL,置VCO的倍
9043 A6 01 ldA #1
9045 B7 38 stA 0x38
(0029) // 频因子为$12C
(0030) PMSL=0x2C;
9047 A6 2C ldA #44
9049 B7 39 stA 0x39
(0031) PMRS=0b10000000; //④将L写入PMRS,置VCO的输出频率范
904B A6 80 ldA #-128
904D B7 3A stA 0x3A
(0032) // 围系数为$80
(0033) PRDS=0x01; //⑤将R写入PRDS
904F A6 01 ldA #1
9051 B7 3B stA 0x3B
(0034) PCTL|=(1<<5); //⑥置PCTL.PLLON=1,启动PLL电路
9053 1A 36 Bset 5,0x36
(0035) PBWC|=(1<<7); //⑦PBWC自动带宽控制位=1,选择自动
9055 1E 37 Bset 7,0x37
(0036) // 控制方式
(0037) PCTL|=(1<<4); //⑧PCTL.BCS=1,选择PLL电路为时钟源
9057 18 36 Bset 4,0x36
9059 81 rts
_main:
i --> X+0
p --> X+1
905A A7 FD aiS #-3
905C 95 tSX
FILE: main.c
(0001) /*-----------------------------------------------------*
(0002) *工 程 名:Flash.prj *
(0003) *硬件连接:无 *
(0004) *功 能: *
(0005) * 1.等待接收N+1个数,并放入N和data数组中 *
(0006) * 2.擦除以addr为首地址的Flash一页,将N个数据写入 *
(0007) * 3.从以addr为首址的Flash区读取N个数据,串口发送 *
(0008) *说 明: *
(0009) * 1.与Visual Basic 6.0 程序Flash_Test.vbp联合运行 *
(0010) * 2.擦/写函数中用来暂存写入或擦除程序的首末地址的 *
(0011) * 变量pbase,pend;用来暂存待写入或擦除的Flash首 *
(0012) * 地址faddr;用来存放写入的数据个数N和写入的数据 *
(0013) * data[]必须在main函数中定义,否则将出错 *
(0014) * 3.调用擦/写子程序之前先将待擦/写页后一页开始的 *
(0015) * 所有区域写保护 *
(0016) *------------------------------------------------------*
(0017) /*[头文件]*/
(0018) #include "SCI.h" //串行通信子程序头文件
(0019) #include "GP32C.h" //包含头文件
(0020) #include "flash.h" //包含头文件
(0021) #include "SCIInit.h" //包含头文件
(0022) //UINT16 g_bBegin, g_bEnd, g_pAddress;
(0023) //函数声明
(0024)
(0025) //内存变量声明
(0026) unsigned char N,data[64]; //N:写入FLASH的数据个数
(0027) //data:将写入flash的数据
(0028) //主程序
(0029) void main()
(0030) {
905D CD 91DD jsr _SCIInit
9060 95 tSX
9061 20 73 bra 0x90D6
(0031) unsigned char i;
(0032) unsigned char *p;
(0033) SCIInit(); //调串行口初始化子程序
(0034) //主循环开始
(0035) while(1)
(0036) {
9063 A6 56 ldA #86
9065 87 pshA
9066 CD 90DE jsr _SCISend1
9069 A7 01 aiS #1
906B 95 tSX
(0037) SCISend1(86); //发送握手信号86
(0038) //等待接收一个字节的握手信号
(0039) if(SCIRe1(p)!=56) //是否是56?
906C E6 02 ldA 2,X
906E 87 pshA
906F E6 01 ldA 1,X
9071 87 pshA
9072 CD 912B jsr _SCIRe1
9075 A7 02 aiS #2
9077 95 tSX
9078 B7 41 stA *__r1
907A A1 38 cmp #56
907C 27 02 beq 0x9080
(0040) continue; //否,继续握手
907E 20 56 bra 0x90D6
(0041) //等待接收写入的数据个数(N<=128)并存放到N中
(0042) SCIReN(1,data);
9080 45 0046 ldHX #0x0046
9083 89 pshX
9084 8B pshH
9085 A6 01 ldA #1
9087 87 pshA
9088 CD 918A jsr _SCIReN
908B A7 03 aiS #3
(0043) N=data[0];
908D 4E 4686 mov *_data,0x86
(0044) //等待接收N个字节的数据并存放到以data数组中
(0045) SCIReN(N,data);
9090 45 0046 ldHX #0x0046
9093 89 pshX
9094 8B pshH
9095 B6 86 ldA 0xFFFFFF86
9097 87 pshA
9098 CD 918A jsr _SCIReN
909B A7 03 aiS #3
(0046) //调用EarseFlash()程序之前要保护后一页之后的区域
(0047) //如:EarseFlash(0x8000),则要保护的为$8100后的区域
(0048) FLBPR=0b00000010; //保护$8100~$FFFF的FLASH区域
909D A6 02 ldA #2
909F C7 FF7E stA 0xFF7E
(0049) EraseFlash((UINT8 *)0x8000); //擦除0x8000为始址的一个页
90A2 45 8000 ldHX #0x8000
90A5 89 pshX
90A6 8B pshH
90A7 CD 91F4 jsr _EraseFlash
90AA A7 02 aiS #2
(0050) //调用WriteFlash()程序之前要保护后一页之后的区域
(0051) //如:WriteFlash(0x8000),则要保护的为$8100后的区域
(0052) FLBPR=0b00000010; //保护$8100~$FFFF的FLASH区域
90AC A6 02 ldA #2
90AE C7 FF7E stA 0xFF7E
(0053) WriteFlash((UINT8 *)0x8000, data,N);
90B1 3F 40 clr *__r0
90B3 B6 86 ldA 0xFFFFFF86
90B5 87 pshA
90B6 B6 40 ldA *__r0
90B8 87 pshA
90B9 45 0046 ldHX #0x0046
90BC 89 pshX
90BD 8B pshH
90BE 45 8000 ldHX #0x8000
90C1 89 pshX
90C2 8B pshH
90C3 CD 926B jsr _WriteFlash
90C6 A7 06 aiS #6
(0054) //读出flash中的数据发给pc机比较
(0055) SCISendN(N,(unsigned char *)0x8000);
90C8 45 8000 ldHX #0x8000
90CB 89 pshX
90CC 8B pshH
90CD B6 86 ldA 0xFFFFFF86
90CF 87 pshA
90D0 CD 90ED jsr _SCISendN
90D3 A7 03 aiS #3
90D5 95 tSX
(0056) }
90D6 20 8B bra 0x9063
90D8 A7 03 aiS #3
90DA 81 rts
_isrDummy:
90DB 8B pshH
FILE: vectors08.c
(0001) /*-----------------------------------------------------*
(0002) *文件名:vectors08.c *
(0003) *功 能:用于定义中断矢量表 *
(0004) *-----------------------------------------------------*/
(0005) //[头文件]
(0006) #include "GP32C.H" //包含头文件
(0007) //未定义的中断处理函数,本函数不能删除
(0008) #pragma interrupt_handler isrDummy
(0009) void isrDummy(void)
(0010) {
90DC 8A pulH
90DD 80 rti
_SCISend1:
o --> X+2
90DE 95 tSX
FILE: SCI.c
(0001) /*-----------------------------------------------------*
(0002) *文件描述:本文件包含了串行通信的4子程序,分别为: *
(0003) *(1)SCISend1:串行发送1字节 *
(0004) *(2)SCISendN:串行发送n字节 *
(0005) *(3)SCIRe1:串行接收1字节 *
(0006) *(4)SCIReN:串行接收n字节 *
(0007) *-------------《嵌入式应用技术基础教程》--------------*/
(0008) #include "SCI.h"
(0009)
(0010) void SCISend1(unsigned char o)
(0011) {//判断ReStatusR的第SendTestBit位是否为1,是1可以发送
90DF 20 09 bra 0x90EA
(0012) while(1)
(0013) {
90E1 0F 1606 BRclr 7,0x16,0x90EA
(0014) if ((ReSendStatusR & (1 << SendTestBit)) != 0)
(0015) {
90E4 E6 02 ldA 2,X
90E6 B7 18 stA 0x18
(0016) ReSendDataR = o;
(0017) break;
90E8 20 02 bra 0x90EC
(0018) }
(0019) }
90EA 20 F5 bra 0x90E1
90EC 81 rts
_SCISendN:
i --> X+0
ch --> X+5
n --> X+4
90ED A7 FE aiS #-2
90EF 95 tSX
(0020) }
(0021)
(0022) void SCISendN(unsigned char n,unsigned char ch[])
(0023) {
90F0 6F 01 clr 1,X
90F2 7F clr 0,X
90F3 20 1F bra 0x9114
(0024) int i;
(0025) for(i = 0; i < n; i++)
(0026) SCISend1(ch[i]);
90F5 E6 01 ldA 1,X
90F7 EB 06 add 6,X
90F9 B7 41 stA *__r1
90FB F6 ldA 0,X
90FC E9 05 adc 5,X
90FE B7 40 stA *__r0
9100 55 40 ldHX *__r0
9102 F6 ldA 0,X
9103 87 pshA
9104 CD 90DE jsr _SCISend1
9107 A7 01 aiS #1
9109 95 tSX
910A E6 01 ldA 1,X
910C AB 01 add #1
910E E7 01 stA 1,X
9110 F6 ldA 0,X
9111 A9 00 adc #0
9113 F7 stA 0,X
9114 3F 40 clr *__r0
9116 E6 04 ldA 4,X
9118 B7 41 stA *__r1
911A E6 01 ldA 1,X
911C B7 43 stA *__r3
911E F6 ldA 0,X
911F B7 42 stA *__r2
9121 55 42 ldHX *__r2
9123 75 40 cpHX *__r0
9125 95 tSX
9126 91 CD blt 0x90F5
9128 A7 02 aiS #2
912A 81 rts
_SCIRe1:
i --> X+0
k --> X+1
p --> X+5
912B A7 FD aiS #-3
912D 95 tSX
(0027) }
(0028)
(0029) unsigned char SCIRe1(unsigned char *p)
(0030) {
912E 6F 02 clr 2,X
9130 6F 01 clr 1,X
9132 20 21 bra 0x9155
(0031) unsigned int k;
(0032) unsigned char i;
(0033) //ReStatusR第ReTestBit位为1表示可接收数据
(0034) for(k = 0; k< 0xfbbb; k++)
(0035) {
9134 0B 1612 BRclr 5,0x16,0x9149
(0036) if ((ReSendStatusR & (1 << ReTestBit)) != 0)
(0037) {
9137 B6 18 ldA 0x18
9139 F7 stA 0,X
(0038) i = ReSendDataR;
(0039) *p = 0x00;
913A E6 06 ldA 6,X
913C B7 41 stA *__r1
913E E6 05 ldA 5,X
9140 B7 40 stA *__r0
9142 4F clrA
9143 55 40 ldHX *__r0
9145 F7 stA 0,X
9146 95 tSX
(0040) break;
9147 20 1C bra 0x9165
(0041) }
(0042) }
9149 E6 02 ldA 2,X
914B AB 01 add #1
914D E7 02 stA 2,X
914F E6 01 ldA 1,X
9151 A9 00 adc #0
9153 E7 01 stA 1,X
9155 E6 02 ldA 2,X
9157 B7 41 stA *__r1
9159 E6 01 ldA 1,X
915B B7 40 stA *__r0
915D 55 40 ldHX *__r0
915F 65 FBBB cpHX #0xFBBB
9162 95 tSX
9163 25 CF bcs 0x9134
(0043) if(k >= 0xfbbb)
9165 E6 02 ldA 2,X
9167 B7 41 stA *__r1
9169 E6 01 ldA 1,X
916B B7 40 stA *__r0
916D 55 40 ldHX *__r0
916F 65 FBBB cpHX #0xFBBB
9172 95 tSX
9173 25 11 bcs 0x9186
(0044) {
9175 A6 FF ldA #-1
9177 F7 stA 0,X
(0045) i = 0xff;
(0046) *p = 0x01;
9178 E6 06 ldA 6,X
917A B7 41 stA *__r1
917C E6 05 ldA 5,X
917E B7 40 stA *__r0
9180 A6 01 ldA #1
9182 55 40 ldHX *__r0
9184 F7 stA 0,X
9185 95 tSX
(0047) }
9186 F6 ldA 0,X
9187 A7 03 aiS #3
9189 81 rts
_SCIReN:
fp --> X+0
m --> X+1
ch --> X+6
n --> X+5
918A A7 FD aiS #-3
918C 95 tSX
(0048) return i; //返回接收到的数据
(0049) }
(0050)
(0051) unsigned char SCIReN(unsigned char n, unsigned char ch[])
(0052) {
918D 6F 02 clr 2,X
918F 6F 01 clr 1,X
9191 20 31 bra 0x91C4
(0053) int m;
(0054) unsigned char fp;
(0055) m = 0;
(0056) while (m < n)
(0057) {
9193 89 pshX
9194 8B pshH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -