Forum: Mikrocontroller und Digitale Elektronik Aufgabe für STM32 Mikrocontroller


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Andreas S. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo ich habe eine Klausuraufgabe zur Vorbereitung auf eine Klausur
bekommen.

Aufgabe 3: Virtueller Parallel Port a)  In einer Anwendung wird ein
32-Bit GPIO-Port benötigt. Der Mikrocontroller STM32 bietet lediglich
eine GPIO-Breite von 16 Bits an. Daher soll der 32- Bit Port durch
Software erweitert werden. Die Ansteuerung des verwendeten Ports GPIOA
(niederwertige Bits des 32-Bit GPIO) und GPIOB (höherwertige Bits) soll
ohne Verwendung der Libary Folgende I/O-Register der GPIOx  (x={A,B}
werden in dieser Aufgabe betrachtet, die weiteren Einstell-Möglichkeiten
werden hier vernachlässigt.  GPIOx ODR: 16-Bit output Dataregister zum
schreiben (und Lesen) der Outputs GPIOx.IDR 16-Bit Input Dataregister
zum Lesen der Inputs GPIOx BSRR 32-Bit „Set oder Reset“ –Register ->
Niedrige 16 Bits zum Setzen, hohe Bits zum Löschen

b) Funktionen zu implementieren: Void configme_input_output(uint32_t)
//every set bit in bitmask means bit (becomes output) // reset Bits
become input

c) Ab jetzt gehen wir davon aus, dass alle Pins als Outout Konfigurieren
werden. Implementieren Sie die folgende Funktion zum Umschalten der
Pins. Void toggle_bits (uint_32_t bitmask) // every set bit means:
toogle this bit in virtual 32 Bit Port

d) Implementieren Sie folgende Funktion wie unten beschrieben Void
atomic_reset_single_bit (uint8_t bitnumber) // bitnumber = {0…31} The
corresponding bit shall be reset // without changing any other bit using
the BSRR

e)  Folgende Funktion ist zu implementieren. Die Funktion solle von der
Benutzeroberfläche aus mit einem String-Argument „0“ … „15“ aus größer
werden. Bool test_and_set_bit (char*bitnumber) // string argument! //
set single bit and return it´s previous value // examples:
test_and_set_bit(“13“) Test-and_set_bit(“0“)



Hier habe ich mal meine Lösung die ich probiert habe ich bin für Tipps
sehr dankbar.

GPIO_TypeDef *GPIOA( int gpioNumber)
{
  GPIO_TypeDef *gpio = AH1PERIPH_BASE + gpioNumber*0x400;

  return gpio;

}

void init_port_output(int gpioNumber, int pinNumber)
{
GPIO_TypeDef *gpio = GPIOA; // Adresse des IO Port A zuweisen
RCC->AHB1ENR |= (1<<gpioNumber); // Enable GPIO Peripheral clock
gpio->MODER |= 0b01<<(2*pinNumber);// GP IO Ausgang
//gpio->BSRR = 1<< (16+pinNumber); // Start mit LED aus = reset output
}


void init_port_output(int gpioNumber, int pinNumber)
{
GPIO_TypeDef *gpio = GPIOB; // Adresse des IO Port B zuweisen
RCC->AHB1ENR |= (1<<gpioNumber); // Enable GPIO Peripheral clock
gpio->MODER |= 0b01<<(2*pinNumber);// GP IO Ausgang
//gpio->BSRR = 1<< (16+pinNumber); // Start mit LED aus = reset output
}



void configure_ports_output (int gpioNumber, uint16_t PinMask)
{
unsigned int  pinPosition =0;

while (PinMask > 0)
{
int a = PinMask & 0b1; // Test auf unterstes Bit gesetzt

if (a==1)
  init_port_output(gpioNumber, pinPosition); //initialisierung mit
init_port_output

  PinMask = PinMask >> 1; //pinMask um eine Stelle nach rechts schieben
  pinPosition++;
}
}

void virtual_port(uint16_t vport)
{
  uint32_t porta, portb, vporta, vportb;

  vporta = vport & 0xe0;
  vporta >>= 5;
  vportb = vport & 0x1f;
  portb = GPIOB -> ODR;
  porta = GPIOA -> ODR;
  porta &= 0xfff8; // Bits zu Null maskieren
  portb &= 0xf83f;  // Bit zu Null maskieren
  // Überlagerung (ODER-Operation) der Werte zurück
  GPIOA -> ODR = porta | (~vporta);
  GPIOB -> ODR = portb | (~vportb);
}

von Jim M. (turboj)


Bewertung
2 lesenswert
nicht lesenswert
Wäre ich der Leher, gäbe es Null(0) Punkte. Keine der aufgegbenen 
Funktionen wurde implementiert.

von Stefan ⛄ F. (stefanus)


Bewertung
2 lesenswert
nicht lesenswert
Vielleicht hilft das: http://stefanfrings.de/stm32/index.html
Da wird beschrieben, wie man mit den GPIO Ports umgeht.

von Andreas S. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wie verbindet man den zwei Ports softwaremäßig zu einem virtuellen Port?

von Erklehr Behr (Gast)


Angehängte Dateien:

Bewertung
-1 lesenswert
nicht lesenswert
Jim M. schrieb:
> Wäre ich der Leher, gäbe es Null(0) Punkte.

Ich vergebe nochmal Null(0) Punkte.

Für die Beachtung der Regeln.

von Andreas S. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ja ich bin neu hier sorry dafür ich mache meinen Code ins Pastebin

Beitrag #6340442 wurde von einem Moderator gelöscht.
von Erklehr Behr (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Dominik K. schrieb:
> Ja ich bin neu hier

Aber Fettschrift kannst du schon lesen?

von Adam P. (adamap)


Bewertung
1 lesenswert
nicht lesenswert
Dominik K. schrieb:
> Wie verbindet man den zwei Ports softwaremäßig zu einem virtuellen Port?

Wie der Name schon sagt, virtuell.

Dies ist nur für dich ein Pseudo-Code um es zu veranschaulichen.
1
void set_port_level(GPIO *port, uint16_t value)
2
{
3
   port->ODR = value;
4
}
5
6
void set_virtual_port_level(uint32_t value)
7
{
8
   uint16_t tmp;
9
10
   tmp = (value & 0x0000FFFF);
11
   set_port_level(GPIOA, tmp);
12
13
   tmp = (value & 0xFFFF0000) >> 16;
14
   set_port_level(GPIOB, tmp);
15
}

: Bearbeitet durch User
von Michael B. (laberkopp)


Bewertung
0 lesenswert
nicht lesenswert
Dominik K. schrieb:
> Hier habe ich mal meine Lösung

Wo hast du denn das herkopiert ?

Da ist doch keine einzige Zeile von dir.

Und zur Aufgabe passen tut's auch nicht.

von Andreas S. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Das habe ich nicht kopiert, sondern von meinem Laborbericht wie man 
einen virtuellen Port erstellt.

von Johannes S. (jojos)


Bewertung
1 lesenswert
nicht lesenswert
und wo hat der Kollege das herkopiert?

von Andreas S. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank Adam für den Pseudo-Code.

von Andreas S. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Also kopiert habe ich es aus meinem eigenen Bericht der vom Prof. als 
i.O. bewertet zurückkam.

von Andreas S. (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Zum Beweis könnt ihr diesen gerne durchschauen.

von Adam P. (adamap)


Bewertung
2 lesenswert
nicht lesenswert
Dominik K. schrieb:
> Zum Beweis könnt ihr diesen gerne durchschauen.

Unter 4.3.3 hast du doch schon die Lösung...
nur das da halt gewisse Bits ausmarkiert werden.

Also es liegt eigentlich bereits vor dir und du erkennst es nur nicht 
:-D

von Andreas S. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ja schon, die Frage ist nur kann ich einfach über die Variablen beliebig 
groß machen meine Größe vom Port definieren?

von Adam P. (adamap)


Bewertung
0 lesenswert
nicht lesenswert
Dominik K. schrieb:
> Ja schon, die Frage ist nur kann ich einfach über die Variablen beliebig
> groß machen meine Größe vom Port definieren?

Puhhhhhh, Sorry, aber erstens versteh ich nicht was du uns fragen 
möchtest und zweitens bekomm ich da Kopfschmerzen, wenn ich das so lese.

Jetz streng dich mal bissel an :-P
Immerhin ist das hier meine Freizeit und die ist kostbar - klar bekommst 
du Hilfe, aber wir verstehen nicht wo dein Problem liegt. Sorry.

von Adam P. (adamap)


Bewertung
1 lesenswert
nicht lesenswert
Schau mal...

Die Funktion aus deinem Skript 4.3.3 und dann diese aber mit dem Inhalt 
der Funktion die ich dir geantwortet hatte...bissel anpassen, fertig.

Edit:
Ich glaub eher, du hast noch nicht den Zusammenhang zwischen den Bits 
einer Variable und den zu setzenden Bits(Pins) des Ports verstanden, 
kann das sein?

: Bearbeitet durch User
von Andreas S. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Okay ich will nicht deine Zeit verschwenden sorry. Ich hatte gerade ne 
Denkblockade. Genau richtig ich muss doch über den Pin des Portes mit 
high und low diesen als Ausgang oder Eingang definieren.

von Stefan ⛄ F. (stefanus)


Bewertung
3 lesenswert
nicht lesenswert
Dominik K. schrieb:
> Genau richtig ich muss doch über den Pin des Portes mit
> high und low diesen als Ausgang oder Eingang definieren.

Die Umschaltung zwischen Ausgang und Eingang macht man nicht über einen 
Pin, sondern über ein Register. Guck Dir meine STM32 Seite an, da habe 
ich die relevanten Register für drei STM32 Serien genannt.

von Adam P. (adamap)


Bewertung
1 lesenswert
nicht lesenswert
Dominik K. schrieb:
> Okay ich will nicht deine Zeit verschwenden sorry

Tust du nicht...
Aber die Lösung mit dem Skript ist so offensichtlich, das ich denken 
muss, du hast einfach die Sache ansich nicht verstanden.

Und da, solltest mal machen was Stefan dir sagt.

Was man lernt, kann man verlernen...
Aber was man versteht,
das kann man ja nicht "ververstehen" ?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.