首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]不用C demo了,还是自己写吧,版主和其他兄弟来看看我的程序还有几个问题

[求助]不用C demo了,还是自己写吧,版主和其他兄弟来看看我的程序还有几个问题

第一:
#pragma CODE_SEG FLASH_PRO_AREA
//写一个字节
void StorageDataToFlash(unsigned short a,unsigned char d) {
    unsigned char i;   
    *(unsigned char *)a = d;  //向地址内写入数据   
    FCMD = 0x20;                         //写入ByteProgram命令   
    FSTAT_FCBEF = 1;            //执行命令   
    i = 100;
    while(i--);
    if(FSTAT_FPVIOL == 1 || FSTAT_FACCERR == 1){//检查是否出现错误
                               //加入一些代码
    }
    else{
        while(FSTAT_FCCF != 1)//等待完成
          ;
    }
}
//擦除页
void ErasureFlash(unsigned short a){
    unsigned char i;   
    *(unsigned char *)a = 0xDD;  //向地址内写入数据,任意的数据,擦除操作   
    FCMD = 0x40;                       //写入PageErasure命令   
    FSTAT_FCBEF = 1;                  //执行命令   
    i = 100;
    while(i--);                                               
    if(FSTAT_FPVIOL == 1 || FSTAT_FACCERR == 1){//检查是否出现错误
               //加入一些代码
    }
    else{
        while(FSTAT_FCCF != 1)                                   //等待完成
          ;
    }   
}
#pragma CODE_SEG DEFAULT

上面是字节写和页擦除程序,按照DataSheet上的步骤写的,请问有没有问题?

第二:
我知道要把上面这段代码拷到Ram中执行,考简单,用个memcpy()就行了,我觉得困惑的是:
  1。考的这段代码是不是必须正好,比如说实际有10个字节,11个字节是FF,而我也考了FF进去会出现什么现象
  2。拷贝容易,可是怎么把PC跳到Ram中去呢?用c好像不行,用汇编的话我看了HCS08RMV11.pdf中有两端程序,可是怎么传递参数呢?
  3。次序问题,我觉的是初始化、拷贝程序到Ram、执行、跳回Rom,是不是这样?
  4。主要问题还是觉的从Rom跳到Ram比较难懂,汇编没有学好啊,困惑

哪位大侠知道这些,指点一二啊!!!谢谢![em27][em27][em27][em04][em04][em04][em04][em04][em04][em04]
我现在想调用HCS08RMV11.pdf中的例程序,页擦除,字节写,还用搬运程序,我把它们用asm{}合起来,设两个参数,地址和数据,我观察了一下,地址是送到hx中,数据送到a中,这样直接调用请问可以吗?楼上的能不能流个联系方式?
谢谢了,可是我用了一下,编译出现了很多错误,错误大多是这类错误,像对ldhx #SpSubEnd 来说,指示说期望一个直接地址或者是全局地址,对cphx #SpSub-1来说,指示说违法操作,程序中它们是标号,我以为它们可以直接用的,请问SpSub是直接定义还是怎么着啊,文档中我没有找着他们的定义,程序如下:
//command codes
#define mBlank     0x05 //Blank Check command
#define mByteProg  0x20 //Byte Program command
#define mBurstProg 0x25 //Burst Program command
#define mPageErase 0x40 //Page Erase command
#define mMassErase 0x41 //Mass Erase command

//register
#define FCMD     0x1826

#define FSTAT    0x1825
#define mFCBEF   0x80 //1000 0000
#define mFCCF    0x40 //0100 0000
#define mFPVIOL  0x20 //0010 0000
#define mFACCERR 0x10 //0001 0000
#define mFBLANK  0x04 //0000 0100

unsigned char StorageDataToFlashAsm(unsigned short a,unsigned char d){

  asm{
                psha          ;temporarily save entry data FlashProg1:
                lda #(mFPVIOL+mFACCERR)   ;mask
                sta FSTAT                 ;abort any command and clear errors
                lda #mByteProg            ;mask pattern for byte prog command
                bsr DoOnStack             ;execute prog code from stack RAM
                ais #1                    ;deallocate data location from stack
                rts                       ;Z = 0 means there was an error
   
   
    DoOnStack:  pshx
                pshh                       ;save pointer to flash
                psha                       ;save command on stack
                ldhx #SpSubEnd             ;point at last byte to move to stack
    SpMoveLoop: lda ,x                     ;read from flash
                psha                        ;move onto stack
                aix #-1                     ;next byte to move
                cphx #SpSub-1               ;past end?
                bne SpMoveLoop              ;loop till whole sub on stack
                tsx                         ;point to sub on stack
                tpa                          ;move CCR to A for testing
                and #$08                    ;check the I mask
                bne I_set           ;skip if I already set
                sei                 ;block interrupts while FLASH busy
                lda SpSubSize+6,sp   ;preload data for command
                jsr ,x                ;execute the sub on the stack
                cli                  ;ok to clear I mask now
                bra I_cont            ;continue to stack de-allocation
    I_set:      lda SpSubSize+6,sp   ;preload data for command
                jsr ,x               ;execute the sub on the stack
    I_cont:     ais #SpSubSize+3      ;deallocate sub body + H:X + command
                                     ;H:X flash pointer OK from SpSub
                lsla                ;A=00 & Z=1 unless PVIOL or ACCERR
                rts                 ;to flash where DoOnStack was called
  
   
    SpSub:      ldhx SpSubSize+4,sp    ;get flash address from stack
                sta 0,x                ;write to flash; latch addr and data
                lda SpSubSize+3,sp     ;get flash command
                sta FCMD               ;write the flash command
                lda #mFCBEF            ;mask to initiate command
                sta FSTAT              ;[pwpp] register command
                nop                    ;[p] want min 4~ from w cycle to r
   ChkDone:     lda FSTAT              ;[prpp] so FCCF is valid
                lsla                   ;FCCF now in MSB
                bpl ChkDone            ;loop if FCCF = 0
    SpSubEnd:   rts                    ;back into DoOnStack in flash
    SpSubSize:  equ (*-SpSub)
  }
}

谢谢楼上!
是啊,纯用汇编太麻烦了,用c的话写和擦的代码可以自己写,我现在觉的最麻烦的是程序初始化之后,把c的写和擦的代码拷到ram中再执行然后返回的程序不知怎么写,看汇编的话跳来跳去也不清楚,仁兄能不能给个调用的例子看看
好啊,谢谢seuafu2005了,英文比较差,麻烦啊,不过seuafu2005是个好人啊,哈哈,答解了这么多问题,再次感谢啊!!!
哈哈,搞定了,呵呵,看了那个processor expert生成的代码,很好玩啊,学到不少东西,呵呵,再次感谢seuafu2005、strongchen还有坛子上的其他兄弟!!!
返回列表