mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C ARM Cortex Mikrocontroller PIN ansteuern


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.
Autor: Raphael K. (wolly300)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich programmiere jetzt seit einiger Zeit mit ARM Prozessoren.

Angefangen habe ich mit einem STM32F401RE Board und bin jetzt bei einem 
eigenen PCB mit STM32F429BI Mikrocontroller.

Ich arbeite mit der JumpStart C for Cortex-M IDE mit eigener Cortex-M 
API.

Mit der API kann man ganz einfach einen pin mit:

portb.MakeOutput(10, OSPEED_VERYHIGH);

und

portb.Set(10);
portb.Clear(10);

ansteuern.

Damit habe ich auch einen I2C Bus programmiert. Jetzt will ich das ganz 
auf richtiges C Pin ansteuern um programmieren.

Bisher kann ich mit:

GPIOB ->BSRRL | GPIO_BSRR_BS10;
GPIOB ->BSRRH | GPIO_BSRR_BS10;

die Pins hoch und runter setzen (Habe ich mit der angehängten Datei 
gemacht).
Ich weiß aber, das man dass auch mit z.B.:

SDA = 1;
SDA = 0;

Pins setzen kann.
Ich würde das richtige Register ansteuern und die damit zusammenhängende 
Hardware Zugriffe gerne lernen.
Wie genau erstelle ich jetzt solche Hardware Zugriffe ?

Vielen Dank für eure Hilfe

: Verschoben durch Moderator
Autor: abc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Raphael K. schrieb:
> Wie genau erstelle ich jetzt solche Hardware Zugriffe ?

Schau dir am besten mal eine beliebige HAL an (z.B. libopencm3 oder die 
offizielle ST-HAL). Dort kannst du alle notwendigen Registeraufrufe 
ableiten.

Beitrag #5969401 wurde von einem Moderator gelöscht.
Autor: Bernd K. (prof7bit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
low level (nur zum verstehn was vor sich geht)

für ein 401RE Nucleo board:
#include <stm32f401xe.h>


/*
 * The green LED is connected to port A5,
 * -> see schematic of NUCLEO-F401RE board
 */
#define LED_GPIO        GPIOA
#define LED_PIN         5


/**
 * Quick 'n' dirty delay
 *
 * @param time the larger it is the longer it will block
 */
static void delay(unsigned time) {
    for (unsigned i=0; i<time; i++)
        for (volatile unsigned j=0; j<20000; j++);
}


/**
 * Hello world blinky program
 *
 * @return never
 */
int main(void) {

    /*
     * Turn on the GPIOA unit,
     * -> see section 6.3.9 in the manual
     */
    RCC->AHB1ENR  |= RCC_AHB1ENR_GPIOAEN;


    /*
     * Set LED-Pin as output
     * Note: For simplicity this assumes the pin was configured
     * as input before, as it is when it comes out of reset.
     * -> see section 8.4.1 in the manual
     */
    LED_GPIO->MODER |= (0b01 << (LED_PIN << 1));


    while(1) {

        /*
         * LED on (drive the pin high)
         * A GPIO output pin is set to high by writing 1 to the
         * corresponding bit in the lower half of the BSRR register
         * -> see section 8.4.7 in the manual
         */
        LED_GPIO->BSRR = (1 << LED_PIN);

        delay(200);

        /*
         * LED off (drive the pin low)
         * A GPIO output pin is set to low by writing 1 to the
         * corresponding bit in the upper half of the BSRR register
         * -> see section 8.4.7 in the manual
         */
        LED_GPIO->BSRR = (1 << (LED_PIN + 16));

        delay(200);
    }
}

Autor: Raphael K. (wolly300)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
abc schrieb:
> Raphael K. schrieb:
>> Wie genau erstelle ich jetzt solche Hardware Zugriffe ?
>
> Schau dir am besten mal eine beliebige HAL an (z.B. libopencm3 oder die
> offizielle ST-HAL). Dort kannst du alle notwendigen Registeraufrufe
> ableiten.

Gibt es da auch genauere Infos ?

Die HAL von ST hat mehr als 1800 Seite!!!

https://www.st.com/content/ccc/resource/technical/document/user_manual/2f/71/ba/b8/75/54/47/cf/DM00105879.pdf/files/DM00105879.pdf/jcr:content/translations/en.DM00105879.pdf

: Bearbeitet durch User
Autor: W.S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Raphael K. schrieb:
> Ich weiß aber, das man dass auch mit z.B.:
>
> SDA = 1;
> SDA = 0;
>
> Pins setzen kann.

Und woher weißt du das, bzw. glaubst du, das zu wissen?

Also, die GPIO-Peripherie-Cores sind von Hersteller zu Hersteller und 
Chipfamilie zu Chipfamilie durchaus unterschiedlich.

Was also beim einen funktioniert, muß beim anderen ganz anders gemacht 
werden. Das solltest du dir gut merken.

Bei vielen Chip-Sorten gibt es mehrere Methoden, Pins zu setzen. Eine 
davon besteht darin, daß es zusätzlich zu den eigentlichen 
GPIO-Registern noch ein Array gibt (komme grad nicht auf den Namen), wo 
jedes einzelne Pin einem Byte, Word oder DWord zugeordnet ist, so daß 
man dort tatsächlich so schreiben kann wie du oben. Aber das gibt's 
nicht ÜBERALL.

Also lies dir das GPIO-Kapitel im RefManual für deinen Chip gründlich 
durch, um zu erfahren, was man da so alles machen kann.

W.S.

Autor: Bernd K. (prof7bit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Raphael K. schrieb:
>> Schau dir am besten mal eine beliebige HAL an (z.B. libopencm3 oder die
>> offizielle ST-HAL). Dort kannst du alle notwendigen Registeraufrufe
>> ableiten.
>
> Gibt es da auch genauere Infos ?
>
> Die HAL von ST hat mehr als 1800 Seite!!!

Noch genauer als 1800 Seiten? Die nächsthöhere Genauigkeitsstufe wäre 
wohl in den Code der HAL selber reinzuschauen, dort steht alles 
supergenau drin, sogar das was in den 1800 Seiten nicht steht.

Autor: Stefanus F. (Firma: Äppel) (stefanus)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Lies mal diesen Absatz:
http://stefanfrings.de/stm32/stm32f3.html#digital

Das wurde für den STM32F3 geschrieben, aber ich denke, es trifft auf den 
STM32F4 ebenso zu.

Das Anwendungsbeispiel steht weiter oben auf der Seite:
http://stefanfrings.de/stm32/stm32f3.html#delayloop

Es verwendet die CMSIS Makros SET_BIT, MODIFY_REG und WRITE_REG, 
die auch in HAL Projekten zur Verfügung stehen, weil die HAL auf CMSIS 
aufbaut. Diese (und ein paar weitere) Makros sind von ARM 
standardisiert.

Die konkreten Register auf die man zugreifen muss sind allerdings 
Hersteller-Spezifisch. Sie sind in 
https://www.st.com/content/ccc/resource/technical/document/reference_manual/3d/6d/5a/66/b4/99/40/d4/DM00031020.pdf/files/DM00031020.pdf/jcr:content/translations/en.DM00031020.pdf 
Kapitel 8 (General-purpose I/Os GPIO) beschrieben.

: Bearbeitet durch User
Autor: Christopher J. (christopher_j23)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefanus F. schrieb:
> Es verwendet die CMSIS Makros SET_BIT, MODIFY_REG und WRITE_REG, die
> auch in HAL Projekten zur Verfügung stehen, weil die HAL auf CMSIS
> aufbaut. Diese (und ein paar weitere) Makros sind von ARM
> standardisiert.

Ich meine (d.h. bin mir nicht ganz sicher), dass die Makros SET_BIT, 
MODIFY_REG, etc. eine Dreingabe von ST sind und nicht CMSIS-Standard. 
Man kann sie sich natürlich jederzeit für einen Controller eines anderen 
Herstellers anlegen. Ist ja alles kein Hexenwerk.

Autor: Bernd K. (prof7bit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christopher J. schrieb:
> Ich meine (d.h. bin mir nicht ganz sicher), dass die Makros SET_BIT,
> MODIFY_REG, etc. eine Dreingabe von ST sind und nicht CMSIS-Standard.
> Man kann

...natürlich auch komplett auf diesen Blödsinn verzichten denn die 
machen mehr Tipparbeit und Obfuskation als sie nützen.

Autor: Christopher J. (christopher_j23)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd K. schrieb:
>> Man kann
>
> ...natürlich auch komplett auf diesen Blödsinn verzichten denn die
> machen mehr Tipparbeit und Obfuskation als sie nützen.

oder so. Jeder wie er mag ;)

Autor: Stefanus F. (Firma: Äppel) (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christopher J. schrieb:
> Ich meine (d.h. bin mir nicht ganz sicher), dass die Makros SET_BIT,
> MODIFY_REG, etc. eine Dreingabe von ST sind und nicht CMSIS-Standard.

Hmm, jetzt wo du es sagst... guck nach....scheint zu stimmen.

Die Makros sind trivial und daher sicher Geschmackssache.

MODIFY_REG finde ich hilfreich, um besser lesbaren Code zu schreiben.

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.

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