ARM STM32 Eingänge werden nicht erkannt

OP #2251810
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?
Gast #2251855
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
#2251856
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ß
OP #2252060
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.
#2252088
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
}
OP #2252703
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.
Angehängte Dateien:
#2252726
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.
OP #2252750
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.
#2252978
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.
OP #2253080
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren