My code will crash in normal mode.But ok under SS mode.

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
已解决

My code will crash in normal mode.But ok under SS mode.

跳至解决方案
3,231 次查看
100asong
Contributor I

The code is here:

;Here parameters:
;1,params(byte); 2, ccob0high(byte); 3 ccob0low(byte);4 ccob1(word);5 ccob2(word);6 ccob3(word);7 ccob4(word);
;8 ccob5(word);9  ccob6(word);10 ccob7(word);
;LaunchComBuff: fixed memory to Program flash,the above parameter store in it.
LaunchFlashCommand:
  ;pshd
  ;pshx
  ;pshy
  leax LaunchComBuff,pcr
  ;jsr Delay32nop,pcr
  ;check FCLKDIV&0x80
  ldaa FCLKDIV
  brset FCLKDIV,#mFCLKDIV_FDIVLD,Wait_CCIF0 ;if set,jump
                                      ;else,run here
  ldaa #FCLK_DIV_4M                                     
  staa FCLKDIV
  ;if(FCLKDIV != (FCLK_DIV | 0x80))//Check to make sure value is written.
  ;ReportError(0);
  oraa  #$80
  cmpa FCLKDIV;check FCLKDIV is FCLK_DIV | 0x80
  bne ret_Launch;if not equ,return
 ; jsr Delay32nop,pcr
 
Wait_CCIF0:
  brclr FSTAT,#mFSTAT_CCIF,Wait_CCIF0;if this bit is 0x0,wait here. Wait a while for CCIF to be set

  brclr FSTAT,#mFSTAT_CCIF,ret_Launch;
 
  ldaa #$030
  staa FSTAT;Use store instruction to clear ACCERR, FPVIOL.
 ; jsr Delay32nop,pcr
  ;**********SET UP THE FTM COMMAND AND PARAMETERS***********
 
  clr FCCOBIX
  ;clra
  ldab 1,x
  stab FCCOBHI
  ;inca
  ldab 2,x
  stab FCCOBLO
  ldab 0,x
  beq Con_Oper;if param == 0,return

  ldaa #$03 
  ;jsr Delay32nop,pcr
Write_CCOB:
  nop
  nop
  inc FCCOBIX
  ldy a,x
  sty FCCOB;Write next word parameter to CCOB1 buffer.
  inca
  inca 
  decb     ;because register store param number
  beq Con_Oper;if b is 0,return 
  bra Write_CCOB

;The code in flash 
;Con_Oper:  
;  ldaa #$80
;  staa FSTAT
;Wait_CCIF:
;  brclr FSTAT,#mFSTAT_CCIF,Wait_CCIF    ;while (!FSTAT_CCIF);
Con_Oper:
  jsr PrgOfRam,pcr
       
wait_Here:
  brset FSTAT,#mFSTAT_ACCERR,wait_Here
  brset FSTAT,#mFSTAT_FPVIOL,wait_Here
  brset FSTAT,#mFSTAT_MGSTAT1,wait_Here
  brset FERSTAT,#mFERSTAT_ERSERIF,wait_Here
  brset FERSTAT,#mFERSTAT_PGMERIF,wait_Here
  brset FERSTAT,#mFERSTAT_EPVIOLIF,wait_Here
  brset FERSTAT,#mFERSTAT_ERSVIF1,wait_Here
  brset FERSTAT,#mFERSTAT_DFDIF,wait_Here
  brset FERSTAT,#mFERSTAT_SFDIF,wait_Here
  ;jsr Delay32nop,pcr


ret_Launch:
  ;puly
  ;pulx
  ;puld
  rts
;LaunchFlashCommand
;*************************************************************************************************************

 

 

It can run normally under BDM mode,but it will crash when we run it in normal mode.

Please help me.Thanks.

标签 (1)
0 项奖励
回复
1 解答
1,976 次查看
Lundin
Senior Contributor IV
The problem is that FCLKDIV is a "write-once" register, meaning you are only allowed to write to it once during program execution, after that it turns read-only. Solve this by doing all calculations in a temporary variable, which you write down to FCLKDIV when everything is ok. Special single chip mode overrides "write-once" behavior, so that's why it works in that mode.

在原帖中查看解决方案

0 项奖励
回复
8 回复数
1,977 次查看
Lundin
Senior Contributor IV
The problem is that FCLKDIV is a "write-once" register, meaning you are only allowed to write to it once during program execution, after that it turns read-only. Solve this by doing all calculations in a temporary variable, which you write down to FCLKDIV when everything is ok. Special single chip mode overrides "write-once" behavior, so that's why it works in that mode.
0 项奖励
回复
1,976 次查看
100asong
Contributor I

Hi,Sir

 

       Thanks for your help.

  

      I have 2 question:

 

1.

       I modified the code as followed.

       Just like code:

       ;IN BDM nmode,must use these 2 lines. It will write the flash sucessfully(I can find the data in debug momory window)
      ldab #48
      stab FSTAT;Use store instruction to clear ACCERR, FPVIOL.
      if I use   the following code:

      bset FSTAT,#mFSTAT_ACCERR
      bset FSTAT,#mFSTAT_FPVIOL

     Data can not been writen into flash.

 

     But in NS mode,I must use these 2 lines,or crash.
  bset FSTAT,#mFSTAT_ACCERR
  bset FSTAT,#mFSTAT_FPVIOL

 

2.

    IN BDM,I muse use memory data :smileytongue:rgOfRam:dc.b $1C,$01,$06,$80,$1F,$01,$06,$80,$FB,$3D, to replace the following code:

bset FSTAT,#mFSTAT_CCIF
Wait_CCIF:
brclr FSTAT,#mFSTAT_CCIF,Wait_CCIF;if this bit is 0x0,wait here. Wait a while for CCIF to be set   

 

 But in NS,if i use PrgOfRam,the code will crash.

 I must use these 3 lines in NS.

bset FSTAT,#mFSTAT_CCIF
Wait_CCIF:
brclr FSTAT,#mFSTAT_CCIF,Wait_CCIF;if this bit is 0x0,wait here. Wait a while for CCIF to be set   

 

But this way,NS can not write the data into flash successfully.

 

 

Please check the following code.

 

Thanks for your help.

Please give me support when you are free. I am urgent about it.

 

     

 

;*************************************************************************************************************
;stack to store parameter.
;Here parameters:
;1,params(byte); 2, ccob0high(byte); 3 ccob0low(byte);4 ccob1(word);5 ccob2(word);6 ccob3(word);7 ccob4(word);
;8 ccob5(word);9  ccob6(word);10 ccob7(word);
;LaunchComBuff: fixed memory to Program flash,the above parameter store in it.
LaunchFlashCommand: equ *
  ;pshd
  ;pshx
  ;pshy
  leax LaunchComBuff,pcr

 
Wait_CCIF0:
  brclr FSTAT,#mFSTAT_CCIF,Wait_CCIF0;if this bit is 0x0,wait here. Wait a while for CCIF to be set

  ;brclr FSTAT,#mFSTAT_CCIF,ret_Launch;
 
  ;BDM,must use these 2 lines. or CAN not write into flash.
  ;ldab #48
  ;stab FSTAT;Use store instruction to clear ACCERR, FPVIOL.
 
  ;NS,must use these 2 lines.or crash.
  bset FSTAT,#mFSTAT_ACCERR
  bset FSTAT,#mFSTAT_FPVIOL

  ;**********SET UP THE FTM COMMAND AND PARAMETERS***********
 
  bclr FCCOBIX,#mFCCOBIX_CCOBIX0
  bclr FCCOBIX,#mFCCOBIX_CCOBIX1
  bclr FCCOBIX,#mFCCOBIX_CCOBIX2
  ;clra
  ldab 1,x
  stab FCCOBHI
  ;inca
  ldab 2,x
  stab FCCOBLO
  ldab 0,x
  beq Con_Oper;if param == 0,return

  ldaa #$03 

Write_CCOB:
  nop
  nop
  inc FCCOBIX
  ldy a,x
  sty FCCOB;Write next word parameter to CCOB1 buffer.
  inca
  inca 
  decb     ;because register store param number
  beq Con_Oper;if b is 0,return 
  bra Write_CCOB

Con_Oper:
  ;BMD,use the following code,write ok.
  jmp PrgOfRam,pcr
 
  ;NS,use the following code,CAN communication is okay,but not write ok.
 
  ;bset FSTAT,#mFSTAT_CCIF
;Wait_CCIF:
 ; brclr FSTAT,#mFSTAT_CCIF,Wait_CCIF;if this bit is 0x0,wait here. Wait a while for CCIF to be set


ret_Launch:
  ;puly
  ;pulx
  ;puld
  rts
;LaunchFlashCommand
;*************************************************************************************************************

 

0 项奖励
回复
1,976 次查看
kef
Specialist I

1) It is not clear what does "crash" mean. Does MCU reset?

 

 

It is OK to clear error flags like this

 

  LDAB  #mFSTAT_ACCERR | mFSTAT_PVIOL

  STAB  FSTAT

 

Or like this

 

  MOVB   #mFSTAT_ACCERR | mFSTAT_PVIOL, FSTAT

 

But it is NOT OK to clear ACCERR this way

 

   BSET  FSTAT, #mFSTAT_ACCERR

 

In case CCIF flag is set, BSET will write "1" not only to ACCERR, but also to CCIF! You want to clear ACCERR, but code will write "1" also to CCIF, trying to launch flash command.

 

 

This code will clear only ACCERR

 

   BCLR   FSTAT, #~mFSTAT_ACCERR

 

 

2) Do you initialize bytes in RAM at PrgOfRam? dc.b directive is good to put some bytes to flash. But dc.b doesn't initialize RAM after power is applied to MCU. Debugger may load RAM once, but after power is removed PrgOfRam will be destroyed. You have to initialize it after MCU resets.

0 项奖励
回复
1,976 次查看
100asong
Contributor I

Thanks for your help.

   

        Crash means program run into accidental address,program breakdown.

 

 

My MCU is mc9s12xep100.

 

I define it like here:

    org $2100

PrgOfRam:dc.b $1C,$01,$06,$80,$1F,$01,$06,$80,$FB,$3D.

I thinks it is stored in   address from 0x2100.

You mean debug will load it once and then BDM is okay,but NS can not init it? The data will be destroyed in NS.

How to init it after reset in NS mode.How to replace of dc.b to define some constant in memory?

Please give me way,thanks.

 

0 项奖励
回复
1,976 次查看
kef
Specialist I

           org $2100

      PrgOfRam:dc.b $1C,$01,$06,$80,$1F,$01,$06,$80,$FB,$3D.

      I thinks it is stored in   address from 0x2100.

 

Yes, PrgOfRam is allocated at 0x2100. But ProgOfRam is allocated in RAM and thus you should initialize contents of PrgOfRam routine each time CPU resets. Allocate the copy of PrgOfRam in flash and copy it to PrgOfRam on reset.

 

0 项奖励
回复
1,976 次查看
100asong
Contributor I

In asm,can I finish it by the following code:

    org $FF0C

ProtectFlash: dc.b $CF,$FF,$FF,$FE.

I try it.But I found 0x00 at address 0xFF00-0xffff.

 

How can i do for this aim in asm.

Please help me.Thanks a lot.:smileyhappy:

 

AsongLi.

0 项奖励
回复
1,976 次查看
100asong
Contributor I

ok.I get to know.Thanks for your help:smileyindifferent:

0 项奖励
回复
1,976 次查看
100asong
Contributor I

THANKS.

0 项奖励
回复