Forum: Mikrocontroller und Digitale Elektronik STR912FW44 startup-Dilemma


von Sven Wagner (Gast)


Lesenswert?

Hallo,

ich habe hier das Minimodul MMstr912 von propox [1], worauf ein 
STR912FW44 von STM verbaut ist. Die Briefmarke sitzt auf dem zugehörigen 
Trägerboard EVBmm, auch von propox.

Dort habe ich Masse, Vcc und Vbatt mit dem Minimodul verbunden. Ebenso 
die JTAG-Leitungen. Die LEDs des Trägerboards sind mit Port 8.0 bis 8.7 
des STR912 verbunden. Als Programmer/Debugger habe ich einen Segger 
JLink.

Als Entwicklungsumgebung verwende ich Yagarto und Makefiles unter 
cygwin/Windows 7.

.elf und .bin kann ich bauen, auch den JLink gdb-Server konnte ich 
überzeugen mein Programm (blinky) zu flashen.

Leider scheint mein Startup-Code nicht zu stimmen, weil der STR912 in 
den seltesten Fällen richtig anläuft.

Problematisch scheint die Konfiguration des Flashcontrollers (FMI_SETUP 
= 1) zu sein. Hier mal ein kurzer gdb log:
1
(arm-gdb)204 STR R1, [R0, #FMI_BBADR_OFS] 
2
(arm-gdb)205 LDR R1, =FMI_BBSR_Val 
3
(arm-gdb)206 STR R1, [R0, #FMI_BBSR_OFS] 
4
(arm-gdb)207 LDR R1, =(FMI_NBBADR_Val >> 2) 
5
(arm-gdb)208 STR R1, [R0, #FMI_NBBADR_OFS] 
6
(arm-gdb)209 LDR R1, =FMI_NBBSR_Val 
7
(arm-gdb)210 STR R1, [R0, #FMI_NBBSR_OFS] 
8
(arm-gdb)212 LDR R2, =FMI_CR_Val 
9
(arm-gdb)213 STR R2, [R0, #FMI_CR_OFS] 
10
(arm-gdb)214 LDR R2, =FMI_SR_Val 
11
(arm-gdb)215 STR R2, [R0, #FMI_SR_OFS] 
12
(arm-gdb)218 MOV R0, R1, LSL #2 
13
(arm-gdb)219 MOV R1, #0x60 
14
(arm-gdb)220 STRH R1, [R0, #0] 
15
(arm-gdb)223 LDR R2, =(FLASH_CFG_Val >> 2) 
16
(arm-gdb)224 ADD R0, R0, R2 
17
(arm-gdb)124 LDR PC, Undef_Addr /* 0x0004 */
Er scheint beim ADD auszusteigen. Aber ADD und Undef_Addr passt 
irgendwie nicht zusammen.

Hier ist der Abschnitt aus der startup_912.S:
1
 
2
.equ FLASH_CFG_Val , 0x00001010 /* WSTATES = 3, buscfg = 1 */ 
3
4
...
5
6
#*************************************************************************
7
# Setup Flash Memory Interface (FMI) 
8
.IF FMI_SETUP == 1 
9
  LDR R0, =FMI_BASE 
10
  LDR R1, =(FMI_BBADR_Val >> 2) 
11
  STR R1, [R0, #FMI_BBADR_OFS] 
12
  LDR R1, =FMI_BBSR_Val 
13
  STR R1, [R0, #FMI_BBSR_OFS] 
14
  LDR R1, =(FMI_NBBADR_Val >> 2) 
15
  STR R1, [R0, #FMI_NBBADR_OFS] 
16
  LDR R1, =FMI_NBBSR_Val 
17
  STR R1, [R0, #FMI_NBBSR_OFS] 
18
  LDR R2, =FMI_CR_Val 
19
  STR R2, [R0, #FMI_CR_OFS] 
20
  LDR R2, =FMI_SR_Val 
21
  STR R2, [R0, #FMI_SR_OFS] 
22
23
  # Write "Write flash configuration" command (60h) 
24
  MOV R0, R1, LSL #2 
25
  MOV R1, #0x60 
26
  STRH R1, [R0, #0] 
27
  
28
  # Write "Write flash configuration confirm" command (03h) 
29
  LDR R2, =(FLASH_CFG_Val >> 2) 
30
  ADD R0, R0, R2 
31
  MOV R1, #0x03 
32
  STRH R1, [R0, #0] 
33
.ENDIF

Hier ist das Log vom JLink:
1
Select adaptive clocking instead of fixed JTAG speed 
2
Target endianess set to "little endian" 
3
Resetting target 
4
Select flash device: STR912FAW44 
5
Flash breakpoints enabled 
6
Flash download enabled 
7
Halting target CPU... 
8
...Target halted (PC = 0x00000000) 
9
Downloading 16224 bytes @ address 0x00000000 - Verified OK 
10
Downloading 16304 bytes @ address 0x00003F60 - Verified OK 
11
Downloading 948 bytes @ address 0x00007F10 - Verified OK 
12
Downloading 48 bytes @ address 0x000082C4 - Verified OK 
13
Downloading 224 bytes @ address 0x000082F4 - Verified OK 
14
Downloading 2128 bytes @ address 0x000083D4 - Verified OK 
15
Reading all registers 
16
Read 4 bytes @ address 0x00000000 (Data = 0xE59FF018) 
17
Performing single step... 
18
...Target halted (PC = 0x00000058) 
19
Reading all registers 
20
Read 4 bytes @ address 0x00000058 (Data = 0xE59F1118) 
21
Read 4 bytes @ address 0x00000070 (Data = 0xE3800008) 
22
Setting breakpoint @ address 0x00000070, Size = 4, BPHandle = 0x0088 
23
Starting target CPU... 
24
...Breakpoint reached @ address 0x00000070

Wenn ich das Flash-Setup deaktiviere (FMI_SETUP = 0) steigt er beim 
Initialisieren der data-section aus:
1
(arm-gdb) 
2
354 copy_section2 data, _efixed, _srelocate, _erelocate _startup () at startup912.S:127 
3
127 LDR PC, DAbt_Addr /* 0x0010 */ 
4
DAbt_Handler () at startup912.S:150 
5
150 DAbt_Handler: B DAbt_Handler

Den hohen Takt (96 MHz) wollte ich erst (bei Bedarf) im C-Programm 
initialisieren.

Hat da jemand eine Idee, was ich an der Initialisierung ändern muß, 
damit sie läuft? Oder hat jemand auch so ein Board/Chip und könnte mal 
gucken, wie dort die Initialisierung abläuft?

Viele Grüße,
Sven Wagner


[1] http://www.propox.com/products/t_163.html?lang=en

von (prx) A. K. (prx)


Lesenswert?

Der Crash dürfte eine verzögerte Reaktion auf den vorherigen 
Store-Befehl sein:
   STRH R1, [R0, #0]
Da dieser Befehl in eine bestimmte Flash-Bank schreiben muss, ist es 
unabdingbar, dass die Initialisierungswerte wie FMI_BBADR_Val zum 
Memory-Layout des verwendeten STR9 passen.

Passen die Werte nicht, weil für ein Modell mit anderer Flash-Grösse 
vorgesehen, dann landet der Store entweder in der falschen Bank, was dem 
Code den Teppich unter den Füssen wegzieht, oder jenseits vom Flash im 
Nirvana.

von Sven Wagner (Gast)


Lesenswert?

A. K. schrieb:
> Der Crash dürfte eine verzögerte Reaktion auf den vorherigen
> Store-Befehl sein:
>    STRH R1, [R0, #0]
> Da dieser Befehl in eine bestimmte Flash-Bank schreiben muss, ist es
> unabdingbar, dass die Initialisierungswerte wie FMI_BBADR_Val zum
> Memory-Layout des verwendeten STR9 passen.
Klingt logisch. Laut Datenblatt habe ich 512kB + 32kB Flash (und 96kB 
RAM).
Daher die folgenden Werte:
1
BBSR   = 0x4      /* configure 512KB Boot bank 0 */
2
NBBSR  = 0x2      /* configure 32KB Non Boot bank 1 */
3
BBADR  = (0x00000000 >> 2)  /* Boot Bank Base Address */
4
NBBADR = (0x00080000 >> 2)  /* Non Boot Bank Base Address */
5
CR     = 0x18      /* Flash Banks 0 1 enabled */
6
SR     = 0x0B      /* Clear status RM0006 1.10.6 */
Wenn ich nur diese Werte konfiguriere funktioniert es.

Es knallt aber im folgenden Codeabschnitt:
1
.equ   FLASH_CFG_Val   ,     0x00001010      /* WSTATES = 3, buscfg = 1 */
2
3
    # Write "Write flash configuration" command (60h)
4
    MOV     R0, R1, LSL #2
5
    MOV     R1, #0x60
6
    STRH    R1, [R0, #0]
7
8
    # Write "Write flash configuration confirm" command (03h)
9
    LDR     R2, =(FLASH_CFG_Val >> 2)
10
    ADD     R0, R0, R2
11
    MOV     R1, #0x03
12
    STRH    R1, [R0, #0]

Laut PM0020 (STR91xFA Flash programming manual) Kapitel 1.13.6 werden 
damit die Waitstates gesetzt und der Flashbus auf hohe Geschwindigkeit 
getrimmt.
Das scheint irgendwie nicht zu klappen. Mich wundert auch der 
Rechtsshift. Bei ST 
(http://www.st.com/mcu/modules/Splatt_Forums/downloadtemp/STR91x.s) wird 
dafür ein Linksshift verwendet:
1
    ; Write "Write flash configuration" command (60h)
2
    MOV     R0, R1, LSL #2
3
    MOV     R1, #0x60
4
    STRH    R1, [R0, #0]
5
6
    ; Write "Write flash configuration confirm" command (03h)
7
    LDR     R2, =(FLASH_CFG_Val:SHL:2)
8
    ADD     R0, R0, R2
9
    MOV     R1, #0x03
10
    STRH    R1, [R0, #0]
Der Code bleibt auch hängen, wenn FLASH_CFG_VAL = 0 ist. Default sollte 
laut PM0020 0x24CF sein. Ich habe es aber nicht probiert.

Ich habe diesen Abschnitt jetzt auskommentiert und mache das Ganze im 
C-Teil:
1
   FMI_Config(FMI_READ_WAIT_STATE_2, FMI_WRITE_WAIT_STATE_0, FMI_PWD_ENABLE,\
2
               FMI_LVD_ENABLE, FMI_FREQ_HIGH); /* FMI Waite States */

Damit läuft bisher alles wie erwartet.

Grüße
Sven

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.