📄 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 ; unsigned char N,FlashData[8];
0001 ; 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 B700 sta *_faddr
0005 E603 lda 3,X
0007 B701 sta *_faddr+1
0009 .dbline 34
0009 ; //将擦除程序从Flash区拷贝到RAM区PrgOfRam
0009 ; asm("ldhx #_DoEarseFlash"); //擦除程序的首地址->HX
0009 45003C ldhx #_DoEarseFlash
000C .dbline 35
000C ; asm("sthx _pbase"); //HX->内存变量pbase
000C 3504 sthx _pbase
000E .dbline 36
000E ; asm("ldhx #_EarseFlash_END"); //擦除程序的末地址->HX
000E 450076 ldhx #_EarseFlash_END
0011 .dbline 37
0011 ; asm("sthx _pend"); //HX->内存变量pend
0011 3502 sthx _pend
0013 .dbline 38
0013 ; memcpy((void *)PrgOfRam,(void *)pbase,pend-pbase);
0013 B603 lda *_pend+1
0015 B005 sub *_pbase+1
0017 B700 sta *__r1
0019 B602 lda *_pend
001B B204 sbc *_pbase
001D B700 sta *__r0
001F B600 lda *__r1
0021 87 psha
0022 B600 lda *__r0
0024 87 psha
0025 B605 lda *_pbase+1
0027 87 psha
0028 B604 lda *_pbase
002A 87 psha
002B A60F lda #<_PrgOfRam
002D 87 psha
002E A60F lda #>_PrgOfRam
0030 87 psha
0031 CD0000 jsr _memcpy
0034 A706 ais #6
0036 95 tsx
0037 .dbline 40
0037 ; //在RAM区执行擦除程序
0037 ; asm("ldhx #_PrgOfRam"); //擦除程序在RAM区的首地址
0037 45000F ldhx #_PrgOfRam
003A .dbline 41
003A ; asm("jsr ,X"); //执行RAM区域的擦除程序
003A FD jsr ,X
003B .dbline -2
003B L1:
003B .dbline 0 ; func end
003B 81 rts
003C .dbsym l addr 2 i
003C .dbend
003C .dbfunc e DoEarseFlash _DoEarseFlash fV
003C ; i -> 0,X
003C _DoEarseFlash::
003C .dbline -1
003C A7FF ais #-1
003E 95 tsx
003F .dbline 51
003F ; }
003F ; /*DoEarseFlash:擦除指定flash区-------------------------*
003F ; *功 能: 真正执行擦除addr指向的flash区的操作 *
003F ; *参 数:无 *
003F ; *返 回:无 *
003F ; *内部调用:延时函数delay1 (用嵌入汇编调用) *
003F ; *-----------------------------------------------------*/
003F ; void delay1(void);
003F ; void DoEarseFlash(void)
003F ; {
003F .dbline 53
003F ; unsigned char i;
003F ; FLCR=0b00000010; //①1->ERASE,0->MASS(页擦除)
003F A602 lda #2
0041 C7FE08 sta 0xfe08
0044 .dbline 54
0044 ; i=FLBPR; //②读FLBPR
0044 C6FF7E lda 0xff7e
0047 F7 sta ,X
0048 .dbline 56
0048 ; //③任意数->faddr,选中flash页
0048 ; *((volatile unsigned char *)faddr)=68;
0048 A644 lda #68
004A 5500 ldhx *_faddr
004C F7 sta ,x
004D 95 tsx
004E .dbline 57
004E ; asm ("bsr _delay1"); //④延时10us
004E AD17 bsr _delay1
0050 .dbline 58
0050 ; FLCR=0b00001010; //⑤1->HVEN (加高压)
0050 A60A lda #10
0052 C7FE08 sta 0xfe08
0055 .dbline 59
0055 ; asm ("bsr _delay1"); //延时时间必须>1.6ms
0055 AD10 bsr _delay1
0057 .dbline 60
0057 ; FLCR=0b00001000; //⑦0->Erase
0057 A608 lda #8
0059 C7FE08 sta 0xfe08
005C .dbline 61
005C ; asm ("bsr _delay1"); //⑧10us
005C AD09 bsr _delay1
005E .dbline 62
005E ; FLCR=0b00000000; //⑨0->HVEN(取消高压)
005E 4F clra
005F C7FE08 sta 0xfe08
0062 .dbline 63
0062 ; asm ("bsr _delay1"); //⑩延时10us
0062 AD03 bsr _delay1
0064 .dbline -2
0064 L2:
0064 A701 ais #1
0066 .dbline 0 ; func end
0066 81 rts
0067 .dbsym l i 0 c
0067 .dbend
0067 .dbfunc e delay1 _delay1 fV
0067 ; j -> 0,X
0067 _delay1::
0067 .dbline -1
0067 A7FF ais #-1
0069 95 tsx
006A .dbline 66
006A ; }
006A ; void delay1(void) //延时一定时间,供上述程序调用
006A ; { unsigned char j;
006A .dbline 67
006A 7F clr ,X
006B 2001 bra L7
006D L4:
006D .dbline 67
006D L5:
006D .dbline 67
006D 7C inc ,X
006E L7:
006E .dbline 67
006E ; for (j=0;j<1;j++); }
006E F6 lda ,X
006F A101 cmp #1
0071 25FA blo L4
0073 .dbline -2
0073 L3:
0073 A701 ais #1
0075 .dbline 0 ; func end
0075 81 rts
0076 .dbsym l j 0 c
0076 .dbend
0076 .dbfunc e EarseFlash_END _EarseFlash_END fV
0076 _EarseFlash_END::
0076 .dbline -1
0076 .dbline 69
0076 ; void EarseFlash_END(void) //擦除程序的末地址
0076 ; { }
0076 .dbline -2
0076 L8:
0076 .dbline 0 ; func end
0076 81 rts
0077 .dbend
0077 .dbfunc e WriteFlash _WriteFlash fV
0077 ; addr -> 2,X
0077 _WriteFlash::
0077 .dbline -1
0077 95 tsx
0078 .dbline 76
0078 ; /*WriteFlash:向addr指向的flash区写入数据---------------*
0078 ; *功 能:向指定flash地址写入数据 *
0078 ; *参 数:addr要写入的首址 *
0078 ; *返 回:无 *
0078 ; *-----------------------------------------------------*/
0078 ; void WriteFlash(unsigned int addr)
0078 ; {
0078 .dbline 77
0078 ; faddr=addr; //写入flash的首地址
0078 E602 lda 2,X
007A B700 sta *_faddr
007C E603 lda 3,X
007E B701 sta *_faddr+1
0080 .dbline 79
0080 ; //将写入程序从Flash区拷贝到RAM区PrgOfRam
0080 ; asm("ldhx #_DoWriteFlash"); //写入程序的首地址->HX
0080 4500B3 ldhx #_DoWriteFlash
0083 .dbline 80
0083 ; asm("sthx _pbase"); //HX->内存变量pbase
0083 3504 sthx _pbase
0085 .dbline 81
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -