Hi, ich habe hier ein Problem mit meinem Keil-Board. Es ist ein MCBSTM32 mti einem ARMSTM32F103. Mein Ziel war es eine LED (am Port B) einzuschalten, wenn ein Eingang 1 ist. Wenn nicht, sollte eine andere LED leuchten. Ich habe folgenden Quellcode geschrieben: #include <stm32f10x_lib.h> // STM32F10x Library Definitions #include "STM32_Init.h" // STM32 Initialization int main (void) { stm32_Init (); // STM32 setup while (1) { if(GPIO_ReadInputData(GPIOA) == 0x1){ GPIO_SetBits (GPIOB, GPIO_Pin_8); GPIO_ResetBits (GPIOB, GPIO_Pin_15); } else{ GPIO_SetBits (GPIOB, GPIO_Pin_15); GPIO_ResetBits (GPIOB, GPIO_Pin_8); }; } // end while } // end main Es ist wenigstens Pin_15 eins. Aber die Funktion ist nicht gegeben Was mache ich falsch?
>stm32_Init ();
Zeigen!
Ich hoffe, Du konfigurierst dort die GPIOs und schaltest die GPIO-Takte
ein usw.
> if(GPIO_ReadInputData(GPIOA) == 0x1){
Wohl nur erfolgreich wenn, alle 16 Bits vom Port genau den Zustand
0000.0000.0000.0001 haben.
Hier ist das Ding. Ich bin der Meinung das ist richtig. Aber mal sehen. MFG Jan
@A.K. Schon richtig. Ich denke aber so sollte das wohl sein. Muss ich das am Anfang irgendwie initialisieren? Port A hat halt nunmal nur 16bit. Wo kommt der Rest in dem Register her? MFG Jan
Jan Schulze schrieb: > Schon richtig. Wenn Pin 15 eins ist, dann wird diese Abfrage immer falsch ein.
Oh, jaaa. Wie richtig. Man, manchmal sieht man den Wald vor lauter Bäumen nicht. Danke. Aber nun, was mache ich da?
Anfängertutorial zu Controller-Programmierung anhand eines STM32 lesen. Hoffentlich gibts das. Wenn nicht, dann den STM32 in den Schrank legen und die Grundlagen der Controller-Programmierung mit AVR lernen. Denn damit gibts jedenfalls eines.
Jan Schulze schrieb: > @A.K. > Schon richtig. Ich denke aber so sollte das wohl sein. Muss ich das am > Anfang irgendwie initialisieren? Port A hat halt nunmal nur 16bit. Wo > kommt der Rest in dem Register her? > > MFG > Jan Hallo Jan! Deine if-Abfrage ist falsch. Du willst ja wissen ob ein Pin des gesamten Port A gesetzt ist, daher muss deine Abfrage lauten if (GPIO_ReadInputData(GPIOA) & (uint16_t) 0x1111) mfg
Hi, keine Lust mir dieses Godfile durchzulesen ! Aber wenn du das so machst sollte es quick and dirty gehen.
1 | #include <stm32f10x_lib.h> |
2 | #include "STM32_Init.h" |
3 | |
4 | int main (void) |
5 | {
|
6 | stm32_Init (); |
7 | |
8 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2_Periph_GPIOB); |
9 | |
10 | GPIO_InitTypeDef GPIO_InitStructure; |
11 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; |
12 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; |
13 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; |
14 | GPIO_Init(GPIOA, &GPIO_InitStructure); |
15 | |
16 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; |
17 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_15; |
18 | GPIO_Init(GPIOB, &GPIO_InitStructure); |
19 | |
20 | while (1) |
21 | {
|
22 | |
23 | if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0); |
24 | {
|
25 | GPIO_WriteBit(GPIOB, GPIO_Pin_8, Bit_SET); |
26 | GPIO_WriteBit(GPIOB, GPIO_Pin_15, Bit_RESET); |
27 | }
|
28 | else
|
29 | {
|
30 | GPIO_WriteBit(GPIOB, GPIO_Pin_15, Bit_SET); |
31 | GPIO_WriteBit(GPIOB, GPIO_Pin_8, Bit_RESET); |
32 | }
|
33 | } // end while |
34 | |
35 | return 0; |
36 | } // end main |
P.S: alles ausm Kopf also ohne Gewähr Gruß
@Norminator Das habe ich schon versucht. Jetzt ist Pin 8 dauerhaft an.
Apropo, je nachdem ob der Taster auf VCC oder GND schaltet, musste du diese Zeile ändern:
1 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //GPIO_Mode_IPU; |
Gruß
@Jean Player: danke für deine Hilfe. Leider geht es so auch nicht erst wollte der Compiler den Code nicht, hab dann in den Examples nachgeschaut, wegen der Formulierungen. Dann sah der Code so aus: #include <stm32f10x_lib.h> #include "STM32_Init.h" GPIO_InitTypeDef GPIO_InitStructure; int main (void) { stm32_Init (); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); while (1) { if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) { GPIO_WriteBit(GPIOB, GPIO_Pin_8, Bit_SET); GPIO_WriteBit(GPIOB, GPIO_Pin_15, Bit_RESET); } else { GPIO_WriteBit(GPIOB, GPIO_Pin_15, Bit_SET); GPIO_WriteBit(GPIOB, GPIO_Pin_8, Bit_RESET); }; } // end while return 0; } // end main Das konnte ich dann flashen jetzt tut sich aber immer noch nichts Hab auch schon PU und PD ausprobiert.
@stm32 user: deine Variante nimmt der Compiler nicht. Ich hab die Vorgehensweise auch nicht verstanden, wenn ich ehrlich sein soll
Sieht eigentlich Ok aus, oder bist Du an falschen Pins? Die stm32_Init() sieht aber komisch aus? Wenn Du die STM FW LIB nimmst, solltest Du auch die dortige INIT nehmen und die richtigen Startup-Files. Oder versuch mal diese (für externen Quarz 8MHz gedacht):
1 | //***********************************************************************************************
|
2 | // System-Einstellungen
|
3 | //***********************************************************************************************
|
4 | void SetupSystem (void) { |
5 | |
6 | RCC_DeInit (); // RCC System Reset(for debug purpose) |
7 | |
8 | // Enable HSE (Umschaltung auf externen Quarz)
|
9 | RCC_HSEConfig (RCC_HSE_ON); |
10 | |
11 | // HSE-Umschaltung abwarten
|
12 | while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); |
13 | |
14 | // System-Taktung
|
15 | RCC_HCLKConfig (RCC_SYSCLK_Div1); // HCLK = SYSCLK |
16 | RCC_PCLK2Config (RCC_HCLK_Div1); // PCLK2 (APB2) = HCLK |
17 | RCC_PCLK1Config (RCC_HCLK_Div2); // PCLK1 (APB1) = HCLK/2 |
18 | RCC_ADCCLKConfig (RCC_PCLK2_Div6); // ADCCLK = PCLK2/6 |
19 | |
20 | // FLASH-Speicher Zugriff
|
21 | FLASH_SetLatency(FLASH_Latency_2); // Flash - 2 wait states |
22 | FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // Pipeline freigeben |
23 | |
24 | // PLL Konfiguration
|
25 | // PLLCLK = 8MHz * 9 = 72 MHz
|
26 | RCC_PLLConfig (RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // Externer Quarz, Faktor 9 |
27 | RCC_PLLCmd (ENABLE); // Enable PLL |
28 | |
29 | // PLL-Konfiguration abwarten
|
30 | while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); |
31 | |
32 | // PLL als System-Takt auswählen
|
33 | RCC_SYSCLKConfig (RCC_SYSCLKSource_PLLCLK); |
34 | |
35 | // PLL-Umschaltung abwarten
|
36 | while (RCC_GetSYSCLKSource() != 0x08); |
37 | }
|
Ich probiers gleich morgen früh nochmal. jetzt erstmal ins bett danke an alle für die hilfe bis morgen jan
So sieht es im Moment aus: #include <stm32f10x_lib.h> // STM32F10x Library Definitions #include "STM32_Init.h" // STM32 Initialization int main (void) { stm32_Init (); // STM32 setup while (1) { if(GPIO_ReadInputDataBit (GPIOA, GPIO_Pin_0) == 0x1){ GPIO_SetBits (GPIOB, GPIO_Pin_8); GPIO_ResetBits (GPIOB, GPIO_Pin_15); if(GPIO_ReadInputDataBit (GPIOA, GPIO_Pin_14) == 0x1){ GPIO_SetBits (GPIOB, GPIO_Pin_15); GPIO_ResetBits (GPIOB, GPIO_Pin_8); } }; } // end while } // end main die Initialisierung ist angehängt Der Ausgang Pin8 am PortB ist eins. Sonst passiert nichts Ich verstehe das einfach nicht.
Wie gesagt, ich würde die Keil-Lib und die STM FW Lib nicht mischen. Was ist nun anders an dem Programm? Nimm doch erstmal das passende Template aus der STM FW Lib als Vorlage. Für die Keil MDK ist auf jeden Fall eine mit drin. Ansonsten gibt es doch bestimmt ein Blinky für das Board bei Keil.
Das Blinky hab ich verwendet. Was meinst du mit der STM FW Lib? STM Firmware Libary? Template? Hilf mir mal ein bisschen mit den Fachausdrücken :-D Ich bin nicht so der µC Crack. Hab erst 2 Projekte mit AVR hinter mir, ist meine erste Sache mit ARM. Also, woher nehme ich die FW Lib? Und wie verwende ich da ein Template und was ist das? In dem Blinky für mein Board ist da eben diese Init enthalten.
Ok. A.K. hat es oben schon beschrieben. Erstmal viel lesen. Dann ein funktionierendes Blinky oder Hallo Welt nehmen und modifizieren. STM32 ist anderes Kaliber als AVR. Allein das User-Manual ist über 1000 Seiten lang in Englisch. Benutzt Du überhaupt die Keil MDK, bisher nur Vermutung? Welcher Jtag? Die Template sind in der STM Standard Firmware Lib (3.5.0 ist die aktuelle), lade Dir die runter, und pack sie aus. Im Ordner Project/xxxxx_TEMPLATE findest Du einen Ordner MDK-ARM. Darin das Projectfile -->> öffen (geht natürlich nur wenn Du mit Keil arbeitest) Damit hast Du erstmal die Grundstruktur. Passe nun den Controller-Typ und die Device-Art (MD/HD usw.) in den Projektoptionen an. Damit bekommst Du automatisch den richtigen Startup-Code eingebunden. Im C-Programm kannst Du alles rauslöschen was das STM Evalboard betrifft, bis Du eine saubere Main hast. Keil ist für den Einstieg nicht gerade einfach in der Handhabung. Empfehle meist erstmal das Atollic-TrueStudio Lite zu nehmen und einen ST-Link Jtag für ca. 25 Euro. Dort ist die Projekterstellung sehr übersichtlich, die STM Lib wird gleich mitgeliefert, um Linkereinstellungen und Startups braucht man sich nicht zu kümmern. Ein Blinky läuft nach wenigen Minuten.
Also ich habe ein Keil Ulink-ME, des war dabei. Ich benutze µVision 4 und habe das Keil-Board MCBSTM32. Ich hab alle möglichen Examples ausprobiert und die laufen auch. Ich bekomme nur obrigen Quellcode nicht zum laufen. Und dieser ist erstmal erforderlich, um mich an meine Aufgabe (Kaffeemaschine) heranzuarbeiten. Ich würde dafür freihlich nicht so einen Overkill µC verwenden, aber Belegarbeit ist Belegarbeit und da heißt es, dass dieses Board zu verwenden ist.
Probier mal die Anlage. Getestet mit der Demo und dem Simulator. 8MHz externer Quarz erforderlich.
Ich drehe mich im Kreis. Alle Bsp. funktionieren bei mir.
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.