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

📄 flash.lst

📁 hc08飞思卡尔单片机上实现flash转换
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0060)     asm ("bsr _delay1");   //⑧10us
    A11E AD 09        bsr	0xA129
(0061)     FLCR=0b00000000;	     //⑨0->HVEN(取消高压)
    A120 4F           clrA	
    A121 C7 FE08      stA	0xFE08
(0062)     asm ("bsr _delay1");   //⑩延时10us
    A124 AD 03        bsr	0xA129
    A126 A7 01        aiS	#1
    A128 81           rts	
_delay1:
  j                    --> X+0
    A129 A7 FF        aiS	#-1
    A12B 95           tSX	
(0063)   }
(0064) void delay1(void)       //延时一定时间,供上述程序调用
(0065)     { unsigned  char j;
    A12C 7F           clr	0,X
    A12D 20 01        bra	0xA130
(0066)       for (j=0;j<10;j++); }    
    A12F 7C           inc	0,X
    A130 F6           ldA	0,X
    A131 A1 0A        cmp	#10
    A133 25 FA        bcs	0xA12F
    A135 A7 01        aiS	#1
    A137 81           rts	
(0067) void EarseFlash_END(void)  //擦除程序的末地址
(0068)   { }
_EarseFlash_END:
    A138 81           rts	
_WriteFlash:
  addr                 --> X+2
    A139 95           tSX	
