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

📄 flash.lst

📁 hc08飞思卡尔单片机上实现flash转换
💻 LST
📖 第 1 页 / 共 3 页
字号:
__text_start:
__start:
    A000 45 0240      ldHX	#0x0240
    A003 94           tXS	
    A004 CD A200      jsr	__HC08Setup
    A007 45 0046      ldHX	#0x0046
    A00A 65 008E      cpHX	#0x008E
    A00D 27 06        beq	0xA015
    A00F 6F 00        clr	0,X
    A011 AF 01        aiX	#1
    A013 20 F5        bra	0xA00A
    A015 45 0047      ldHX	#0x0047
    A018 94           tXS	
    A019 45 A000      ldHX	#0xA000
    A01C 65 A000      cpHX	#0xA000
    A01F 27 0B        beq	0xA02C
    A021 E6 00        ldA	0,X
    A023 9EE7 00      stA	0,S
    A026 AF 01        aiX	#1
    A028 A7 01        aiS	#1
    A02A 20 F0        bra	0xA01C
    A02C 45 0240      ldHX	#0x0240
    A02F 94           tXS	
    A030 CD A035      jsr	_main
_exit:
    A033 20 FE        bra	0xA033
_main:
  i                    --> X+0
  p                    --> X+1
    A035 A7 FD        aiS	#-3
    A037 95           tSX	
