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

📄 flash.lis

📁 为日本瑞萨苏州分公司做的一个温控系统
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module Flash.c
                        .area text
 0000                   .dbfile Flash.c
 0000                   .dbfunc e EraseFlash _EraseFlash fV
 0000           ;           addr -> 2,X
 0000           _EraseFlash::
 0000                   .dbline -1
 0000 95                tsx
 0001                   .dbline 31
 0001           ; /*文件描述:本文件包含的子程序为                       *
 0001           ; *  1.void EarseFlash(unsigned int addr)               *
 0001           ; *    Flash擦除子程序                                  *
 0001           ; *  2.void WriteFlash(unsigned int addr)               *
 0001           ; *    Flash写入子程序                                  *
 0001           ; *说  明:                                              *
 0001           ; *  1.用来暂存写入或擦除程序的首末地址的变量pbase,     *
 0001           ; *    pend;用来暂存待写入或擦除的Flash首地址faddr;     *
 0001           ; *    用来存放写入的数据个数N和写入的数据FlashData[]必须    *
 0001           ; *    在main函数中定义,否则将出错                      *
 0001           ; *  2.调用擦/写子程序之前先将待擦/写页的后一页开始的   *
 0001           ; *       所有区域写保护                                *
 0001           ; *-------------《嵌入式应用技术基础教程》--------------*/
 0001           ; //[包含头文件]
 0001           ; #include "GP32C.h"
 0001           ; #include <String.h>
 0001           ; //外部内存变量声明
 0001           ; unsigned char PrgOfRam[]; //存放擦/写FLASH程序以便执行
 0001           ; unsigned char N,FlashData[8]; 
 0001           ; unsigned int pbase,pend,faddr;
 0001           ; 
 0001           ; //内部调用函数声明
 0001           ; void DoEarseFlash(void); 
 0001           ; void DoWriteFlash(void);
 0001           ; /*EarseFlash:擦除指定flash的一页-----------------------*
 0001           ; *功  能:擦除以addr为首地址的flash一页                  *
 0001           ; *参  数:addr要擦除的首地址                             *
 0001           ; *返  回:无                                             *
 0001           ; *-----------------------------------------------------*/
 0001           ; void EraseFlash(unsigned int addr)
 0001           ;   { 
 0001                   .dbline 32
 0001           ;     faddr=addr;                   //擦除flash的首地址
 0001 E602              lda 2,X
 0003 B700              sta *_faddr
 0005 E603              lda 3,X
 0007 B701              sta *_faddr+1
 0009                   .dbline 34
 0009           ;     //将擦除程序从Flash区拷贝到RAM区PrgOfRam
 0009           ;     asm("ldhx #_DoEarseFlash");   //擦除程序的首地址->HX
 0009 45003C            ldhx #_DoEarseFlash
 000C                   .dbline 35
 000C           ;     asm("sthx _pbase");           //HX->内存变量pbase
 000C 3504              sthx _pbase
 000E                   .dbline 36
 000E           ;     asm("ldhx #_EarseFlash_END"); //擦除程序的末地址->HX
 000E 450076            ldhx #_EarseFlash_END
 0011                   .dbline 37
 0011           ;     asm("sthx _pend");            //HX->内存变量pend 
 0011 3502              sthx _pend
 0013                   .dbline 38
 0013           ;     memcpy((void *)PrgOfRam,(void *)pbase,pend-pbase);  
 0013 B603              lda *_pend+1
 0015 B005              sub *_pbase+1
 0017 B700              sta *__r1
 0019 B602              lda *_pend
 001B B204              sbc *_pbase
 001D B700              sta *__r0
 001F B600              lda *__r1
 0021 87                psha
 0022 B600              lda *__r0
 0024 87                psha
 0025 B605              lda *_pbase+1
 0027 87                psha
 0028 B604              lda *_pbase
 002A 87                psha
 002B A60F              lda #<_PrgOfRam
 002D 87                psha
 002E A60F              lda #>_PrgOfRam
 0030 87                psha
 0031 CD0000            jsr _memcpy
 0034 A706              ais #6
 0036 95                tsx
 0037                   .dbline 40
 0037           ;     //在RAM区执行擦除程序
 0037           ;     asm("ldhx #_PrgOfRam");       //擦除程序在RAM区的首地址
 0037 45000F            ldhx #_PrgOfRam
 003A                   .dbline 41
 003A           ;     asm("jsr ,X");                    //执行RAM区域的擦除程序
 003A FD                jsr ,X
 003B                   .dbline -2
 003B           L1:
 003B                   .dbline 0 ; func end
 003B 81                rts
 003C                   .dbsym l addr 2 i
 003C                   .dbend
 003C                   .dbfunc e DoEarseFlash _DoEarseFlash fV
 003C           ;              i -> 0,X
 003C           _DoEarseFlash::
 003C                   .dbline -1
 003C A7FF              ais #-1
 003E 95                tsx
 003F                   .dbline 51
 003F           ;   }
 003F           ; /*DoEarseFlash:擦除指定flash区-------------------------*
 003F           ; *功  能: 真正执行擦除addr指向的flash区的操作           *
 003F           ; *参  数:无                                             *
 003F           ; *返  回:无                                             *
 003F           ; *内部调用:延时函数delay1 (用嵌入汇编调用)              *
 003F           ; *-----------------------------------------------------*/
 003F           ; void delay1(void);
 003F           ; void DoEarseFlash(void)
 003F           ;   {
 003F                   .dbline 53
 003F           ;     unsigned char i;    
 003F           ;     FLCR=0b00000010;               //①1->ERASE,0->MASS(页擦除)
 003F A602              lda #2
 0041 C7FE08            sta 0xfe08
 0044                   .dbline 54
 0044           ;         i=FLBPR;               //②读FLBPR    
 0044 C6FF7E            lda 0xff7e
 0047 F7                sta ,X
 0048                   .dbline 56
 0048           ;                                //③任意数->faddr,选中flash页
 0048           ;     *((volatile unsigned char *)faddr)=68;
 0048 A644              lda #68
 004A 5500              ldhx *_faddr
 004C F7                sta ,x
 004D 95                tsx
 004E                   .dbline 57
 004E           ;     asm ("bsr _delay1");     //④延时10us
 004E AD17              bsr _delay1
 0050                   .dbline 58
 0050           ;     FLCR=0b00001010;         //⑤1->HVEN (加高压)
 0050 A60A              lda #10
 0052 C7FE08            sta 0xfe08
 0055                   .dbline 59
 0055           ;     asm ("bsr _delay1");     //延时时间必须>1.6ms
 0055 AD10              bsr _delay1
 0057                   .dbline 60
 0057           ;     FLCR=0b00001000;       //⑦0->Erase
 0057 A608              lda #8
 0059 C7FE08            sta 0xfe08
 005C                   .dbline 61
 005C           ;     asm ("bsr _delay1");     //⑧10us
 005C AD09              bsr _delay1
 005E                   .dbline 62
 005E           ;     FLCR=0b00000000;       //⑨0->HVEN(取消高压)
 005E 4F                clra
 005F C7FE08            sta 0xfe08
 0062                   .dbline 63
 0062           ;     asm ("bsr _delay1");     //⑩延时10us
 0062 AD03              bsr _delay1
 0064                   .dbline -2
 0064           L2:
 0064 A701              ais #1
 0066                   .dbline 0 ; func end
 0066 81                rts
 0067                   .dbsym l i 0 c
 0067                   .dbend
 0067                   .dbfunc e delay1 _delay1 fV
 0067           ;              j -> 0,X
 0067           _delay1::
 0067                   .dbline -1
 0067 A7FF              ais #-1
 0069 95                tsx
 006A                   .dbline 66
 006A           ;   }
 006A           ; void delay1(void)       //延时一定时间,供上述程序调用
 006A           ;     { unsigned  char j;
 006A                   .dbline 67
 006A 7F                clr ,X
 006B 2001              bra L7
 006D           L4:
 006D                   .dbline 67
 006D           L5:
 006D                   .dbline 67
 006D 7C                inc ,X
 006E           L7:
 006E                   .dbline 67
 006E           ;       for (j=0;j<1;j++); }    
 006E F6                lda ,X
 006F A101              cmp #1
 0071 25FA              blo L4
 0073                   .dbline -2
 0073           L3:
 0073 A701              ais #1
 0075                   .dbline 0 ; func end
 0075 81                rts
 0076                   .dbsym l j 0 c
 0076                   .dbend
 0076                   .dbfunc e EarseFlash_END _EarseFlash_END fV
 0076           _EarseFlash_END::
 0076                   .dbline -1
 0076                   .dbline 69
 0076           ; void EarseFlash_END(void)  //擦除程序的末地址
 0076           ;   { }
 0076                   .dbline -2
 0076           L8:
 0076                   .dbline 0 ; func end
 0076 81                rts
 0077                   .dbend
 0077                   .dbfunc e WriteFlash _WriteFlash fV
 0077           ;           addr -> 2,X
 0077           _WriteFlash::
 0077                   .dbline -1
 0077 95                tsx
 0078                   .dbline 76
 0078           ; /*WriteFlash:向addr指向的flash区写入数据---------------*
 0078           ; *功  能:向指定flash地址写入数据                        *
 0078           ; *参  数:addr要写入的首址                               *
 0078           ; *返  回:无                                             *
 0078           ; *-----------------------------------------------------*/
 0078           ; void WriteFlash(unsigned int addr)
 0078           ;   {
 0078                   .dbline 77
 0078           ;     faddr=addr;                        //写入flash的首地址
 0078 E602              lda 2,X
 007A B700              sta *_faddr
 007C E603              lda 3,X
 007E B701              sta *_faddr+1
 0080                   .dbline 79
 0080           ;     //将写入程序从Flash区拷贝到RAM区PrgOfRam
 0080           ;     asm("ldhx #_DoWriteFlash");  //写入程序的首地址->HX
 0080 4500B3            ldhx #_DoWriteFlash
 0083                   .dbline 80
 0083           ;     asm("sthx _pbase");          //HX->内存变量pbase  
 0083 3504              sthx _pbase
 0085                   .dbline 81

⌨️ 快捷键说明

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