Hallo !
Ich versuche grade im Zuge meines Projektes den Flash Speicher, im
einzelnen das 128 Byte große Flash Segment A im info Memory Bereich
(0x1980 - 0x19FF) zu Beschreiben bzw. zu lesen.
Dazu release ich erstmal den gesamten Info speicher über low setzen des
LOCKINFO Bits in FCTL4.
Als nächstes wird durch Togglen des LOCKA Bits im FCTL3 Register, das
Lock Bit für das Segment A ausser Kraft gesetzt. Ein einfaches auf 0
setzen des Bits im Register funktioniert laut Datenblatt nicht :
Datasheet:
>The state of the LOCKA bit is toggled when a 1 is written to it.
>Writing a 0 to LOCKA has no effect. This
>allows existing flash programming routines to be used unchanged.
Jedes Mal wenn ich jedoch in den Flash ab der Stelle 0x1980 schreiben
will, bekomme ich ein Access violation interrupt flag :(
Bei den älteren MSP´s läuft meine flashroutine leicht abgeändert ganz
passabel, ist auch glaub ich zusammengestrick aus TI Code schnipseln.
Jedoch finde ich d nix Zusammenhängendes auf der TI HP.
Vielleicht hat ja von euch jemand nen Tip was ich falsch mache :(
1 | #include "flash.h"
|
2 | #include <stdlib.h>
|
3 |
|
4 | //* ====================================================================== */
|
5 | //* Funktion um Flash zu beschreiben */
|
6 | //* ====================================================================== */
|
7 |
|
8 | void write_SegA(char offset,char *buf, unsigned char length) {
|
9 | WDTCTL = WDTPW + WDTHOLD;
|
10 | _DINT();
|
11 | FCTL4 = FWKEY;
|
12 | FCTL3 = FWKEY + LOCKA; // Toggle(Clear) Lock bit
|
13 |
|
14 | unsigned short i;
|
15 | Flash_ptr = (char *) 0x1980; // Initialisierung Flash Pointer
|
16 | Flash_ptr = Flash_ptr + offset; // Offset
|
17 |
|
18 | FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
|
19 | for(i=0; i < length; i++) {
|
20 | *Flash_ptr++ = buf[i]; // buffer kopieren
|
21 | _NOP(); // SET BREAKPOINT HERE (DEBUGGER)
|
22 | }
|
23 |
|
24 | FCTL1 = FWKEY; // Clear WRT bit
|
25 | FCTL3 = FWKEY + LOCKA; // Toggle(Set) LOCK bit
|
26 | FCTL4 = FWKEY + LOCKINFO; // Set LOCK bit
|
27 | _EINT();
|
28 | }
|
29 |
|
30 | //* ====================================================================== */
|
31 | //* Funktion um Flash zu lesen */
|
32 | //* ====================================================================== */
|
33 |
|
34 | void read_SegA(char offset,char *buffer, unsigned short laenge) {
|
35 |
|
36 | unsigned short i=0;
|
37 | Flash_ptr = (char *) 0x1980; // Initialisierung Flash Pointer
|
38 |
|
39 | Flash_ptr = Flash_ptr + offset; // Offset
|
40 | while(i < laenge) { // Flash lesen
|
41 | buffer[i] = *Flash_ptr++;
|
42 | i++;
|
43 | }
|
44 |
|
45 | }
|
Viele Grüße
Rex