(0069) /*WriteFlash:向addr指向的flash区写入数据---------------*
(0070) *功  能:向指定flash地址写入数据                        *
(0071) *参  数:addr要写入的首址                               *
(0072) *返  回:无                                             *
(0073) *-----------------------------------------------------*/
(0074) void WriteFlash(unsigned int addr)
(0075)   {
    A13A E6 02        ldA	2,X
    A13C C7 0046      stA	_faddr
    A13F E6 03        ldA	3,X
    A141 C7 0047      stA	_faddr+1
(0076)     faddr=addr;	                 //写入flash的首地址
(0077)     //将写入程序从Flash区拷贝到RAM区PrgOfRam
(0078)     asm("ldhx #_DoWriteFlash");  //写入程序的首地址->HX
    A144 45 A17D      ldHX	#0xA17D
(0079)     asm("sthx _pbase");          //HX->内存变量pbase  
    A147 35 4A        stHX	*_pbase
(0080)     asm("ldhx #_WriteFlash_END");//写入程序的末地址->HX 
    A149 45 A1FF      ldHX	#0xA1FF
(0081)     asm("sthx _pend");           //HX->内存变量pend
    A14C 35 48        stHX	*_pend
(0082)     //将写入程序从Flash区拷贝到RAM区PrgOfRam
(0083)     memcpy((void *)PrgOfRam,(void *)pbase,pend-pbase);
    A14E C6 0049      ldA	_pend+1
    A151 C0 004B      sub	_pbase+1
    A154 B7 41        stA	*__r1
    A156 C6 0048      ldA	_pend
    A159 C2 004A      sbc	_pbase
    A15C B7 40        stA	*__r0
    A15E B6 41        ldA	*__r1
    A160 87           pshA	
    A161 B6 40        ldA	*__r0
    A163 87           pshA	
    A164 C6 004B      ldA	_pbase+1
    A167 87           pshA	
    A168 C6 004A      ldA	_pbase
    A16B 87           pshA	
    A16C A6 8D        ldA	#-115
    A16E 87           pshA	
    A16F A6 00        ldA	#0
    A171 87           pshA	
    A172 CD A331      jsr	_memcpy
    A175 A7 06        aiS	#6
    A177 95           tSX	
(0084)     //在RAM区执行写入程序
(0085)     asm("LDHX #_PrgOfRam");    //写入程序在RAM的首地址 
    A178 45 008D      ldHX	#0x008D
(0086)     asm("jsr ,X");		           //执行RAM区的写入程序
    A17B FD           jsr	0,X
    A17C 81           rts	
_DoWriteFlash:
  i                    --> X+0
  j                    --> X+1
    A17D A7 FE        aiS	#-2
    A17F 95           tSX	
(0087)   }
(0088) /*DoWriteFlash:实际执行的写入函数----------------------*
(0089) *功  能:调入内存执行擦除指定flash地址的数据            *
(0090) *参  数:无                                             *
(0091) *返  回:无                                             *
(0092) *内部调用:延时函数delay2(用嵌入汇编调用)               *
(0093) *-----------------------------------------------------*/
(0094) void delay2(void);
(0095) void DoWriteFlash(void)
(0096)   {
    A180 A6 01        ldA	#1
    A182 C7 FE08      stA	0xFE08
(0097)     unsigned char i;
(0098)     unsigned char j;    
(0099)     FLCR=0b00000001;  	   //①1->PGM							 
(0100)   	i=FLBPR;               //②读FLBPR 
    A185 C6 FF7E      ldA	0xFF7E
    A188 F7           stA	0,X
(0101)   	                       //③任意数->faddr,选中flash行
(0102)     *((volatile unsigned char *)faddr)=56; 
    A189 C6 0047      ldA	_faddr+1
    A18C B7 41        stA	*__r1
    A18E C6 0046      ldA	_faddr
    A191 B7 40        stA	*__r0
    A193 A6 38        ldA	#56
    A195 55 40        ldHX	*__r0
    A197 F7           stA	0,X
    A198 95           tSX	
(0103)     asm ("bsr _delay2");   //④延时10us
    A199 AD 55        bsr	0xA1F0
(0104)     FLCR=0b00001001;	     //⑤1->HVEN
    A19B A6 09        ldA	#9
    A19D C7 FE08      stA	0xFE08
(0105)     asm ("bsr _delay2");   //⑥延时10us
    A1A0 AD 4E        bsr	0xA1F0
(0106)     //⑦将数据写入相应的flash地址		 
(0107)     for(i=0;i<N;i++)
    A1A2 7F           clr	0,X
    A1A3 20 35        bra	0xA1DA
(0108)       {		                 //数据送入flash地址
    A1A5 3F 40        clr	*__r0
    A1A7 F6           ldA	0,X
    A1A8 AB 4C        add	#76
    A1AA B7 41        stA	*__r1
    A1AC B6 40        ldA	*__r0
    A1AE A9 00        adc	#0
    A1B0 B7 40        stA	*__r0
    A1B2 55 40        ldHX	*__r0
    A1B4 F6           ldA	0,X
    A1B5 95           tSX	
    A1B6 B7 41        stA	*__r1
    A1B8 3F 42        clr	*__r2
    A1BA F6           ldA	0,X
    A1BB CB 0047      add	_faddr+1
    A1BE B7 43        stA	*__r3
    A1C0 B6 42        ldA	*__r2
    A1C2 C9 0046      adc	_faddr
    A1C5 B7 42        stA	*__r2
    A1C7 B6 41        ldA	*__r1
    A1C9 55 42        ldHX	*__r2
    A1CB F7           stA	0,X
    A1CC 95           tSX	
(0109)   	   *((volatile unsigned char *)faddr+i)=data[i];
(0110)   	   for (j=0;j<30;j++); //⑧延时30us,不能调用延时程序
    A1CD 6F 01        clr	1,X
    A1CF 20 02        bra	0xA1D3
    A1D1 6C 01        inc	1,X
    A1D3 E6 01        ldA	1,X
    A1D5 A1 1E        cmp	#30
    A1D7 25 F8        bcs	0xA1D1
(0111)   	  }   
    A1D9 7C           inc	0,X
    A1DA F6           ldA	0,X
    A1DB C1 008C      cmp	_N
    A1DE 25 C5        bcs	0xA1A5
(0112)     FLCR=0b00001000;	     //⑨0->PGM  
    A1E0 A6 08        ldA	#8
    A1E2 C7 FE08      stA	0xFE08
(0113)     asm ("bsr _delay2");   //⑩延时10us
    A1E5 AD 09        bsr	0xA1F0
(0114)     FLCR=0b00000000;	     //⑾0->HVEN  
    A1E7 4F           clrA	
    A1E8 C7 FE08      stA	0xFE08
(0115)     asm ("bsr _delay2");   //⑿延时6us
    A1EB AD 03        bsr	0xA1F0
    A1ED A7 02        aiS	#2
    A1EF 81           rts	
_delay2:
  j                    --> X+0
    A1F0 A7 FF        aiS	#-1
    A1F2 95           tSX	
(0116)   }
(0117) void delay2(void)  //延时一定时间
(0118)     { unsigned  char j;
    A1F3 7F           clr	0,X
    A1F4 20 01        bra	0xA1F7
(0119)       for (j=0;j<10;j++); }    
    A1F6 7C           inc	0,X
    A1F7 F6           ldA	0,X
    A1F8 A1 0A        cmp	#10
    A1FA 25 FA        bcs	0xA1F6
    A1FC A7 01        aiS	#1
    A1FE 81           rts	
(0120) void WriteFlash_END(void)   //写入程序的末地址
(0121)   { }
_WriteFlash_END:
    A1FF 81           rts	
FILE: F:\01科研~1\编著2005\HC08嵌~1\GP32程序\HC08EX~2\C\C06_FL~1\setup.c
(0001) /*_HC08Setup:GP32系统初始化子程序----------------------*
(0002) *功能:系统初始化设置:设置CONFIG1和CONFIG2寄存器       *
(0003)        CGM的寄存器设置:由外部晶振f=32.768kHz,产生内部 *
(0004)        总线时钟2.4576MHz                               *
(0005) *参数:无                                              *
(0006) *返回:无                                              *
(0007) *-----------------------------------------------------*/ 
(0008) #include "GP32C.h"     //映像寄存器地址头文件
(0009) void _HC08Setup(void)
(0010)  {
__HC08Setup:
    A200 A6 01        ldA	#1
    A202 B7 1E        stA	0x1E
(0011)    //初始化CONFIG2
(0012)    CONFIG2=0b00000001;  //SCIBDSRC=1内部总线时钟用作SCI
(0013)                         //时钟;OSCSTOPENB=0在stop模式下
(0014)                         //禁止振荡器工作      
(0015)    //初始化CONFIG1
(0016)    CONFIG1=0b00111101;  //COPD=1 禁止COP模块
    A204 A6 3D        ldA	#61
    A206 B7 1F        stA	0x1F
(0017)                       //STOP=0 禁止STOP指令
(0018)                       //SSREC=1 32个CGMXCLK周期退出
(0019)                       //STOP模式
(0020)                       //LVI5OR3=1 LVI工作在5V
(0021)                       //LVIPWRD=1 禁止LVI模块电源
(0022)                       //LVIRSTD=1 允许LVI复位信号
(0023)                       //LVISTOP=0 在stop模式下禁止LVI
(0024)                       //COPRS=0 COP溢出范围使用长的时间                         
(0025)    PCTL=0x00;         //①禁止PLL:清零PLL控制寄存器PCTL             
    A208 3F 36        clr	0x36
(0026)    PCTL=0x01;         //②将P、E写入PTCL,置VCO的参考频率
    A20A A6 01        ldA	#1
    A20C B7 36        stA	0x36
(0027)                       //  为2             
(0028)    PMSH=0x01;         //③将N写入PMSH、PMSL,置VCO的倍
    A20E A6 01        ldA	#1
    A210 B7 38        stA	0x38
(0029)                       //  频因子为$12C          
(0030)    PMSL=0x2C;             
    A212 A6 2C        ldA	#44
    A214 B7 39        stA	0x39
(0031)    PMRS=0b10000000;   //④将L写入PMRS,置VCO的输出频率范
    A216 A6 80        ldA	#-128
    A218 B7 3A        stA	0x3A
(0032)                       //  围系数为$80   
(0033)    PRDS=0x01;         //⑤将R写入PRDS
    A21A A6 01        ldA	#1
    A21C B7 3B        stA	0x3B
(0034)    PCTL|=(1<<5);      //⑥置PCTL.PLLON=1,启动PLL电路  
    A21E 1A 36        Bset	5,0x36
(0035)    PBWC|=(1<<7);      //⑦PBWC自动带宽控制位=1,选择自动
    A220 1E 37        Bset	7,0x37
(0036)                       //  控制方式  
(0037)    PCTL|=(1<<4);      //⑧PCTL.BCS=1,选择PLL电路为时钟源
    A222 18 36        Bset	4,0x36
    A224 81           rts	
FILE: F:\01科研~1\编著2005\HC08嵌~1\GP32程序\HC08EX~2\C\C06_FL~1\SCIInit.c
(0001) /*SCIInit:串行口初始化子程序---------------------------*
(0002) *功 能:对串行口进行初始化,默认为允许SCI,正常码输出,8位 *
(0003) *      数据,无校验等,允许发送器允许接收器.查询方式收发,*
(0004) *      波特率为9600(设fBUS=2.4576MHz)                 *
(0005) *参 数:无                                              *
(0006) *返 回:无                                              *
(0007) *-----------------------------------------------------*/
(0008) #include "GP32C.H"
(0009) void SCIInit(void)
(0010)  {  //总线频率fBUS=2.4576MHz,定义波特率Bt=9600
_SCIInit:
    A225 A6 02        ldA	#2
    A227 B7 19        stA	0x19
(0011)     SCBR=0b00000010;
(0012)     //设置允许SCI,正常码输出、8位数据、无校验

⌨️ 快捷键说明

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