Hallo,
ich komme mit der Einrichtung der IAR-IDE für den STM32 (in meinem Fall
der STM32F108C8) nicht weiter. Ich versuche zu Beginn einfach einen GPIO
an zu schalten. Leider mag dieser Code nicht kompilieren:
1
#include"stm32f10x.h"
2
intmain()
3
{
4
GPIOB->ODR|=(1<<3);
5
GPIOB->CRH|=(1<<3);
6
return0;
7
}
Allerdings findet der Compiler (oder Linker) die Header-Datei nicht.
Könnte jemand bei der Einrichtung von IAR helfen? Ich möchte die
Standard-Peripheral-Library nicht benutzen!
Lies erstmal zum Gebrauch von:
#include "bla.h"
und
#include <bla.h>
Die *stm32f10x.h* gehoert zum CMSIS-Zweig der Stdlib.
Also tu die Stdlib zu Deinem Projekt dazu und
setze entsprechende Include-Suchverzeichnisse.
Vielleicht auch einmal die ST-Beispiele installieren.
Das tut IAR nicht mehr automatisch fuer alle CPU-Typen.
./. schrieb:> Also tu die Stdlib zu Deinem Projekt dazu und> setze entsprechende Include-Suchverzeichnisse.
Das hier hab ich unter 'Preprocessor' hinzugefügt:
$PROJ_DIR$\IncludeFiles\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries
allerdings wird die Datei nun immer noch nicht gefunden. Vielleicht wird
nur der angegebene Ordner und nicht rekursiv durchsucht?
Error[Pe147]:declarationisincompatiblewith"__nounwind __interwork __softfp unsigned short __LDREXH(unsigned short const volatile *)"(declaredatline187of"D:\Programme\IARWorkbench_STM32\arm\inc\c\intrinsics.h")D:\Dokumente\IARSTM32\IncludeFiles\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport\core_cm3.h1154
Error[Pe147]:declarationisincompatiblewith"__nounwind __interwork __softfp unsigned long __STREXH(unsigned short, unsigned short volatile *)"(declaredatline192of"D:\Programme\IARWorkbench_STM32\arm\inc\c\ D:\Dokumente\IARSTM32\IncludeFiles\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport\core_cm3.h 1186
12
intrinsics.h")
13
ErrorwhilerunningC/C++Compiler
Ich bin mir auch nicht ganz sicher, welche Zeile man in der stm32f10x.h
auskommentieren muss. Laut Homepage gehört der STM32F103C8 zur
'medium-density performance line family', also habe ich diese Zeile
auskommentiert:
1
#define STM32F10X_MD_VL */ /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */
Was für ein Aufwand um letztlich einen Wert an eine Stelle in den
Speicher zu schreiben... ;-)
Wie wäre es denn einfach mit:
(*(volatile unsigned int*)(0x123)) |= (1<<3);
0x123 ist dann die Addresse deines SFRs.
Oder auch
#define SFR (*(volatile unsigned int*)(0x123))
SFR |= (1<<3);
Guest schrieb:> Was für ein Aufwand um letztlich einen Wert an eine Stelle in den> Speicher zu schreiben... ;-)
Ja, finde ich auch. Vor allem das einrichten der IDE scheint sehr
aufwändig.
Guest schrieb:> 0x123 ist dann die Addresse deines SFRs.
Danke für den Tipp, ich mag aber nicht für jedes Register die Adresse
raussuchen, insbesondere wenn ich mich (in ferner Zukunft) mal an I2C,
UART oder ähnliches wage. Der Code wird dadurch nur noch unleserlicher.
Im Internet finde ich nur Tutorials zu den Discovery-Boards die
anscheinend schon extra Libraries mitliefern.
> Jetzt bekomme ich ganz komische Fehler:
Vermutlich musst Du noch das bordeigene CMSIS von IAR ausschalten.
Das inkludierst Du ja jetzt selbst.
Ein wenig Mitdenken wuerde nicht schaden...
./. schrieb:> Vermutlich musst Du noch das bordeigene CMSIS von IAR ausschalten.
Okay, hab ich gemacht. Da nun wiederum einige Dateien gefehlt haben, hab
ich diesen Ordnung noch hinzugefügt:
\IARWorkbench_STM32\arm\inc\c
Nun kommt wieder die Meldung "declaration is incompatible with
core_cm3.h..." für die Datei 'intrinsics.h'.
Sobald ich sie aber aus dem c-Ordner lösche, kommt das:
Also einerseits gibt es einen Konflikt zwischen 2 Dateien mit ähnlichen
Deklarationen, andererseits braucht der Compiler die Datei aber
anscheinend (wahrscheinlich weil sie durch eine andere Header-Datei
hinzugefügt wird)?
Max M. schrieb:> Danke für den Tipp, ich mag aber nicht für jedes Register die Adresse> raussuchen, insbesondere wenn ich mich (in ferner Zukunft) mal an I2C,> UART oder ähnliches wage. Der Code wird dadurch nur noch unleserlicher.
Wieso nicht? Du brauchst ja nicht tausend SFRs.
Sagen wir mal du musst 20 SFR Adressen raussuchen und die SFRs in deinem
Code definieren. Das sollten genug SFRs für Uart und I2C sein.
Damit bist du schneller fertig als dein jetztiges Gebastel und hast
verstanden, was du da eigentlich machst. Ich wüsste auch nicht wieso
dadurch der Code unleserlicher werden sollte. Ich mache das immer so und
ich verdiene meine Geld damit ;-).
Es kann doch nicht sein, dass man IAR nicht so einrichten kann, dass man
die Register nicht selber definieren muss :(
./. schrieb:> Ein wenig Mitdenken wuerde nicht schaden...
Ich hab noch nie mit IAR gearbeitet, sorry das ich etwas langsam bin.
Max M. schrieb:> Es kann doch nicht sein, dass man IAR nicht so einrichten kann, dass man> die Register nicht selber definieren muss :(
Was IAR bzw. der Compiler mit deinen SFRs zu tun? Der weiß nichts von
SFRs ;-).
Guest schrieb:> Was IAR bzw. der Compiler mit deinen SFRs zu tun? Der weiß nichts von> SFRs ;-).
Direkt hat IAR damit nichts zu tun. Aber indirekt schon, da ich keine
Lust habe, Registernamen selber zu definieren. Daher muss ich IAR bzw.
dem Compiler die Registernamen bzw. Adressen irgendwie mitteilen. Das
klappt bisher bei mir allerdings nicht so wirklich.
Max M. schrieb:> Direkt hat IAR damit nichts zu tun. Aber indirekt schon, da ich keine> Lust habe, Registernamen selber zu definieren. Daher muss ich IAR bzw.> dem Compiler die Registernamen bzw. Adressen irgendwie mitteilen. Das> klappt bisher bei mir allerdings nicht so wirklich.
Nö, auch indirekt nicht.
Die Include Dateien aus der ST Standard Peripheral Library machen auch
nichts anderes als das was ich dir vorgeschlagen habe. Und das wäre noch
der gute Fall. Es kann auch passieren das für ein simples Port Pin
setzen tausend Unterfunktionen aufgerufen mit 2000 undurchsichtigen
Makros.
Wenn du keine Lust hast die Registernamen selber zu definieren kann ich
dir leider auch nicht helfen.
AntiHeiner schrieb:>> Ja, finde ich auch. Vor allem das einrichten der IDE scheint sehr>> aufwändig.> Nur wenn man zu blöd dazu ist.
Nana, lasst uns nett bleiben. Max ist nicht blöd sondern einfach nur
unwissend.
Guest schrieb:> Wenn du keine Lust hast die Registernamen selber zu definieren kann ich> dir leider auch nicht helfen.
die Registernamen sind doch von STM definiert.z. B. in stm32f10x.h:
#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral
base */
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
Du musst die Datei nur einbinden, dann ist der Zugriff auf Register kein
Problem mehr.
IAR bekommt die Includes im uebrigen von ST zugeliefert.
Die aendern daran exakt gar nichts.
Bugreports bzgl. der Header landen demzufolge auch bei ST.
Der Umgang mit IAR ist suppenkasperleicht.
Meine Stdlib inkludiert keine intrinsics.
Max M. schrieb:> #define STM32F10X_MD_VL */ /*!< STM32F10X_MD_VL: STM32 Medium density> Value Line devices */
Zumindest in der hier geposteten Zeile hast du das zweite
Kommentarzeichen nicht entfernt.
Gibt auch lustige Fehler sowas.
grundschüler schrieb:> Du musst die Datei nur einbinden, dann ist der Zugriff auf Register kein> Problem mehr.
Hab ich gemacht, jetzt findet er eine "core_cm3.h" nicht, wenn ich die
hinzufüge findet er die nächste Headerdatei nicht usw...
./. schrieb:> Der Umgang mit IAR ist suppenkasperleicht.
Danke
chris schrieb:> Gibt auch lustige Fehler sowas.
Danke für den Hinweis, ändert aber leider nichts an der Fehlermeldung.
Max M. schrieb:> Hab ich gemacht, jetzt findet er eine "core_cm3.h" nicht, wenn ich die> hinzufüge findet er die nächste Headerdatei nicht usw...
Ich habe gerade die Tage CooCox Coide V1.7.8 installiert. Da finden sich
alle von dir gesuchten Dateien durch einfaches Anklicken auf Anhieb. Ist
wirklich einfach und anfängergeeignet.
Ansonsten benutz mal Ctrl-F/Suchfunktion um den Ordner zu finden, in dem
die fehlenden Dateien stehen. Dann den Ordner einbinden.
Wenn du die IDE wechseln möchtest, dann nimm direkt SEGGER Embedded
Studio, https://www.segger.com/embedded-studio.html.
Da bekommt du Packages für viele Device, das ist dann noch einfacher.
CMSIS besteht aus Core- und Devicespezifichen Dateien. Zu den
Corespezifischen Dateien gehört z.B. die core_cm3.h. Diese werden aber
auch vom IAR ausgeliefert und werden automatisch benutzt wenn die CMSIS
Checkbox in den Projektoptionen aktiviert ist.
Ansonsten kannst du auch also Vorlage einfach ein embOS Startprojekt
nehmen:
https://www.segger.com/embos-cortexm-iar.html
Das embOS kannst du ja dann aus dem Projekt raus schmeißen, wenn du kein
RTOS verwenden möchtest.
Guest schrieb:> Diese werden aber> auch vom IAR ausgeliefert und werden automatisch benutzt wenn die CMSIS> Checkbox in den Projektoptionen aktiviert ist.
Danke! Das war der entscheidende Hinweis. Hab das aktiviert, dann wurde
nur noch die "system_stm32f10x.h" nicht gefunden -> Ordner eingebunden
-> kompiliert.
Jetzt bekomme ich allerdings eine Fehlermeldung beim Downloaden:
Max M. schrieb:> Error while running LinkerMax M. schrieb:> Jetzt bekomme ich allerdings eine Fehlermeldung beim Downloaden:
Sicher? Klingt eher danach als ob du nicht linken könntest.
Hast du die IAR Flashloader Sourcen in deinem Projekt? Würde keinen Sinn
machen.
Was benutzt du denn als Debug Probe? Einen J-Link? Dann brauchst du
keinen IAR Flashloader und musst diesen in den Debug Settings
deaktivieren, "use flashloader" oder so ähnlich.
Guest schrieb:> Sicher? Klingt eher danach als ob du nicht linken könntest.
Anscheinend ist das Teil des Ablaufs wenn ich auf "Project -> Download
and Debug" gehe.
Guest schrieb:> Was benutzt du denn als Debug Probe? Einen J-Link?
Einen China ST-Link V2.
Guest schrieb:> Hast du die IAR Flashloader Sourcen in deinem Projekt?
Nope, in meinem Project ist nur die main.c - Datei, eine
"stm32f103x8.icf" und eine "stm3210x.h".
Okay, der Fehler war, dass die stm32f10x.h in den Linker-Optionen als
Library eingetragen war (was sie natürlich nicht ist). Hab sie entfernt,
jetzt klappt der "Make"-Prozess auch.
Beim Downloaden bekomme ich jetzt die Fehler:
Ich bin leider immer noch nicht weiter. Da in den Fehlermeldungen von
IAR auch stand, dass die Firmware des ST-Link veraltet ist, hab ich sie
geupdated (hat mich gewundert, dass das mit dem China-Teil funktioniert
hat). Trotzdem kommt immer noch der gleiche Fehler der veralteten
Firmware und Upload klappt immer noch nicht:
> Wie ich in meinem Beitrag schrieb, hab ich die Firmware bereits> geupdated.
Warum dann nicht mit einer aktuelleren Version?
Z.B. die mit beim IAR dabei ist wuerde wohl schon reichen.
Zu alt bleibt zu alt.
Ich bin mittlerweile auf CooCox umgestiegen, mein Code kompiliert so
weit, beim Downloaden bekomme ich aber wiederum eine Fehlermeldung:
1
D:\Programme\CoIDE_V2Beta>"D:/Programme/CoIDE_V2Beta/bin\coflash.exe" program STM32F103C8T6 "D:/Programme/CoIDE_V2Beta/ProjectFolder/STM32F103C8T6TestProject/STM32F103C8T6TestProject/Debug/bin/STM32F103C8T6TestProject.elf" --adapter-name=ST-Link --port=SWD --adapter-clk=1000000 --erase=affected --reset=SYSRESETREQ --driver="C:\Users\Standardbenutzer\AppData\Roaming\CooCox\CoIDE\config\flash\CooCox-Flash\CoIDE_STM32F1xx_MD_64K\STM32F10x_MD_64.elf"
2
Erase: Done
3
Program: Failed
4
Error: Flash driver function execute error
Wieder das gleiche wie bei IAR: Der Controller stoppt sein Default-Blink
Programm, erst nach Strom ab / an blinkts wieder. Muss man vllt. die 2
Jumper, die auf dem Board drauf sind, irgendwie platzieren so dass er
sich programmieren lässt?
Guest schrieb:> Sagen wir mal du musst 20 SFR Adressen raussuchen und die SFRs in deinem> Code definieren. Das sollten genug SFRs für Uart und I2C sein.
Er muss gar nix raussuchen wenn er einfach den mitgelieferten Header von
STM verwendet.
Kann es sein, dass entweder das STM32-Board oder der ST-Link V2 (obwohl
sich der noch mit neuer Firmware flashen lässt) defekt ist? Hat jemand
Informationen dazu, was ich mit den beiden Jumpern machen muss? Im
Internet finde ich nichts diesbezüglich.
Oder liegts vllt. an einer falschen Auskommentierung in der
'stm32f10x.h'?
Die sieht so aus:
Max M. schrieb:> Hat jemand> Informationen dazu, was ich mit den beiden Jumpern machen muss?
In dem Zustand in dem die Jumper waren als Du es ausgepackt hast
funktioniert es. So kenn ich es zumindest von diesen Boards.
Wenn ich mit der ST-Link Utility auf das Device connecten will, kommt
die Meldung "Can not read memory! Disable Read Out Protection and
retry.". Die Device ID sowie die Device family wird allerdings
ausgelesen. Wie schalte ich die Read Out Protection aus, geht das
überhaupt?
Edit: Es geht über "Target" -> "Option Bytes" -> ganz oben "Read Out
Protection". Hab dann noch ein "Target" -> "Erase Chip" gemacht.
Und...Programmieren geht! 2 Monate später und es klappt...Wahnsinn...