📄 flash.lis
字号:
.module Flash.c
.area text
0000 .dbfile Flash.c
0000 .dbfunc e EraseFlash _EraseFlash fV
0000 ; addr -> 2,X
0000 _EraseFlash::
0000 .dbline -1
0000 95 tsx
0001 .dbline 31
0001 ; /*文件描述:本文件包含的子程序为 *
0001 ; * 1.void EarseFlash(unsigned int addr) *
0001 ; * Flash擦除子程序 *
0001 ; * 2.void WriteFlash(unsigned int addr) *
0001 ; * Flash写入子程序 *
0001 ; *说 明: *
0001 ; * 1.用来暂存写入或擦除程序的首末地址的变量pbase, *
0001 ; * pend;用来暂存待写入或擦除的Flash首地址faddr; *
0001 ; * 用来存放写入的数据个数N和写入的数据FlashData[]必须 *
0001 ; * 在main函数中定义,否则将出错 *
0001 ; * 2.调用擦/写子程序之前先将待擦/写页的后一页开始的 *
0001 ; * 所有区域写保护 *
0001 ; *-------------《嵌入式应用技术基础教程》--------------*/
0001 ; //[包含头文件]
0001 ; #include "GP32C.h"
0001 ; #include <String.h>
0001 ; //外部内存变量声明
0001 ; unsigned char PrgOfRam[]; //存放擦/写FLASH程序以便执行
0001 ; extern unsigned char N,FlashData[];
0001 ; extern unsigned int pbase,pend,faddr;
0001 ;
0001 ; //内部调用函数声明
0001 ; void DoEarseFlash(void);
0001 ; void DoWriteFlash(void);
0001 ; /*EarseFlash:擦除指定flash的一页-----------------------*
0001 ; *功 能:擦除以addr为首地址的flash一页 *
0001 ; *参 数:addr要擦除的首地址 *
0001 ; *返 回:无 *
0001 ; *-----------------------------------------------------*/
0001 ; void EraseFlash(unsigned int addr)
0001 ; {
0001 .dbline 32
0001 ; faddr=addr; //擦除flash的首地址
0001 E602 lda 2,X
0003 C70000 sta _faddr
0006 E603 lda 3,X
0008 C70001 sta _faddr+1
000B .dbline 34
000B ; //将擦除程序从Flash区拷贝到RAM区PrgOfRam
000B ; asm("ldhx #_DoEarseFlash"); //擦除程序的首地址->HX
000B 450044 ldhx #_DoEarseFlash
000E .dbline 35
000E ; asm("sthx _pbase"); //HX->内存变量pbase
000E 3500 sthx _pbase
0010 .dbline 36
0010 ; asm("ldhx #_EarseFlash_END"); //擦除程序的末地址->HX
0010 450088 ldhx #_EarseFlash_END
0013 .dbline 37
0013 ; asm("sthx _pend"); //HX->内存变量pend
0013 3500 sthx _pend
0015 .dbline 38
0015 ; memcpy((void *)PrgOfRam,(void *)pbase,pend-pbase);
0015 C60001 lda _pend+1
0018 C00001 sub _pbase+1
001B B700 sta *__r1
001D C60000 lda _pend
0020 C20000 sbc _pbase
0023 B700 sta *__r0
0025 B600 lda *__r1
0027 87 psha
0028 B600 lda *__r0
002A 87 psha
002B C60001 lda _pbase+1
002E 87 psha
002F C60000 lda _pbase
0032 87 psha
0033 A600 lda #<_PrgOfRam
0035 87 psha
0036 A600 lda #>_PrgOfRam
0038 87 psha
0039 CD0000 jsr _memcpy
003C A706 ais #6
003E 95 tsx
003F .dbline 40
003F ; //在RAM区执行擦除程序
003F ; asm("ldhx #_PrgOfRam"); //擦除程序在RAM区的首地址
003F 450000 ldhx #_PrgOfRam
0042 .dbline 41
0042 ; asm("jsr ,X"); //执行RAM区域的擦除程序
0042 FD jsr ,X
0043 .dbline -2
0043 L1:
0043 .dbline 0 ; func end
0043 81 rts
0044 .dbsym l addr 2 i
0044 .dbend
0044 .dbfunc e DoEarseFlash _DoEarseFlash fV
0044 ; i -> 0,X
0044 _DoEarseFlash::
0044 .dbline -1
0044 A7FF ais #-1
0046 95 tsx
0047 .dbline 51
0047 ; }
0047 ; /*DoEarseFlash:擦除指定flash区-------------------------*
0047 ; *功 能: 真正执行擦除addr指向的flash区的操作 *
0047 ; *参 数:无 *
0047 ; *返 回:无 *
0047 ; *内部调用:延时函数delay1 (用嵌入汇编调用) *
0047 ; *-----------------------------------------------------*/
0047 ; void delay1(void);
0047 ; void DoEarseFlash(void)
0047 ; {
0047 .dbline 53
0047 ; unsigned char i;
0047 ; FLCR=0b00000010; //①1->ERASE,0->MASS(页擦除)
0047 A602 lda #2
0049 C7FE08 sta 0xfe08
004C .dbline 54
004C ; i=FLBPR; //②读FLBPR
004C C6FF7E lda 0xff7e
004F F7 sta ,X
0050 .dbline 56
0050 ; //③任意数->faddr,选中flash页
0050 ; *((volatile unsigned char *)faddr)=68;
0050 C60001 lda _faddr+1
0053 B700 sta *__r1
0055 C60000 lda _faddr
0058 B700 sta *__r0
005A A644 lda #68
005C 5500 ldhx *__r0
005E F7 sta ,x
005F 95 tsx
0060 .dbline 57
0060 ; asm ("bsr _delay1"); //④延时10us
0060 AD17 bsr _delay1
0062 .dbline 58
0062 ; FLCR=0b00001010; //⑤1->HVEN (加高压)
0062 A60A lda #10
0064 C7FE08 sta 0xfe08
0067 .dbline 59
0067 ; asm ("bsr _delay1"); //延时时间必须>1.6ms
0067 AD10 bsr _delay1
0069 .dbline 60
0069 ; FLCR=0b00001000; //⑦0->Erase
0069 A608 lda #8
006B C7FE08 sta 0xfe08
006E .dbline 61
006E ; asm ("bsr _delay1"); //⑧10us
006E AD09 bsr _delay1
0070 .dbline 62
0070 ; FLCR=0b00000000; //⑨0->HVEN(取消高压)
0070 4F clra
0071 C7FE08 sta 0xfe08
0074 .dbline 63
0074 ; asm ("bsr _delay1"); //⑩延时10us
0074 AD03 bsr _delay1
0076 .dbline -2
0076 L2:
0076 A701 ais #1
0078 .dbline 0 ; func end
0078 81 rts
0079 .dbsym l i 0 c
0079 .dbend
0079 .dbfunc e delay1 _delay1 fV
0079 ; j -> 0,X
0079 _delay1::
0079 .dbline -1
0079 A7FF ais #-1
007B 95 tsx
007C .dbline 66
007C ; }
007C ; void delay1(void) //延时一定时间,供上述程序调用
007C ; { unsigned char j;
007C .dbline 67
007C 7F clr ,X
007D 2001 bra L7
007F L4:
007F .dbline 67
007F L5:
007F .dbline 67
007F 7C inc ,X
0080 L7:
0080 .dbline 67
0080 ; for (j=0;j<1;j++); }
0080 F6 lda ,X
0081 A101 cmp #1
0083 25FA blo L4
0085 .dbline -2
0085 L3:
0085 A701 ais #1
0087 .dbline 0 ; func end
0087 81 rts
0088 .dbsym l j 0 c
0088 .dbend
0088 .dbfunc e EarseFlash_END _EarseFlash_END fV
0088 _EarseFlash_END::
0088 .dbline -1
0088 .dbline 69
0088 ; void EarseFlash_END(void) //擦除程序的末地址
0088 ; { }
0088 .dbline -2
0088 L8:
0088 .dbline 0 ; func end
0088 81 rts
0089 .dbend
0089 .dbfunc e WriteFlash _WriteFlash fV
0089 ; addr -> 2,X
0089 _WriteFlash::
0089 .dbline -1
0089 95 tsx
008A .dbline 76
008A ; /*WriteFlash:向addr指向的flash区写入数据---------------*
008A ; *功 能:向指定flash地址写入数据 *
008A ; *参 数:addr要写入的首址 *
008A ; *返 回:无 *
008A ; *-----------------------------------------------------*/
008A ; void WriteFlash(unsigned int addr)
008A ; {
008A .dbline 77
008A ; faddr=addr; //写入flash的首地址
008A E602 lda 2,X
008C C70000 sta _faddr
008F E603 lda 3,X
0091 C70001 sta _faddr+1
0094 .dbline 79
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -