[求助]不用C demo了,还是自己写吧,版主和其他兄弟来看看我的程序还有几个问题
- UID
- 111109
- 性别
- 男
|
[求助]不用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] |
|
|
|
|
|
- UID
- 104631
- 性别
- 男
|
你写的代码基本上没什么问题.
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编辑过] |
|
|
|
|
|
- UID
- 111109
- 性别
- 男
|
我现在想调用HCS08RMV11.pdf中的例程序,页擦除,字节写,还用搬运程序,我把它们用asm{}合起来,设两个参数,地址和数据,我观察了一下,地址是送到hx中,数据送到a中,这样直接调用请问可以吗?楼上的能不能流个联系方式? |
|
|
|
|
|
- UID
- 104631
- 性别
- 男
|
对,正是如此。
我的email是 seuafu2002@yahoo.com.cn
你还可以下载AN2140应用笔记的软件,有比较完整的代码。HCS08RMV1.pdf中的例子程序和An2140软件中的是一样的。 |
|
|
|
|
|
- UID
- 111109
- 性别
- 男
|
谢谢了,可是我用了一下,编译出现了很多错误,错误大多是这类错误,像对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)
}
}
谢谢楼上! |
|
|
|
|
|
- UID
- 104631
- 性别
- 男
|
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就可以调用这个函数了 |
|
|
|
|
|
- UID
- 111109
- 性别
- 男
|
是啊,纯用汇编太麻烦了,用c的话写和擦的代码可以自己写,我现在觉的最麻烦的是程序初始化之后,把c的写和擦的代码拷到ram中再执行然后返回的程序不知怎么写,看汇编的话跳来跳去也不清楚,仁兄能不能给个调用的例子看看 |
|
|
|
|
|
- UID
- 104631
- 性别
- 男
|
c的话我前面说过了,你可以看用processor expert生成的代码,那里面怎么用C来擦写,怎么到RAM中执行再返回都给出来了。 |
|
|
|
|
|
- UID
- 111109
- 性别
- 男
|
好啊,谢谢seuafu2005了,英文比较差,麻烦啊,不过seuafu2005是个好人啊,哈哈,答解了这么多问题,再次感谢啊!!! |
|
|
|
|
|
- UID
- 104631
- 性别
- 男
|
|
|
|
|
|
- UID
- 111109
- 性别
- 男
|
哈哈,搞定了,呵呵,看了那个processor expert生成的代码,很好玩啊,学到不少东西,呵呵,再次感谢seuafu2005、strongchen还有坛子上的其他兄弟!!! |
|
|
|
|
|
- UID
- 102514
- 性别
- 男
|
|
|
|
|
|
- UID
- 102514
- 性别
- 男
|
你这程序用的是什么芯片阿!我把它弄到code warrior里不认FCMD、FSTAT_FCBEF |
|
|
|
|
|