FILE: F:\01科研~1\编著2005\HC08嵌~1\GP32程序\HC08EX~2\C\C06_FL~1\main.c
(0001) /*-----------------------------------------------------*
(0002) *工 程 名:Flash.prj                                    *
(0003) *硬件连接:无                                           *
(0004) *功  能:                                              *
(0005) *    1.等待接收N+1个数,并放入N和data数组中             *
(0006) *    2.擦除以addr为首地址的Flash一页,将N个数据写入     *
(0007) *    3.从以addr为首址的Flash区读取N个数据,串口发送    *
(0008) *说  明:                                               *
(0009) *    1.与Visual Basic 6.0 程序Flash_Test.vbp联合运行   *
(0010) *    2.擦/写函数中用来暂存写入或擦除程序的首末地址的   *
(0011) *      变量pbase,pend;用来暂存待写入或擦除的Flash首    *
(0012) *      地址faddr;用来存放写入的数据个数N和写入的数据   *
(0013) *      data[]必须在main函数中定义,否则将出错           *
(0014) *    3.调用擦/写子程序之前先将待擦/写页后一页开始的    *
(0015) *       所有区域写保护                                 *
(0016) *------------------------------------------------------*
(0017) /*[头文件]*/
(0018) #include "SCI.h"           //串行通信子程序头文件
(0019) #include "GP32C.h"         //包含头文件
(0020) //函数声明
(0021) extern void SCIInit(void); //串行口初始化子程序
(0022) extern void EarseFlash(unsigned int addr);
(0023) extern void WriteFlash(unsigned int addr);
(0024) //内存变量声明
(0025) unsigned char N,data[64]; //N:写入FLASH的数据个数
(0026)                           //data:将写入flash的数据
(0027) unsigned int pbase,pend,faddr;
(0028)                           //存放将写入或擦除的首地址
(0029) //主程序
(0030) void main()
(0031)   {
    A038 CD A225      jsr	_SCIInit
    A03B 95           tSX	
    A03C 20 6D        bra	0xA0AB
(0032)     unsigned char i;
(0033)     unsigned char *p;
(0034)     SCIInit();            //调串行口初始化子程序
(0035)     //主循环开始
(0036)     while(1)
(0037)     {  
    A03E A6 56        ldA	#86
    A040 87           pshA	
    A041 CD A232      jsr	_SCISend1
    A044 A7 01        aiS	#1
    A046 95           tSX	
(0038)       SCISend1(86);       //发送握手信号86
(0039)       //等待接收一个字节的握手信号
(0040)       if(SCIRe1(p)!=56)   //是否是56?
    A047 E6 02        ldA	2,X
    A049 87           pshA	
    A04A E6 01        ldA	1,X
    A04C 87           pshA	
    A04D CD A27F      jsr	_SCIRe1
    A050 A7 02        aiS	#2
    A052 95           tSX	
    A053 B7 41        stA	*__r1
    A055 A1 38        cmp	#56
    A057 27 02        beq	0xA05B
(0041)         continue;         //否,继续握手      
    A059 20 50        bra	0xA0AB
(0042)       //等待接收写入的数据个数(N<=128)并存放到N中
(0043)       SCIReN(1,data);
    A05B A6 4C        ldA	#76
    A05D 87           pshA	
    A05E A6 00        ldA	#0
    A060 87           pshA	
    A061 A6 01        ldA	#1
    A063 87           pshA	
    A064 CD A2DE      jsr	_SCIReN
    A067 A7 03        aiS	#3
(0044)       N=data[0];
    A069 C6 004C      ldA	_data
    A06C C7 008C      stA	_N
(0045)       //等待接收N个字节的数据并存放到以data数组中
(0046)       SCIReN(N,data);
    A06F A6 4C        ldA	#76
    A071 87           pshA	
    A072 A6 00        ldA	#0
    A074 87           pshA	
    A075 C6 008C      ldA	_N
    A078 87           pshA	
    A079 CD A2DE      jsr	_SCIReN
    A07C A7 03        aiS	#3
(0047)       //调用EarseFlash()程序之前要保护后一页之后的区域
(0048)       //如:EarseFlash(0x8000),则要保护的为$8100后的区域
(0049)       FLBPR=0b00000010;   //保护$8100~$FFFF的FLASH区域
    A07E A6 02        ldA	#2
    A080 C7 FF7E      stA	0xFF7E
(0050)       EarseFlash(0x8000);	//擦除0x8000为始址的一个页
    A083 45 8000      ldHX	#0x8000
    A086 89           pshX	
    A087 8B           pshH	
    A088 CD A0B0      jsr	_EarseFlash
    A08B A7 02        aiS	#2
(0051)       //调用WriteFlash()程序之前要保护后一页之后的区域
(0052)       //如:WriteFlash(0x8000),则要保护的为$8100后的区域
(0053)       FLBPR=0b00000010;   //保护$8100~$FFFF的FLASH区域
    A08D A6 02        ldA	#2
    A08F C7 FF7E      stA	0xFF7E
(0054)       WriteFlash(0x8000);	//将数据写入flash 
    A092 45 8000      ldHX	#0x8000
    A095 89           pshX	
    A096 8B           pshH	
    A097 CD A139      jsr	_WriteFlash
    A09A A7 02        aiS	#2
(0055)       //读出flash中的数据发给pc机比较 
(0056)       SCISendN(N,(unsigned char *)0x8000);
    A09C 45 8000      ldHX	#0x8000
    A09F 89           pshX	
    A0A0 8B           pshH	
    A0A1 C6 008C      ldA	_N
    A0A4 87           pshA	
    A0A5 CD A241      jsr	_SCISendN
    A0A8 A7 03        aiS	#3
    A0AA 95           tSX	
(0057)      }           
    A0AB 20 91        bra	0xA03E
    A0AD A7 03        aiS	#3
    A0AF 81           rts	
_EarseFlash:
  addr                 --> X+2
    A0B0 95           tSX	
FILE: F:\01科研~1\编著2005\HC08嵌~1\GP32程序\HC08EX~2\C\C06_FL~1\flash.c
(0001) /*文件描述:本文件包含的子程序为                       *
(0002) *  1.void EarseFlash(unsigned int addr)               *
(0003) *    Flash擦除子程序                                  *
(0004) *  2.void WriteFlash(unsigned int addr)               *
(0005) *    Flash写入子程序                                  *
(0006) *说  明:                                              *
(0007) *  1.用来暂存写入或擦除程序的首末地址的变量pbase,     *
(0008) *    pend;用来暂存待写入或擦除的Flash首地址faddr;     *
(0009) *    用来存放写入的数据个数N和写入的数据data[]必须    *
(0010) *    在main函数中定义,否则将出错                      *
(0011) *  2.调用擦/写子程序之前先将待擦/写页的后一页开始的   *
(0012) *       所有区域写保护                                *
(0013) *-------------《嵌入式应用技术基础教程》--------------*/
(0014) //[包含头文件]
(0015) #include "GP32C.h"
(0016) #include <String.h>
(0017) //外部内存变量声明
(0018) extern unsigned char N,data[]; 
(0019) extern  unsigned int pbase,pend,faddr;
(0020) unsigned char PrgOfRam[]; //存放擦/写FLASH程序以便执行
(0021) //内部调用函数声明
(0022) void DoEarseFlash(void); 
(0023) void DoWriteFlash(void);
(0024) /*EarseFlash:擦除指定flash的一页-----------------------*
(0025) *功  能:擦除以addr为首地址的flash一页                  *
(0026) *参  数:addr要擦除的首地址                             *
(0027) *返  回:无                                             *
(0028) *-----------------------------------------------------*/
(0029) void EarseFlash(unsigned int addr)
(0030)   { 
    A0B1 E6 02        ldA	2,X
    A0B3 C7 0046      stA	_faddr
    A0B6 E6 03        ldA	3,X
    A0B8 C7 0047      stA	_faddr+1
(0031)     faddr=addr;                   //擦除flash的首地址
(0032)     //将擦除程序从Flash区拷贝到RAM区PrgOfRam
(0033)     asm("ldhx #_DoEarseFlash");   //擦除程序的首地址->HX
    A0BB 45 A0F4      ldHX	#0xA0F4
(0034)     asm("sthx _pbase");           //HX->内存变量pbase
    A0BE 35 4A        stHX	*_pbase
(0035)     asm("ldhx #_EarseFlash_END"); //擦除程序的末地址->HX
    A0C0 45 A138      ldHX	#0xA138
(0036)     asm("sthx _pend");            //HX->内存变量pend 
    A0C3 35 48        stHX	*_pend
(0037)     memcpy((void *)PrgOfRam,(void *)pbase,pend-pbase);  
    A0C5 C6 0049      ldA	_pend+1
    A0C8 C0 004B      sub	_pbase+1
    A0CB B7 41        stA	*__r1
    A0CD C6 0048      ldA	_pend
    A0D0 C2 004A      sbc	_pbase
    A0D3 B7 40        stA	*__r0
    A0D5 B6 41        ldA	*__r1
    A0D7 87           pshA	
    A0D8 B6 40        ldA	*__r0
    A0DA 87           pshA	
    A0DB C6 004B      ldA	_pbase+1
    A0DE 87           pshA	
    A0DF C6 004A      ldA	_pbase
    A0E2 87           pshA	
    A0E3 A6 8D        ldA	#-115
    A0E5 87           pshA	
    A0E6 A6 00        ldA	#0
    A0E8 87           pshA	
    A0E9 CD A331      jsr	_memcpy
    A0EC A7 06        aiS	#6
    A0EE 95           tSX	
(0038)     //在RAM区执行擦除程序
(0039)     asm("ldhx #_PrgOfRam");	    //擦除程序在RAM区的首地址
    A0EF 45 008D      ldHX	#0x008D
(0040)     asm("jsr ,X");		        //执行RAM区域的擦除程序
    A0F2 FD           jsr	0,X
    A0F3 81           rts	
_DoEarseFlash:
  i                    --> X+0
    A0F4 A7 FF        aiS	#-1
    A0F6 95           tSX	
(0041)   }
(0042) /*DoEarseFlash:擦除指定flash区-------------------------*
(0043) *功  能: 真正执行擦除addr指向的flash区的操作           *
(0044) *参  数:无                                             *
(0045) *返  回:无                                             *
(0046) *内部调用:延时函数delay1 (用嵌入汇编调用)              *
(0047) *-----------------------------------------------------*/
(0048) void delay1(void);
(0049) void DoEarseFlash(void)
(0050)   {
    A0F7 A6 02        ldA	#2
    A0F9 C7 FE08      stA	0xFE08
(0051)     unsigned char i;    
(0052)     FLCR=0b00000010;  	   //①1->ERASE,0->MASS(页擦除)
(0053) 	  i=FLBPR;               //②读FLBPR	
    A0FC C6 FF7E      ldA	0xFF7E
    A0FF F7           stA	0,X
(0054) 	                         //③任意数->faddr,选中flash页
(0055)     *((volatile unsigned char *)faddr)=68;
    A100 C6 0047      ldA	_faddr+1
    A103 B7 41        stA	*__r1
    A105 C6 0046      ldA	_faddr
    A108 B7 40        stA	*__r0
    A10A A6 44        ldA	#68
    A10C 55 40        ldHX	*__r0
    A10E F7           stA	0,X
    A10F 95           tSX	
(0056)     asm ("bsr _delay1");   //④延时10us
    A110 AD 17        bsr	0xA129
(0057)     FLCR=0b00001010;       //⑤1->HVEN (加高压)
    A112 A6 0A        ldA	#10
    A114 C7 FE08      stA	0xFE08
(0058)     asm ("bsr _delay1");   //延时时间必须>1.6ms
    A117 AD 10        bsr	0xA129
(0059)     FLCR=0b00001000;	     //⑦0->Erase
    A119 A6 08        ldA	#8
    A11B C7 FE08      stA	0xFE08

⌨️ 快捷键说明

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