📄 flash.lis
字号:
0094 ; //将写入程序从Flash区拷贝到RAM区PrgOfRam
0094 ; asm("ldhx #_DoWriteFlash"); //写入程序的首地址->HX
0094 4500CD ldhx #_DoWriteFlash
0097 .dbline 80
0097 ; asm("sthx _pbase"); //HX->内存变量pbase
0097 3500 sthx _pbase
0099 .dbline 81
0099 ; asm("ldhx #_WriteFlash_END");//写入程序的末地址->HX
0099 45014F ldhx #_WriteFlash_END
009C .dbline 82
009C ; asm("sthx _pend"); //HX->内存变量pend
009C 3500 sthx _pend
009E .dbline 84
009E ; //将写入程序从Flash区拷贝到RAM区PrgOfRam
009E ; memcpy((void *)PrgOfRam,(void *)pbase,pend-pbase);
009E C60001 lda _pend+1
00A1 C00001 sub _pbase+1
00A4 B700 sta *__r1
00A6 C60000 lda _pend
00A9 C20000 sbc _pbase
00AC B700 sta *__r0
00AE B600 lda *__r1
00B0 87 psha
00B1 B600 lda *__r0
00B3 87 psha
00B4 C60001 lda _pbase+1
00B7 87 psha
00B8 C60000 lda _pbase
00BB 87 psha
00BC A600 lda #<_PrgOfRam
00BE 87 psha
00BF A600 lda #>_PrgOfRam
00C1 87 psha
00C2 CD0000 jsr _memcpy
00C5 A706 ais #6
00C7 95 tsx
00C8 .dbline 86
00C8 ; //在RAM区执行写入程序
00C8 ; asm("LDHX #_PrgOfRam"); //写入程序在RAM的首地址
00C8 450000 LDHX #_PrgOfRam
00CB .dbline 87
00CB ; asm("jsr ,X"); //执行RAM区的写入程序
00CB FD jsr ,X
00CC .dbline -2
00CC L9:
00CC .dbline 0 ; func end
00CC 81 rts
00CD .dbsym l addr 2 i
00CD .dbend
00CD .dbfunc e DoWriteFlash _DoWriteFlash fV
00CD ; i -> 0,X
00CD ; j -> 1,X
00CD _DoWriteFlash::
00CD .dbline -1
00CD A7FE ais #-2
00CF 95 tsx
00D0 .dbline 97
00D0 ; }
00D0 ; /*DoWriteFlash:实际执行的写入函数----------------------*
00D0 ; *功 能:调入内存执行擦除指定flash地址的数据 *
00D0 ; *参 数:无 *
00D0 ; *返 回:无 *
00D0 ; *内部调用:延时函数delay2(用嵌入汇编调用) *
00D0 ; *-----------------------------------------------------*/
00D0 ; void delay2(void);
00D0 ; void DoWriteFlash(void)
00D0 ; {
00D0 .dbline 100
00D0 ; unsigned char i;
00D0 ; unsigned char j;
00D0 ; FLCR=0b00000001; //①1->PGM
00D0 A601 lda #1
00D2 C7FE08 sta 0xfe08
00D5 .dbline 101
00D5 ; i=FLBPR; //②读FLBPR
00D5 C6FF7E lda 0xff7e
00D8 F7 sta ,X
00D9 .dbline 103
00D9 ; //③任意数->faddr,选中flash行
00D9 ; *((volatile unsigned char *)faddr)=56;
00D9 C60001 lda _faddr+1
00DC B700 sta *__r1
00DE C60000 lda _faddr
00E1 B700 sta *__r0
00E3 A638 lda #56
00E5 5500 ldhx *__r0
00E7 F7 sta ,x
00E8 95 tsx
00E9 .dbline 104
00E9 ; asm ("bsr _delay2"); //④延时10us
00E9 AD55 bsr _delay2
00EB .dbline 105
00EB ; FLCR=0b00001001; //⑤1->HVEN
00EB A609 lda #9
00ED C7FE08 sta 0xfe08
00F0 .dbline 106
00F0 ; asm ("bsr _delay2"); //⑥延时10us
00F0 AD4E bsr _delay2
00F2 .dbline 108
00F2 ; //⑦将数据写入相应的flash地址
00F2 ; for(i=0;i<N;i++)
00F2 7F clr ,X
00F3 2035 bra L14
00F5 L11:
00F5 .dbline 109
00F5 ; { //数据送入flash地址
00F5 .dbline 110
00F5 ; *((volatile unsigned char *)faddr+i)=FlashData[i];
00F5 3F00 clr *__r0
00F7 F6 lda ,X
00F8 AB00 add #<_FlashData
00FA B700 sta *__r1
00FC B600 lda *__r0
00FE A900 adc #>_FlashData
0100 B700 sta *__r0
0102 5500 ldhx *__r0
0104 F6 lda ,x
0105 95 tsx
0106 B700 sta *__r1
0108 3F00 clr *__r2
010A F6 lda ,X
010B CB0001 add _faddr+1
010E B700 sta *__r3
0110 B600 lda *__r2
0112 C90000 adc _faddr
0115 B700 sta *__r2
0117 B600 lda *__r1
0119 5500 ldhx *__r2
011B F7 sta ,x
011C 95 tsx
011D .dbline 111
011D 6F01 clr 1,X
011F 2002 bra L18
0121 L15:
0121 .dbline 111
0121 L16:
0121 .dbline 111
0121 6C01 inc 1,X
0123 L18:
0123 .dbline 111
0123 E601 lda 1,X
0125 A106 cmp #6
0127 25F8 blo L15
0129 .dbline 112
0129 L12:
0129 .dbline 108
0129 7C inc ,X
012A L14:
012A .dbline 108
012A F6 lda ,X
012B C10000 cmp _N
012E 25C5 blo L11
0130 .dbline 113
0130 ; for (j=0;j<6;j++); //⑧延时30us,不能调用延时程序
0130 ; }
0130 ; FLCR=0b00001000; //⑨0->PGM
0130 A608 lda #8
0132 C7FE08 sta 0xfe08
0135 .dbline 114
0135 ; asm ("bsr _delay2"); //⑩延时10us
0135 AD09 bsr _delay2
0137 .dbline 115
0137 ; FLCR=0b00000000; //⑾0->HVEN
0137 4F clra
0138 C7FE08 sta 0xfe08
013B .dbline 116
013B ; asm ("bsr _delay2"); //⑿延时6us
013B AD03 bsr _delay2
013D .dbline -2
013D L10:
013D A702 ais #2
013F .dbline 0 ; func end
013F 81 rts
0140 .dbsym l i 0 c
0140 .dbsym l j 1 c
0140 .dbend
0140 .dbfunc e delay2 _delay2 fV
0140 ; j -> 0,X
0140 _delay2::
0140 .dbline -1
0140 A7FF ais #-1
0142 95 tsx
0143 .dbline 119
0143 ; }
0143 ; void delay2(void) //延时一定时间
0143 ; { unsigned char j;
0143 .dbline 120
0143 7F clr ,X
0144 2001 bra L23
0146 L20:
0146 .dbline 120
0146 L21:
0146 .dbline 120
0146 7C inc ,X
0147 L23:
0147 .dbline 120
0147 ; for (j=0;j<1;j++); }
0147 F6 lda ,X
0148 A101 cmp #1
014A 25FA blo L20
014C .dbline -2
014C L19:
014C A701 ais #1
014E .dbline 0 ; func end
014E 81 rts
014F .dbsym l j 0 c
014F .dbend
014F .dbfunc e WriteFlash_END _WriteFlash_END fV
014F _WriteFlash_END::
014F .dbline -1
014F .dbline 122
014F ; void WriteFlash_END(void) //写入程序的末地址
014F ; { }
014F .dbline -2
014F L24:
014F .dbline 0 ; func end
014F 81 rts
0150 .dbend
.area bss
0000 .dbfile Flash.c
0000 _PrgOfRam::
0000 .blkb 1
0001 .dbsym e PrgOfRam _PrgOfRam A[1:1]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -