Board logo

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

作者: zihongshu    时间: 2005-5-19 11:18     标题: [求助]不用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]
作者: seuafu2005    时间: 2005-5-19 12:54

你写的代码基本上没什么问题.
1. 拷代码不必非要正好,多一些也没有关系。
2. 用汇编跳到RAM的话会比较方便,参数可以通过A,H或者X寄存器传递,也可以开辟一些固定的RAM空间来传递。对flash的操作也可以全部采用汇编来写,Freescale网站上也有样例程序,在C里面嵌入汇编还是很方便的。关于用C怎么跳转和参数传递,给一个方法。你可以自己用Codewarrior生成HCS08某一个MCU比如说GT60默认的工程,启用ProcessorExpert,选择对flash操作的bean,然后让处理器专家生成一些代码,这些代码相信会对你有些帮助的。
3. 你说的次序是对的。要注意的是对clock的选择要小心,不要超出范围,而且只能对该寄存器写一次。



[此贴子已经被作者于2005-5-19 12:54:18编辑过]


作者: zihongshu    时间: 2005-5-19 14:13

我现在想调用HCS08RMV11.pdf中的例程序,页擦除,字节写,还用搬运程序,我把它们用asm{}合起来,设两个参数,地址和数据,我观察了一下,地址是送到hx中,数据送到a中,这样直接调用请问可以吗?楼上的能不能流个联系方式?
作者: seuafu2005    时间: 2005-5-19 14:33

对,正是如此。
我的email是 seuafu2002@yahoo.com.cn
你还可以下载AN2140应用笔记的软件,有比较完整的代码。HCS08RMV1.pdf中的例子程序和An2140软件中的是一样的。
作者: zihongshu    时间: 2005-5-19 15:12

谢谢了,可是我用了一下,编译出现了很多错误,错误大多是这类错误,像对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)
  }
}

谢谢楼上!
作者: seuafu2005    时间: 2005-5-19 16:22

SpSub就是一个标号,直接定义。
全部用汇编的话,我建议你把汇编代码单独放在一个.asm后缀的文件里面,不要和C文件混在一起。汇编文件给出入口地址,C文件调用入口地址就可以了。如果汇编和C混在一个文件里面的话,因为汇编语句比较多,定义也比较多,所以容易出错。比如说要进行擦除操作,可以这样写:
Erase_Entry:
          ldhx #$17ff   ;end address
          pshx
          pshh
         ldhx  #$1600   ; start address,erase $1600-17FF
        jsr ErasePages
        bne erasErr
erasNoErr:  
       lda #FlashNoErr
       sta Err_Flag
       bra doneEras
erasErr:
      lda #FlashErr
      sta Err_Flag
doneEras:
      ais #2   ;deallocate end address
      rts

在汇编文件中定义 XDEF  Erase_Entry
在C语言中 XREF Erase_Entry,用JSR Erase_Entry就可以调用这个函数了
作者: zihongshu    时间: 2005-5-19 17:17

是啊,纯用汇编太麻烦了,用c的话写和擦的代码可以自己写,我现在觉的最麻烦的是程序初始化之后,把c的写和擦的代码拷到ram中再执行然后返回的程序不知怎么写,看汇编的话跳来跳去也不清楚,仁兄能不能给个调用的例子看看
作者: seuafu2005    时间: 2005-5-19 17:26

c的话我前面说过了,你可以看用processor expert生成的代码,那里面怎么用C来擦写,怎么到RAM中执行再返回都给出来了。
作者: zihongshu    时间: 2005-5-19 17:41

好啊,谢谢seuafu2005了,英文比较差,麻烦啊,不过seuafu2005是个好人啊,哈哈,答解了这么多问题,再次感谢啊!!!
作者: seuafu2005    时间: 2005-5-20 09:30

不客气:)
大家交流,共同进步
作者: zihongshu    时间: 2005-5-20 10:36

哈哈,搞定了,呵呵,看了那个processor expert生成的代码,很好玩啊,学到不少东西,呵呵,再次感谢seuafu2005、strongchen还有坛子上的其他兄弟!!!
作者: hapyhu    时间: 2005-6-23 20:30

谢谢!以上兄弟提供的信息!
作者: hapyhu    时间: 2005-6-23 20:49

你这程序用的是什么芯片阿!我把它弄到code warrior里不认FCMD、FSTAT_FCBEF




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0