📄 flash.lst
字号:
__text_start:
__start:
A000 45 0240 ldHX #0x0240
A003 94 tXS
A004 CD A200 jsr __HC08Setup
A007 45 0046 ldHX #0x0046
A00A 65 008E cpHX #0x008E
A00D 27 06 beq 0xA015
A00F 6F 00 clr 0,X
A011 AF 01 aiX #1
A013 20 F5 bra 0xA00A
A015 45 0047 ldHX #0x0047
A018 94 tXS
A019 45 A000 ldHX #0xA000
A01C 65 A000 cpHX #0xA000
A01F 27 0B beq 0xA02C
A021 E6 00 ldA 0,X
A023 9EE7 00 stA 0,S
A026 AF 01 aiX #1
A028 A7 01 aiS #1
A02A 20 F0 bra 0xA01C
A02C 45 0240 ldHX #0x0240
A02F 94 tXS
A030 CD A035 jsr _main
_exit:
A033 20 FE bra 0xA033
_main:
i --> X+0
p --> X+1
A035 A7 FD aiS #-3
A037 95 tSX
FILE: F:\01科研~1\编著2005\HC08嵌~1\GP32程序\HC08EX~2\C\C06_FL~1\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) //函数声明
(0021) extern void SCIInit(void); //串行口初始化子程序
(0022) extern void EarseFlash(unsigned int addr);
(0023) extern void WriteFlash(unsigned int addr);
(0024) //内存变量声明
(0025) unsigned char N,data[64]; //N:写入FLASH的数据个数
(0026) //data:将写入flash的数据
(0027) unsigned int pbase,pend,faddr;
(0028) //存放将写入或擦除的首地址
(0029) //主程序
(0030) void main()
(0031) {
A038 CD A225 jsr _SCIInit
A03B 95 tSX
A03C 20 6D bra 0xA0AB
(0032) unsigned char i;
(0033) unsigned char *p;
(0034) SCIInit(); //调串行口初始化子程序
(0035) //主循环开始
(0036) while(1)
(0037) {
A03E A6 56 ldA #86
A040 87 pshA
A041 CD A232 jsr _SCISend1
A044 A7 01 aiS #1
A046 95 tSX
(0038) SCISend1(86); //发送握手信号86
(0039) //等待接收一个字节的握手信号
(0040) if(SCIRe1(p)!=56) //是否是56?
A047 E6 02 ldA 2,X
A049 87 pshA
A04A E6 01 ldA 1,X
A04C 87 pshA
A04D CD A27F jsr _SCIRe1
A050 A7 02 aiS #2
A052 95 tSX
A053 B7 41 stA *__r1
A055 A1 38 cmp #56
A057 27 02 beq 0xA05B
(0041) continue; //否,继续握手
A059 20 50 bra 0xA0AB
(0042) //等待接收写入的数据个数(N<=128)并存放到N中
(0043) SCIReN(1,data);
A05B A6 4C ldA #76
A05D 87 pshA
A05E A6 00 ldA #0
A060 87 pshA
A061 A6 01 ldA #1
A063 87 pshA
A064 CD A2DE jsr _SCIReN
A067 A7 03 aiS #3
(0044) N=data[0];
A069 C6 004C ldA _data
A06C C7 008C stA _N
(0045) //等待接收N个字节的数据并存放到以data数组中
(0046) SCIReN(N,data);
A06F A6 4C ldA #76
A071 87 pshA
A072 A6 00 ldA #0
A074 87 pshA
A075 C6 008C ldA _N
A078 87 pshA
A079 CD A2DE jsr _SCIReN
A07C A7 03 aiS #3
(0047) //调用EarseFlash()程序之前要保护后一页之后的区域
(0048) //如:EarseFlash(0x8000),则要保护的为$8100后的区域
(0049) FLBPR=0b00000010; //保护$8100~$FFFF的FLASH区域
A07E A6 02 ldA #2
A080 C7 FF7E stA 0xFF7E
(0050) EarseFlash(0x8000); //擦除0x8000为始址的一个页
A083 45 8000 ldHX #0x8000
A086 89 pshX
A087 8B pshH
A088 CD A0B0 jsr _EarseFlash
A08B A7 02 aiS #2
(0051) //调用WriteFlash()程序之前要保护后一页之后的区域
(0052) //如:WriteFlash(0x8000),则要保护的为$8100后的区域
(0053) FLBPR=0b00000010; //保护$8100~$FFFF的FLASH区域
A08D A6 02 ldA #2
A08F C7 FF7E stA 0xFF7E
(0054) WriteFlash(0x8000); //将数据写入flash
A092 45 8000 ldHX #0x8000
A095 89 pshX
A096 8B pshH
A097 CD A139 jsr _WriteFlash
A09A A7 02 aiS #2
(0055) //读出flash中的数据发给pc机比较
(0056) SCISendN(N,(unsigned char *)0x8000);
A09C 45 8000 ldHX #0x8000
A09F 89 pshX
A0A0 8B pshH
A0A1 C6 008C ldA _N
A0A4 87 pshA
A0A5 CD A241 jsr _SCISendN
A0A8 A7 03 aiS #3
A0AA 95 tSX
(0057) }
A0AB 20 91 bra 0xA03E
A0AD A7 03 aiS #3
A0AF 81 rts
_EarseFlash:
addr --> X+2
A0B0 95 tSX
FILE: F:\01科研~1\编著2005\HC08嵌~1\GP32程序\HC08EX~2\C\C06_FL~1\flash.c
(0001) /*文件描述:本文件包含的子程序为 *
(0002) * 1.void EarseFlash(unsigned int addr) *
(0003) * Flash擦除子程序 *
(0004) * 2.void WriteFlash(unsigned int addr) *
(0005) * Flash写入子程序 *
(0006) *说 明: *
(0007) * 1.用来暂存写入或擦除程序的首末地址的变量pbase, *
(0008) * pend;用来暂存待写入或擦除的Flash首地址faddr; *
(0009) * 用来存放写入的数据个数N和写入的数据data[]必须 *
(0010) * 在main函数中定义,否则将出错 *
(0011) * 2.调用擦/写子程序之前先将待擦/写页的后一页开始的 *
(0012) * 所有区域写保护 *
(0013) *-------------《嵌入式应用技术基础教程》--------------*/
(0014) //[包含头文件]
(0015) #include "GP32C.h"
(0016) #include <String.h>
(0017) //外部内存变量声明
(0018) extern unsigned char N,data[];
(0019) extern unsigned int pbase,pend,faddr;
(0020) unsigned char PrgOfRam[]; //存放擦/写FLASH程序以便执行
(0021) //内部调用函数声明
(0022) void DoEarseFlash(void);
(0023) void DoWriteFlash(void);
(0024) /*EarseFlash:擦除指定flash的一页-----------------------*
(0025) *功 能:擦除以addr为首地址的flash一页 *
(0026) *参 数:addr要擦除的首地址 *
(0027) *返 回:无 *
(0028) *-----------------------------------------------------*/
(0029) void EarseFlash(unsigned int addr)
(0030) {
A0B1 E6 02 ldA 2,X
A0B3 C7 0046 stA _faddr
A0B6 E6 03 ldA 3,X
A0B8 C7 0047 stA _faddr+1
(0031) faddr=addr; //擦除flash的首地址
(0032) //将擦除程序从Flash区拷贝到RAM区PrgOfRam
(0033) asm("ldhx #_DoEarseFlash"); //擦除程序的首地址->HX
A0BB 45 A0F4 ldHX #0xA0F4
(0034) asm("sthx _pbase"); //HX->内存变量pbase
A0BE 35 4A stHX *_pbase
(0035) asm("ldhx #_EarseFlash_END"); //擦除程序的末地址->HX
A0C0 45 A138 ldHX #0xA138
(0036) asm("sthx _pend"); //HX->内存变量pend
A0C3 35 48 stHX *_pend
(0037) memcpy((void *)PrgOfRam,(void *)pbase,pend-pbase);
A0C5 C6 0049 ldA _pend+1
A0C8 C0 004B sub _pbase+1
A0CB B7 41 stA *__r1
A0CD C6 0048 ldA _pend
A0D0 C2 004A sbc _pbase
A0D3 B7 40 stA *__r0
A0D5 B6 41 ldA *__r1
A0D7 87 pshA
A0D8 B6 40 ldA *__r0
A0DA 87 pshA
A0DB C6 004B ldA _pbase+1
A0DE 87 pshA
A0DF C6 004A ldA _pbase
A0E2 87 pshA
A0E3 A6 8D ldA #-115
A0E5 87 pshA
A0E6 A6 00 ldA #0
A0E8 87 pshA
A0E9 CD A331 jsr _memcpy
A0EC A7 06 aiS #6
A0EE 95 tSX
(0038) //在RAM区执行擦除程序
(0039) asm("ldhx #_PrgOfRam"); //擦除程序在RAM区的首地址
A0EF 45 008D ldHX #0x008D
(0040) asm("jsr ,X"); //执行RAM区域的擦除程序
A0F2 FD jsr 0,X
A0F3 81 rts
_DoEarseFlash:
i --> X+0
A0F4 A7 FF aiS #-1
A0F6 95 tSX
(0041) }
(0042) /*DoEarseFlash:擦除指定flash区-------------------------*
(0043) *功 能: 真正执行擦除addr指向的flash区的操作 *
(0044) *参 数:无 *
(0045) *返 回:无 *
(0046) *内部调用:延时函数delay1 (用嵌入汇编调用) *
(0047) *-----------------------------------------------------*/
(0048) void delay1(void);
(0049) void DoEarseFlash(void)
(0050) {
A0F7 A6 02 ldA #2
A0F9 C7 FE08 stA 0xFE08
(0051) unsigned char i;
(0052) FLCR=0b00000010; //①1->ERASE,0->MASS(页擦除)
(0053) i=FLBPR; //②读FLBPR
A0FC C6 FF7E ldA 0xFF7E
A0FF F7 stA 0,X
(0054) //③任意数->faddr,选中flash页
(0055) *((volatile unsigned char *)faddr)=68;
A100 C6 0047 ldA _faddr+1
A103 B7 41 stA *__r1
A105 C6 0046 ldA _faddr
A108 B7 40 stA *__r0
A10A A6 44 ldA #68
A10C 55 40 ldHX *__r0
A10E F7 stA 0,X
A10F 95 tSX
(0056) asm ("bsr _delay1"); //④延时10us
A110 AD 17 bsr 0xA129
(0057) FLCR=0b00001010; //⑤1->HVEN (加高压)
A112 A6 0A ldA #10
A114 C7 FE08 stA 0xFE08
(0058) asm ("bsr _delay1"); //延时时间必须>1.6ms
A117 AD 10 bsr 0xA129
(0059) FLCR=0b00001000; //⑦0->Erase
A119 A6 08 ldA #8
A11B C7 FE08 stA 0xFE08
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -