MC9S08QG8 Flash Nutzung

OP #7508695
Lesenswert?

Ich möchte die Arbeit mit dem MC9S08QG8 wieder aufnehmen. Als nächsten Schritt will ich den Flash benutzen (Kapitel 4.5 des Data Sheet). Da wäre es natürlich hilfreich, wenn ich einige Zeilen Assembler für die Flash Nutzung finden könnte. Gibt es hier im Forum Anwender des HCS08QG8. Dann würde ich mir hier gern auf die Sprünge helfen lassen.

MfG Gerd M.

#7508793
Lesenswert?

Gerd M. schrieb:

Ich möchte die Arbeit mit dem MC9S08QG8 wieder aufnehmen. Als nächsten Schritt will ich den Flash benutzen (Kapitel 4.5 des Data Sheet). Da wäre es natürlich hilfreich, wenn ich einige Zeilen Assembler für die Flash Nutzung finden könnte. Gibt es hier im Forum Anwender des HCS08QG8. Dann würde ich mir hier gern auf die Sprünge helfen lassen.

MfG Gerd M.

Den Flash benutzt der Controller ja eigentlich von allein. Und beschreiben tut man ihn per BDM-Adapter.

Hilfreich vielleicht: AN1831 - Using MC68HC908 On-Chip FLASH Programming Routines

Im weiteren: AN2305, AN2317, AN2322.

Aber Achtung: Die betreffen aeltere HC08 mit u.U. anderen Registern zur Flashkonfiguration.

Programme die den Flash loeschen und schreiben, muessen aus dem RAM laufen.

#7509049
Lesenswert?

Zuerst FCDIV mit dem zur Taktfrequenz passenden Wert beschreiben. Der folgende Code (für AS) schreibt dann 0xAA an die Adresse 0xE000.

1
        lda    #$30             ;clear all errors
2
        ldhx   #$E000           ;Addr
3
        lda    #$AA             ;Data
4
        sta    ,X
5
        lda    #$20             ;prog byte
6
        sta    FCMD
7
        lda    #$80
8
        sta    FSTAT
9
fwait:  lda    FSTAT
10
        and    #$40             ;FCCF
11
        beq    fwait

Jörg

OP #7510589
Lesenswert?

Danke für die Antwort. Wenn Du dich mit dem MC9S08QG8 oder wenigstens mit der Familie MC9S08.. würde ich mich sehr freuen. Bisher konnte ich nur im NXP-Forum Kontakte finden.

Bevor ich an Deinen Code gehe, werde ich noch etwas Datasheet oder AN3942 büffeln, damit ich verstehe was ich mache.

Bis bald und mit freundlichen Grüßen Gerd M.

OP #7544385
Lesenswert?

Hallo Jürgen, danke nochmals für Deine Programmzeilen. Seit dem 4.10.23, als Du mir schriebst, ist eine lange Zeit vergangen, zuerst sinnvoll mit dem Lesen des HCS08 Data Sheet, Kapitel 4.5 u.4.7. Dann klappte es auch mit dem Schreiben eines Byte, aber nicht fortlaufend mehrere. Auch die Abfrage von FACCERR oder die Warteschleife mit FCCF brachte nichts. Lange habe ich mich mit debug und alles mögliche ausprobiert, jetzt komme ich ohne Hilfe nicht mehr weiter. Das Programm muss noch deutliche Fehler haben. Das byteweise Programmieren funktioniert zuverlässig, aber nur mit einem Breakpoint in der Zeile M2: incx und mit den angegebenen nops. Den Flash habe ich mit der CW-Debugroutine gelöscht. Nun hoffe ich, dass Du mir helfen kannst. Mit freundlichen Grüßen Gerd

Angehängte Dateien:
#7544530
Lesenswert?

Gerd M. scihrieb im Beitrag #7544385:

Hallo Jürgen, danke nochmals für Deine Programmzeilen. Seit dem 4.10.23, als Du mir schriebst, ist eine lange Zeit vergangen, zuerst sinnvoll mit dem Lesen des HCS08 Data Sheet, Kapitel 4.5 u.4.7. Dann klappte es auch mit dem Schreiben eines Byte, aber nicht fortlaufend mehrere. Auch die Abfrage von FACCERR oder die Warteschleife mit FCCF brachte nichts. Lange habe ich mich mit debug und alles mögliche ausprobiert, jetzt komme ich ohne Hilfe nicht mehr weiter. Das Programm muss noch deutliche Fehler haben. Das byteweise Programmieren funktioniert zuverlässig, aber nur mit einem Breakpoint in der Zeile M2: incx und mit den angegebenen nops. Den Flash habe ich mit der CW-Debugroutine gelöscht. Nun hoffe ich, dass Du mir helfen kannst. Mit freundlichen Grüßen Gerd

Hallo Gerd,

ich bin zwar nicht Juergen, aber der Fehler ist offensichtlich:

Programme die den Flash loeschen und schreiben, muessen aus dem RAM laufen.

Es gibt dazu auch ein Beispiel im "HCS08QRUG - HCS08 Peripheral Module Quick Reference". Das Dokument wird bei einer Codewarriorinstallation unter Help/PDF/HCS08_Peripherals_Module_Quick_Reference_Users_Guide.pdf abgelelgt. In dem Beispiel dort, wird der gesamte Code aus einem Array in den RAM geladen und dann dort gestartet. S. 92:

1
//Array of opcode instructions of the Erase/Program function
2
void MCU_init(void)
3
{
4
  /* ### MC9S08QG8_16 "Cpu" init code ... */
5
  /*  PE initialization code after reset */
6
  /*  System clock initialization */
7
  /* SOPT1: COPE=0,COPT=1,STOPE=0,BKGDPE=0,RSTPE=0 */
8
  SOPT1 = 0x50;                                      
9
  /* SPMSC1: LVDF=0,LVDACK=0,LVDIE=0,LVDRE=1,LVDSE=1,LVDE=1,BGBE=0 */
10
  ICSC1 = 0x04;                        /* Initialization of the ICS control register 1 */
11
  /* ICSC2: BDIV=1,RANGE=0,HGO=0,LP=0,EREFS=0,ERCLKEN=0,EREFSTEN=0 */
12
  ICSC2 = 0x40;                        /* Initialization of the ICS control register 2 */
13
  /* Common initialization of the write once registers */
14
  /* SOPT2: COPCLKS=0,IICPS=0,ACIC=0 */
15
  SOPT2 = 0x00;                                      
16
  /* FCDIV: DIVLD=0,PRDIV8=0,DIV5=0,DIV4=1,DIV3=0,DIV2=0,DIV1=1,DIV0=1 */
17
  FCDIV = 0x13; 
18
It is very important to know that before the programming/erasing subroutine is called the stack is 
19
being used to store the byte to be programmed in the Accumulator and the address to program in 
20
the HX register. After the subroutine is finished, an error variable is stored in the accumulator (if 
21
it is 0xFF, an error occurred)
22
//Array of opcode instructions of the Erase/Program function
23
//Element 0x14 of the array is: (command 0x20 to program a byte, 0x40 to erase a page)
24
unsigned char FLASH_CMD[] {
25
0x87,0xC6,0x18,0x25,0xA5,0x10,0x27,0x08,0xC6,0x18,0x25,0xAA,0x10,0xC7,0x18,0x25,
26
0x9E,0xE6,0x01,0xF7,0xA6,0x20,0xC7,0x18,0x26,0x45,0x18,0x25,0xF6,0xAA,0x80,0xF7,
27
0x9D,0x9D,0x9D,0x9D,0x45,0x18,0x25,0xF6,0xF7,0xF6,0xA5,0x30,0x27,0x04,0xA6,0xFF,
28
0x20,0x07,0xC6,0x18,0x25,0xA5,0x40,0x27,0xF9,0x8A,0x81};
29
/* The opcode above represents this set of instructions
30
if (FSTAT&0x10){ //Check to see if FACCERR is set
31
FSTAT = FSTAT | 0x10; //write a 1 to FACCERR to clear
32
}
33
(*((volatile unsigned char *)(Address))) = data; //write to somewhere in flash
34
FCMD = 0x20;                           //set command type.
35
FSTAT = FSTAT | 0x80;  //Put FCBEF at 1.
36
_asm NOP; //Wait 4 cycles
37
_asm NOP;
38
_asm NOP;
39
_asm NOP;
40
if (FSTAT&0x30){ //check to see if FACCERR or FVIOL are set
41
return 0xFF; //if so, error.
42
}
43
while ((FSTAT&0x40)==0){ //else wait for command to complete
44
;
45
}*/
46
3. Disable interrupts to permit execution of the code
47
DisableInterrupts;
48
4. Cycle that writes a byte form value 0 to 127
49
for(counter=0;counter<=127;counter++)
50
{
51
Program(0x1200 + counter, counter);
52
}
53
5. Program one byte in the Flash memory
54
void Program(int Address, unsigned char data){
55
unsigned char dummy;
56
asm jsr FLASH_CMD; //jumps to where the Program Routine is located at
57
asm sta dummy;
58
if (dummy == 0xFF){
59
asm NOP; } //An error occurred during the Programming of the FLASH
60
}

Viel Erfolg!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren