📄 flash.lis
字号:
0085 ; asm("ldhx #_WriteFlash_END");//写入程序的末地址->HX
0085 450128 ldhx #_WriteFlash_END
0088 .dbline 82
0088 ; asm("sthx _pend"); //HX->内存变量pend
0088 3502 sthx _pend
008A .dbline 84
008A ; //将写入程序从Flash区拷贝到RAM区PrgOfRam
008A ; memcpy((void *)PrgOfRam,(void *)pbase,pend-pbase);
008A B603 lda *_pend+1
008C B005 sub *_pbase+1
008E B700 sta *__r1
0090 B602 lda *_pend
0092 B204 sbc *_pbase
0094 B700 sta *__r0
0096 B600 lda *__r1
0098 87 psha
0099 B600 lda *__r0
009B 87 psha
009C B605 lda *_pbase+1
009E 87 psha
009F B604 lda *_pbase
00A1 87 psha
00A2 A60F lda #<_PrgOfRam
00A4 87 psha
00A5 A60F lda #>_PrgOfRam
00A7 87 psha
00A8 CD0000 jsr _memcpy
00AB A706 ais #6
00AD 95 tsx
00AE .dbline 86
00AE ; //在RAM区执行写入程序
00AE ; asm("LDHX #_PrgOfRam"); //写入程序在RAM的首地址
00AE 45000F LDHX #_PrgOfRam
00B1 .dbline 87
00B1 ; asm("jsr ,X"); //执行RAM区的写入程序
00B1 FD jsr ,X
00B2 .dbline -2
00B2 L9:
00B2 .dbline 0 ; func end
00B2 81 rts
00B3 .dbsym l addr 2 i
00B3 .dbend
00B3 .dbfunc e DoWriteFlash _DoWriteFlash fV
00B3 ; i -> 0,X
00B3 ; j -> 1,X
00B3 _DoWriteFlash::
00B3 .dbline -1
00B3 A7FE ais #-2
00B5 95 tsx
00B6 .dbline 97
00B6 ; }
00B6 ; /*DoWriteFlash:实际执行的写入函数----------------------*
00B6 ; *功 能:调入内存执行擦除指定flash地址的数据 *
00B6 ; *参 数:无 *
00B6 ; *返 回:无 *
00B6 ; *内部调用:延时函数delay2(用嵌入汇编调用) *
00B6 ; *-----------------------------------------------------*/
00B6 ; void delay2(void);
00B6 ; void DoWriteFlash(void)
00B6 ; {
00B6 .dbline 100
00B6 ; unsigned char i;
00B6 ; unsigned char j;
00B6 ; FLCR=0b00000001; //①1->PGM
00B6 A601 lda #1
00B8 C7FE08 sta 0xfe08
00BB .dbline 101
00BB ; i=FLBPR; //②读FLBPR
00BB C6FF7E lda 0xff7e
00BE F7 sta ,X
00BF .dbline 103
00BF ; //③任意数->faddr,选中flash行
00BF ; *((volatile unsigned char *)faddr)=56;
00BF A638 lda #56
00C1 5500 ldhx *_faddr
00C3 F7 sta ,x
00C4 95 tsx
00C5 .dbline 104
00C5 ; asm ("bsr _delay2"); //④延时10us
00C5 AD52 bsr _delay2
00C7 .dbline 105
00C7 ; FLCR=0b00001001; //⑤1->HVEN
00C7 A609 lda #9
00C9 C7FE08 sta 0xfe08
00CC .dbline 106
00CC ; asm ("bsr _delay2"); //⑥延时10us
00CC AD4B bsr _delay2
00CE .dbline 108
00CE ; //⑦将数据写入相应的flash地址
00CE ; for(i=0;i<N;i++)
00CE 7F clr ,X
00CF 2033 bra L14
00D1 L11:
00D1 .dbline 109
00D1 ; { //数据送入flash地址
00D1 .dbline 110
00D1 ; *((volatile unsigned char *)faddr+i)=FlashData[i];
00D1 3F00 clr *__r0
00D3 F6 lda ,X
00D4 AB06 add #<_FlashData
00D6 B700 sta *__r1
00D8 B600 lda *__r0
00DA A906 adc #>_FlashData
00DC B700 sta *__r0
00DE 5500 ldhx *__r0
00E0 F6 lda ,x
00E1 95 tsx
00E2 B700 sta *__r1
00E4 3F00 clr *__r2
00E6 F6 lda ,X
00E7 BB01 add *_faddr+1
00E9 B700 sta *__r3
00EB B600 lda *__r2
00ED B900 adc *_faddr
00EF B700 sta *__r2
00F1 B600 lda *__r1
00F3 5500 ldhx *__r2
00F5 F7 sta ,x
00F6 95 tsx
00F7 .dbline 111
00F7 6F01 clr 1,X
00F9 2002 bra L18
00FB L15:
00FB .dbline 111
00FB L16:
00FB .dbline 111
00FB 6C01 inc 1,X
00FD L18:
00FD .dbline 111
00FD E601 lda 1,X
00FF A106 cmp #6
0101 25F8 blo L15
0103 .dbline 112
0103 L12:
0103 .dbline 108
0103 7C inc ,X
0104 L14:
0104 .dbline 108
0104 F6 lda ,X
0105 B10E cmp *_N
0107 25C8 blo L11
0109 .dbline 113
0109 ; for (j=0;j<6;j++); //⑧延时30us,不能调用延时程序
0109 ; }
0109 ; FLCR=0b00001000; //⑨0->PGM
0109 A608 lda #8
010B C7FE08 sta 0xfe08
010E .dbline 114
010E ; asm ("bsr _delay2"); //⑩延时10us
010E AD09 bsr _delay2
0110 .dbline 115
0110 ; FLCR=0b00000000; //⑾0->HVEN
0110 4F clra
0111 C7FE08 sta 0xfe08
0114 .dbline 116
0114 ; asm ("bsr _delay2"); //⑿延时6us
0114 AD03 bsr _delay2
0116 .dbline -2
0116 L10:
0116 A702 ais #2
0118 .dbline 0 ; func end
0118 81 rts
0119 .dbsym l i 0 c
0119 .dbsym l j 1 c
0119 .dbend
0119 .dbfunc e delay2 _delay2 fV
0119 ; j -> 0,X
0119 _delay2::
0119 .dbline -1
0119 A7FF ais #-1
011B 95 tsx
011C .dbline 119
011C ; }
011C ; void delay2(void) //延时一定时间
011C ; { unsigned char j;
011C .dbline 120
011C 7F clr ,X
011D 2001 bra L23
011F L20:
011F .dbline 120
011F L21:
011F .dbline 120
011F 7C inc ,X
0120 L23:
0120 .dbline 120
0120 ; for (j=0;j<1;j++); }
0120 F6 lda ,X
0121 A101 cmp #1
0123 25FA blo L20
0125 .dbline -2
0125 L19:
0125 A701 ais #1
0127 .dbline 0 ; func end
0127 81 rts
0128 .dbsym l j 0 c
0128 .dbend
0128 .dbfunc e WriteFlash_END _WriteFlash_END fV
0128 _WriteFlash_END::
0128 .dbline -1
0128 .dbline 122
0128 ; void WriteFlash_END(void) //写入程序的末地址
0128 ; { }
0128 .dbline -2
0128 L24:
0128 .dbline 0 ; func end
0128 81 rts
0129 .dbend
.area bss
0000 .dbfile Flash.c
0000 _faddr::
0000 .blkb 2
0002 .dbsym e faddr _faddr i
0002 _pend::
0002 .blkb 2
0004 .dbsym e pend _pend i
0004 _pbase::
0004 .blkb 2
0006 .dbsym e pbase _pbase i
0006 _FlashData::
0006 .blkb 8
000E .dbsym e FlashData _FlashData A[8:8]c
000E _N::
000E .blkb 1
000F .dbsym e N _N c
000F _PrgOfRam::
000F .blkb 1
0010 .dbsym e PrgOfRam _PrgOfRam A[1:1]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -