Forum: Mikrocontroller und Digitale Elektronik MC9S08QG8 Flash Nutzung


von Gerd M. (mei)


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.

von Harry H. (hhh)


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.

von Harry H. (hhh)


Lesenswert?

Fuer neuere Ergebnisse einfach mal nach:
Using HC908 On-Chip FLASH Programming Routines
suchen.

von Joerg W. (joergwolfram)


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

von Gerd M. (mei)


Lesenswert?

Danke für Deine Antworten. Die betreffen aber den MC68HC908,
mit dem ich vorher gearbeitet habe.
Ich suchte für MC9S08QG8 mit dem ich jetzt arbeite.
Für den habe ich mit AN3942 gefunden, was ich suchte:
Flash Programming Routines for the HCS08 . . .

MfG Gerd M.

von Gerd M. (mei)


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.

von Gerd M. (mei)


Angehängte Dateien:

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

von Harry H. (hhh)


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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.