Forum: Mikrocontroller und Digitale Elektronik ARM STM32 Eingänge werden nicht erkannt


von Jan S. (anfaenger85)


Lesenswert?

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?

von Matthias K. (matthiask)


Lesenswert?

>stm32_Init ();

Zeigen!

Ich hoffe, Du konfigurierst dort die GPIOs und schaltest die GPIO-Takte 
ein usw.

von (prx) A. K. (prx)


Lesenswert?

> if(GPIO_ReadInputData(GPIOA) == 0x1){

Wohl nur erfolgreich wenn, alle 16 Bits vom Port genau den Zustand 
0000.0000.0000.0001 haben.

von Jan S. (anfaenger85)


Angehängte Dateien:

Lesenswert?

Hier ist das Ding. Ich bin der Meinung das ist richtig. Aber mal sehen.

MFG
Jan

von Jan S. (anfaenger85)


Lesenswert?

@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

von (prx) A. K. (prx)


Lesenswert?

Jan Schulze schrieb:

> Schon richtig.

Wenn Pin 15 eins ist, dann wird diese Abfrage immer falsch ein.

von Jan S. (anfaenger85)


Lesenswert?

Oh, jaaa. Wie richtig. Man, manchmal sieht man den Wald vor lauter 
Bäumen nicht. Danke.

Aber nun, was mache ich da?

von (prx) A. K. (prx)


Lesenswert?

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.

von Norminator (Gast)


Lesenswert?

GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);

von stm32 user (Gast)


Lesenswert?

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

von Jean P. (fubu1000)


Lesenswert?

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ß

von Jan S. (anfaenger85)


Lesenswert?

@Norminator
Das habe ich schon versucht. Jetzt ist Pin 8 dauerhaft an.

von Jean P. (fubu1000)


Lesenswert?

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ß

von Norminator (Gast)


Lesenswert?

Soll die jeweilige LED leuchten wenn irgendein Pin == 1 ist oder wenn 
ein bestimmter Pin == 1 ist?

von Jan S. (anfaenger85)


Lesenswert?

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

von Jan S. (anfaenger85)


Lesenswert?

@stm32 user:
deine Variante nimmt der Compiler nicht. Ich hab die Vorgehensweise auch 
nicht verstanden, wenn ich ehrlich sein soll

von Matthias K. (matthiask)


Lesenswert?

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
}

von Jan S. (anfaenger85)


Lesenswert?

Ich probiers gleich morgen früh nochmal. jetzt erstmal ins bett
danke an alle für die hilfe

bis morgen

jan

von Jan S. (anfaenger85)


Angehängte Dateien:

Lesenswert?

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.

von Matthias K. (matthiask)


Lesenswert?

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.

von Jan S. (anfaenger85)


Lesenswert?

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.

von Matthias K. (matthiask)


Lesenswert?

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.

von Jan S. (anfaenger85)


Lesenswert?

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.

von Matthias K. (matthiask)


Angehängte Dateien:

Lesenswert?

Probier mal die Anlage. Getestet mit der Demo und dem Simulator.

8MHz externer Quarz erforderlich.

von Jan S. (anfaenger85)


Lesenswert?

Ich drehe mich im Kreis. Alle Bsp. funktionieren bei mir.

von Matthias K. (matthiask)


Lesenswert?

Ich staune, wie Du das in 5 Minuten abhackst...

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.