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:
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
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.
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:
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:
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: