⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash.s

📁 项目是为日本瑞萨工作所做的BAKE炉温控系统 整个文件夹包括设计文档
💻 S
字号:
	.module Flash.c
	.area text
	.dbfile Flash.c
	.dbfunc e EraseFlash _EraseFlash fV
;           addr -> 2,X
_EraseFlash::
	.dbline -1
	tsx
	.dbline 31
; /*文件描述:本文件包含的子程序为                       *
; *  1.void EarseFlash(unsigned int addr)               *
; *    Flash擦除子程序                                  *
; *  2.void WriteFlash(unsigned int addr)               *
; *    Flash写入子程序                                  *
; *说  明:                                              *
; *  1.用来暂存写入或擦除程序的首末地址的变量pbase,     *
; *    pend;用来暂存待写入或擦除的Flash首地址faddr;     *
; *    用来存放写入的数据个数N和写入的数据FlashData[]必须    *
; *    在main函数中定义,否则将出错                      *
; *  2.调用擦/写子程序之前先将待擦/写页的后一页开始的   *
; *       所有区域写保护                                *
; *-------------《嵌入式应用技术基础教程》--------------*/
; //[包含头文件]
; #include "GP32C.h"
; #include <String.h>
; //外部内存变量声明
; unsigned char PrgOfRam[]; //存放擦/写FLASH程序以便执行
; extern unsigned char N,FlashData[]; 
; extern unsigned int pbase,pend,faddr;
; 
; //内部调用函数声明
; void DoEarseFlash(void); 
; void DoWriteFlash(void);
; /*EarseFlash:擦除指定flash的一页-----------------------*
; *功  能:擦除以addr为首地址的flash一页                  *
; *参  数:addr要擦除的首地址                             *
; *返  回:无                                             *
; *-----------------------------------------------------*/
; void EraseFlash(unsigned int addr)
;   { 
	.dbline 32
;     faddr=addr;                   //擦除flash的首地址
	lda 2,X
	sta _faddr
	lda 3,X
	sta _faddr+1
	.dbline 34
;     //将擦除程序从Flash区拷贝到RAM区PrgOfRam
;     asm("ldhx #_DoEarseFlash");   //擦除程序的首地址->HX
	ldhx #_DoEarseFlash
	.dbline 35
;     asm("sthx _pbase");           //HX->内存变量pbase
	sthx _pbase
	.dbline 36
;     asm("ldhx #_EarseFlash_END"); //擦除程序的末地址->HX
	ldhx #_EarseFlash_END
	.dbline 37
;     asm("sthx _pend");            //HX->内存变量pend 
	sthx _pend
	.dbline 38
;     memcpy((void *)PrgOfRam,(void *)pbase,pend-pbase);  
	lda _pend+1
	sub _pbase+1
	sta *__r1
	lda _pend
	sbc _pbase
	sta *__r0
	lda *__r1
	psha
	lda *__r0
	psha
	lda _pbase+1
	psha
	lda _pbase
	psha
	lda #<_PrgOfRam
	psha
	lda #>_PrgOfRam
	psha
	jsr _memcpy
	ais #6
	tsx
	.dbline 40
;     //在RAM区执行擦除程序
;     asm("ldhx #_PrgOfRam");	    //擦除程序在RAM区的首地址
	ldhx #_PrgOfRam
	.dbline 41
;     asm("jsr ,X");		        //执行RAM区域的擦除程序
	jsr ,X
	.dbline -2
L1:
	.dbline 0 ; func end
	rts
	.dbsym l addr 2 i
	.dbend
	.dbfunc e DoEarseFlash _DoEarseFlash fV
;              i -> 0,X
_DoEarseFlash::
	.dbline -1
	ais #-1
	tsx
	.dbline 51
;   }
; /*DoEarseFlash:擦除指定flash区-------------------------*
; *功  能: 真正执行擦除addr指向的flash区的操作           *
; *参  数:无                                             *
; *返  回:无                                             *
; *内部调用:延时函数delay1 (用嵌入汇编调用)              *
; *-----------------------------------------------------*/
; void delay1(void);
; void DoEarseFlash(void)
;   {
	.dbline 53
;     unsigned char i;    
;     FLCR=0b00000010;  	     //①1->ERASE,0->MASS(页擦除)
	lda #2
	sta 0xfe08
	.dbline 54
; 	  i=FLBPR;               //②读FLBPR	
	lda 0xff7e
	sta ,X
	.dbline 56
; 	                         //③任意数->faddr,选中flash页
;     *((volatile unsigned char *)faddr)=68;
	lda _faddr+1
	sta *__r1
	lda _faddr
	sta *__r0
	lda #68
	ldhx *__r0
	sta ,x
	tsx
	.dbline 57
;     asm ("bsr _delay1");     //④延时10us
	bsr _delay1
	.dbline 58
;     FLCR=0b00001010;         //⑤1->HVEN (加高压)
	lda #10
	sta 0xfe08
	.dbline 59
;     asm ("bsr _delay1");     //延时时间必须>1.6ms
	bsr _delay1
	.dbline 60
;     FLCR=0b00001000;	     //⑦0->Erase
	lda #8
	sta 0xfe08
	.dbline 61
;     asm ("bsr _delay1");     //⑧10us
	bsr _delay1
	.dbline 62
;     FLCR=0b00000000;	     //⑨0->HVEN(取消高压)
	clra
	sta 0xfe08
	.dbline 63
;     asm ("bsr _delay1");     //⑩延时10us
	bsr _delay1
	.dbline -2
L2:
	ais #1
	.dbline 0 ; func end
	rts
	.dbsym l i 0 c
	.dbend
	.dbfunc e delay1 _delay1 fV
;              j -> 0,X
_delay1::
	.dbline -1
	ais #-1
	tsx
	.dbline 66
;   }
; void delay1(void)       //延时一定时间,供上述程序调用
;     { unsigned  char j;
	.dbline 67
	clr ,X
	bra L7
L4:
	.dbline 67
L5:
	.dbline 67
	inc ,X
L7:
	.dbline 67
;       for (j=0;j<1;j++); }    
	lda ,X
	cmp #1
	blo L4
	.dbline -2
L3:
	ais #1
	.dbline 0 ; func end
	rts
	.dbsym l j 0 c
	.dbend
	.dbfunc e EarseFlash_END _EarseFlash_END fV
_EarseFlash_END::
	.dbline -1
	.dbline 69
; void EarseFlash_END(void)  //擦除程序的末地址
;   { }
	.dbline -2
L8:
	.dbline 0 ; func end
	rts
	.dbend
	.dbfunc e WriteFlash _WriteFlash fV
;           addr -> 2,X
_WriteFlash::
	.dbline -1
	tsx
	.dbline 76
; /*WriteFlash:向addr指向的flash区写入数据---------------*
; *功  能:向指定flash地址写入数据                        *
; *参  数:addr要写入的首址                               *
; *返  回:无                                             *
; *-----------------------------------------------------*/
; void WriteFlash(unsigned int addr)
;   {
	.dbline 77
;     faddr=addr;	                 //写入flash的首地址
	lda 2,X
	sta _faddr
	lda 3,X
	sta _faddr+1
	.dbline 79
;     //将写入程序从Flash区拷贝到RAM区PrgOfRam
;     asm("ldhx #_DoWriteFlash");  //写入程序的首地址->HX
	ldhx #_DoWriteFlash
	.dbline 80
;     asm("sthx _pbase");          //HX->内存变量pbase  
	sthx _pbase
	.dbline 81
;     asm("ldhx #_WriteFlash_END");//写入程序的末地址->HX 
	ldhx #_WriteFlash_END
	.dbline 82
;     asm("sthx _pend");           //HX->内存变量pend
	sthx _pend
	.dbline 84
;     //将写入程序从Flash区拷贝到RAM区PrgOfRam
;     memcpy((void *)PrgOfRam,(void *)pbase,pend-pbase);
	lda _pend+1
	sub _pbase+1
	sta *__r1
	lda _pend
	sbc _pbase
	sta *__r0
	lda *__r1
	psha
	lda *__r0
	psha
	lda _pbase+1
	psha
	lda _pbase
	psha
	lda #<_PrgOfRam
	psha
	lda #>_PrgOfRam
	psha
	jsr _memcpy
	ais #6
	tsx
	.dbline 86
;     //在RAM区执行写入程序
;     asm("LDHX #_PrgOfRam");    //写入程序在RAM的首地址 
	LDHX #_PrgOfRam
	.dbline 87
;     asm("jsr ,X");		           //执行RAM区的写入程序
	jsr ,X
	.dbline -2
L9:
	.dbline 0 ; func end
	rts
	.dbsym l addr 2 i
	.dbend
	.dbfunc e DoWriteFlash _DoWriteFlash fV
;              i -> 0,X
;              j -> 1,X
_DoWriteFlash::
	.dbline -1
	ais #-2
	tsx
	.dbline 97
;   }
; /*DoWriteFlash:实际执行的写入函数----------------------*
; *功  能:调入内存执行擦除指定flash地址的数据            *
; *参  数:无                                             *
; *返  回:无                                             *
; *内部调用:延时函数delay2(用嵌入汇编调用)               *
; *-----------------------------------------------------*/
; void delay2(void);
; void DoWriteFlash(void)
;   {
	.dbline 100
;     unsigned char i;
;     unsigned char j;    
;     FLCR=0b00000001;  	   //①1->PGM							 
	lda #1
	sta 0xfe08
	.dbline 101
;   	i=FLBPR;               //②读FLBPR 
	lda 0xff7e
	sta ,X
	.dbline 103
;   	                       //③任意数->faddr,选中flash行
;     *((volatile unsigned char *)faddr)=56; 
	lda _faddr+1
	sta *__r1
	lda _faddr
	sta *__r0
	lda #56
	ldhx *__r0
	sta ,x
	tsx
	.dbline 104
;     asm ("bsr _delay2");   //④延时10us
	bsr _delay2
	.dbline 105
;     FLCR=0b00001001;	     //⑤1->HVEN
	lda #9
	sta 0xfe08
	.dbline 106
;     asm ("bsr _delay2");   //⑥延时10us
	bsr _delay2
	.dbline 108
;     //⑦将数据写入相应的flash地址		 
;     for(i=0;i<N;i++)
	clr ,X
	bra L14
L11:
	.dbline 109
;       {		                 //数据送入flash地址
	.dbline 110
;   	   *((volatile unsigned char *)faddr+i)=FlashData[i];
	clr *__r0
	lda ,X
	add #<_FlashData
	sta *__r1
	lda *__r0
	adc #>_FlashData
	sta *__r0
	ldhx *__r0
	lda ,x
	tsx
	sta *__r1
	clr *__r2
	lda ,X
	add _faddr+1
	sta *__r3
	lda *__r2
	adc _faddr
	sta *__r2
	lda *__r1
	ldhx *__r2
	sta ,x
	tsx
	.dbline 111
	clr 1,X
	bra L18
L15:
	.dbline 111
L16:
	.dbline 111
	inc 1,X
L18:
	.dbline 111
	lda 1,X
	cmp #6
	blo L15
	.dbline 112
L12:
	.dbline 108
	inc ,X
L14:
	.dbline 108
	lda ,X
	cmp _N
	blo L11
	.dbline 113
;   	   for (j=0;j<6;j++); //⑧延时30us,不能调用延时程序
;   	  }   
;     FLCR=0b00001000;	     //⑨0->PGM  
	lda #8
	sta 0xfe08
	.dbline 114
;     asm ("bsr _delay2");   //⑩延时10us
	bsr _delay2
	.dbline 115
;     FLCR=0b00000000;	     //⑾0->HVEN  
	clra
	sta 0xfe08
	.dbline 116
;     asm ("bsr _delay2");   //⑿延时6us
	bsr _delay2
	.dbline -2
L10:
	ais #2
	.dbline 0 ; func end
	rts
	.dbsym l i 0 c
	.dbsym l j 1 c
	.dbend
	.dbfunc e delay2 _delay2 fV
;              j -> 0,X
_delay2::
	.dbline -1
	ais #-1
	tsx
	.dbline 119
;   }
; void delay2(void)  //延时一定时间
;     { unsigned  char j;
	.dbline 120
	clr ,X
	bra L23
L20:
	.dbline 120
L21:
	.dbline 120
	inc ,X
L23:
	.dbline 120
;       for (j=0;j<1;j++); }    
	lda ,X
	cmp #1
	blo L20
	.dbline -2
L19:
	ais #1
	.dbline 0 ; func end
	rts
	.dbsym l j 0 c
	.dbend
	.dbfunc e WriteFlash_END _WriteFlash_END fV
_WriteFlash_END::
	.dbline -1
	.dbline 122
; void WriteFlash_END(void)   //写入程序的末地址
;   { }
	.dbline -2
L24:
	.dbline 0 ; func end
	rts
	.dbend
	.area bss
	.dbfile Flash.c
_PrgOfRam::
	.blkb 1
	.dbsym e PrgOfRam _PrgOfRam A[1:1]c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -