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

📄 flash.lis

📁 项目是为日本瑞萨工作所做的BAKE炉温控系统 整个文件夹包括设计文档
💻 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           ; extern unsigned char N,FlashData[]; 
 0001           ; extern 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 C70000            sta _faddr
 0006 E603              lda 3,X
 0008 C70001            sta _faddr+1
 000B                   .dbline 34
 000B           ;     //将擦除程序从Flash区拷贝到RAM区PrgOfRam
 000B           ;     asm("ldhx #_DoEarseFlash");   //擦除程序的首地址->HX
 000B 450044            ldhx #_DoEarseFlash
 000E                   .dbline 35
 000E           ;     asm("sthx _pbase");           //HX->内存变量pbase
 000E 3500              sthx _pbase
 0010                   .dbline 36
 0010           ;     asm("ldhx #_EarseFlash_END"); //擦除程序的末地址->HX
 0010 450088            ldhx #_EarseFlash_END
 0013                   .dbline 37
 0013           ;     asm("sthx _pend");            //HX->内存变量pend 
 0013 3500              sthx _pend
 0015                   .dbline 38
 0015           ;     memcpy((void *)PrgOfRam,(void *)pbase,pend-pbase);  
 0015 C60001            lda _pend+1
 0018 C00001            sub _pbase+1
 001B B700              sta *__r1
 001D C60000            lda _pend
 0020 C20000            sbc _pbase
 0023 B700              sta *__r0
 0025 B600              lda *__r1
 0027 87                psha
 0028 B600              lda *__r0
 002A 87                psha
 002B C60001            lda _pbase+1
 002E 87                psha
 002F C60000            lda _pbase
 0032 87                psha
 0033 A600              lda #<_PrgOfRam
 0035 87                psha
 0036 A600              lda #>_PrgOfRam
 0038 87                psha
 0039 CD0000            jsr _memcpy
 003C A706              ais #6
 003E 95                tsx
 003F                   .dbline 40
 003F           ;     //在RAM区执行擦除程序
 003F           ;     asm("ldhx #_PrgOfRam");       //擦除程序在RAM区的首地址
 003F 450000            ldhx #_PrgOfRam
 0042                   .dbline 41
 0042           ;     asm("jsr ,X");                    //执行RAM区域的擦除程序
 0042 FD                jsr ,X
 0043                   .dbline -2
 0043           L1:
 0043                   .dbline 0 ; func end
 0043 81                rts
 0044                   .dbsym l addr 2 i
 0044                   .dbend
 0044                   .dbfunc e DoEarseFlash _DoEarseFlash fV
 0044           ;              i -> 0,X
 0044           _DoEarseFlash::
 0044                   .dbline -1
 0044 A7FF              ais #-1
 0046 95                tsx
 0047                   .dbline 51
 0047           ;   }
 0047           ; /*DoEarseFlash:擦除指定flash区-------------------------*
 0047           ; *功  能: 真正执行擦除addr指向的flash区的操作           *
 0047           ; *参  数:无                                             *
 0047           ; *返  回:无                                             *
 0047           ; *内部调用:延时函数delay1 (用嵌入汇编调用)              *
 0047           ; *-----------------------------------------------------*/
 0047           ; void delay1(void);
 0047           ; void DoEarseFlash(void)
 0047           ;   {
 0047                   .dbline 53
 0047           ;     unsigned char i;    
 0047           ;     FLCR=0b00000010;               //①1->ERASE,0->MASS(页擦除)
 0047 A602              lda #2
 0049 C7FE08            sta 0xfe08
 004C                   .dbline 54
 004C           ;         i=FLBPR;               //②读FLBPR    
 004C C6FF7E            lda 0xff7e
 004F F7                sta ,X
 0050                   .dbline 56
 0050           ;                                //③任意数->faddr,选中flash页
 0050           ;     *((volatile unsigned char *)faddr)=68;
 0050 C60001            lda _faddr+1
 0053 B700              sta *__r1
 0055 C60000            lda _faddr
 0058 B700              sta *__r0
 005A A644              lda #68
 005C 5500              ldhx *__r0
 005E F7                sta ,x
 005F 95                tsx
 0060                   .dbline 57
 0060           ;     asm ("bsr _delay1");     //④延时10us
 0060 AD17              bsr _delay1
 0062                   .dbline 58
 0062           ;     FLCR=0b00001010;         //⑤1->HVEN (加高压)
 0062 A60A              lda #10
 0064 C7FE08            sta 0xfe08
 0067                   .dbline 59
 0067           ;     asm ("bsr _delay1");     //延时时间必须>1.6ms
 0067 AD10              bsr _delay1
 0069                   .dbline 60
 0069           ;     FLCR=0b00001000;       //⑦0->Erase
 0069 A608              lda #8
 006B C7FE08            sta 0xfe08
 006E                   .dbline 61
 006E           ;     asm ("bsr _delay1");     //⑧10us
 006E AD09              bsr _delay1
 0070                   .dbline 62
 0070           ;     FLCR=0b00000000;       //⑨0->HVEN(取消高压)
 0070 4F                clra
 0071 C7FE08            sta 0xfe08
 0074                   .dbline 63
 0074           ;     asm ("bsr _delay1");     //⑩延时10us
 0074 AD03              bsr _delay1
 0076                   .dbline -2
 0076           L2:
 0076 A701              ais #1
 0078                   .dbline 0 ; func end
 0078 81                rts
 0079                   .dbsym l i 0 c
 0079                   .dbend
 0079                   .dbfunc e delay1 _delay1 fV
 0079           ;              j -> 0,X
 0079           _delay1::
 0079                   .dbline -1
 0079 A7FF              ais #-1
 007B 95                tsx
 007C                   .dbline 66
 007C           ;   }
 007C           ; void delay1(void)       //延时一定时间,供上述程序调用
 007C           ;     { unsigned  char j;
 007C                   .dbline 67
 007C 7F                clr ,X
 007D 2001              bra L7
 007F           L4:
 007F                   .dbline 67
 007F           L5:
 007F                   .dbline 67
 007F 7C                inc ,X
 0080           L7:
 0080                   .dbline 67
 0080           ;       for (j=0;j<1;j++); }    
 0080 F6                lda ,X
 0081 A101              cmp #1
 0083 25FA              blo L4
 0085                   .dbline -2
 0085           L3:
 0085 A701              ais #1
 0087                   .dbline 0 ; func end
 0087 81                rts
 0088                   .dbsym l j 0 c
 0088                   .dbend
 0088                   .dbfunc e EarseFlash_END _EarseFlash_END fV
 0088           _EarseFlash_END::
 0088                   .dbline -1
 0088                   .dbline 69
 0088           ; void EarseFlash_END(void)  //擦除程序的末地址
 0088           ;   { }
 0088                   .dbline -2
 0088           L8:
 0088                   .dbline 0 ; func end
 0088 81                rts
 0089                   .dbend
 0089                   .dbfunc e WriteFlash _WriteFlash fV
 0089           ;           addr -> 2,X
 0089           _WriteFlash::
 0089                   .dbline -1
 0089 95                tsx
 008A                   .dbline 76
 008A           ; /*WriteFlash:向addr指向的flash区写入数据---------------*
 008A           ; *功  能:向指定flash地址写入数据                        *
 008A           ; *参  数:addr要写入的首址                               *
 008A           ; *返  回:无                                             *
 008A           ; *-----------------------------------------------------*/
 008A           ; void WriteFlash(unsigned int addr)
 008A           ;   {
 008A                   .dbline 77
 008A           ;     faddr=addr;                        //写入flash的首地址
 008A E602              lda 2,X
 008C C70000            sta _faddr
 008F E603              lda 3,X
 0091 C70001            sta _faddr+1
 0094                   .dbline 79

⌨️ 快捷键说明

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