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.
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.
Fuer neuere Ergebnisse einfach mal nach: Using HC908 On-Chip FLASH Programming Routines suchen.
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
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.