- 3D-Druck Einstieg und Tipps         
Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 32

Thema: SMT32 - Ports konfigurieren, Frage zur C-Syntax

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473

    SMT32 - Ports konfigurieren, Frage zur C-Syntax

    Anzeige

    E-Bike
    Hallo allerseits

    Ich knabbere grad an der Konfiguration der Portpins eines STM32-F446RE (Nucleoboard).

    Ich will PA5 als Ausgang (Push-Pull) und PC13 als Eingang (Floating).

    So wie ich das sehe muß ich bloß eine 1 ins MODER-Register schreiben (für PA5) und kann den Rest so lassen. (Stimmt das überhaupt?)

    Jetzt bin ich aber etwas über die Syntax verwirrt. Ich kenne C eher von der Windows-Programmierung her und hab C vllt eine Woche lang auf nem ATMega verwendet. Wenn ich da ein Bit in einem Register setzen will, tu ich das für gewöhnlich so:
    Code:
    Register |= ~(1<<Bit);
    Jetzt hab ich mir, um die Registerbenennung für den STM32 mal in Code zu sehen, mal von STM32Cube was ausspucken lassen. Da sieht die Syntax jedoch gänzlich anders aus:
    Code:
    void MX_GPIO_Init(void)
    {
    
      GPIO_InitTypeDef GPIO_InitStruct;
    
      /* GPIO Ports Clock Enable */
      __HAL_RCC_GPIOC_CLK_ENABLE();
      __HAL_RCC_GPIOH_CLK_ENABLE();
      __HAL_RCC_GPIOA_CLK_ENABLE();
      __HAL_RCC_GPIOB_CLK_ENABLE();
    
      /*Configure GPIO pin : B1_Pin */
      GPIO_InitStruct.Pin = B1_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
    
      /*Configure GPIO pins : USART_TX_Pin USART_RX_Pin */
      GPIO_InitStruct.Pin = USART_TX_Pin|USART_RX_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
      GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
      /*Configure GPIO pin : LD2_Pin */
      GPIO_InitStruct.Pin = LD2_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
      HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct);
    
      /*Configure GPIO pin Output Level */
      HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
    
    }
    Ich bin jetzt etwas ratlos wegen z.B. der Registerbezeichnung
    Code:
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    Ich hätte zuerst gedacht das sei C++, objektorientiert, aber soweit ich das bisher beurteilen kann scheint das wirklich C zu sein. Mein zweiter Einfall wäre, daß sich ST dafür eine Struktur ausgedacht hat. Eine Struktur wird doch aber üblicherweise so deklariert:
    Code:
    typedef struct
         int a;
         char b;
    }Tstructname
    Ein solches Codekonstrukt finde ich aber nirgends. Was hat es also damit auf sich?

  2. #2
    Unregistriert
    Gast
    Hi,

    das
    Code:
    Register |= ~(1<<Bit);
    löscht ein Bit und setzt es nicht! Der |-Strich ist ein logisches Oder, die Tilde ~ eine logische Negation.
    Mit diesem Konstrukt kannst du alle anderen Bits setzen (sofern sie das noch nicht sind), genau das benötigte Bit wird aber nicht gesetzt.
    Um ein Bit zu setzen musst du schreiben:
    Code:
    Register |= (1<<Bit);
    also obiges, nur ohne die Tilde.

    Dinge wie
    Code:
    GPIO_MODE_AF_PP
    sind sog. Enums (Enumeration), also chronologische Gebilde, die irgendwo in irgendeiner Datei definiert werden. Wo genau und wie genau das funktioniert kann ich dir jetzt nicht sagen, sorry.

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    löscht ein Bit und setzt es nicht!
    Richtig...ich meinte auch das Gebilde ohne Tilde. Aber gut, darum gehts mir grad weniger.

    Aber Enums sagen mir schon eher was...danke für den Tip. Ich vermute mal ich werd mich wohl mal durch die Standard-Bibliotheken qälen müssen.
    Oder sehen wo ich eine vernünftige Doku dazu finde...

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Die Datei, in der die meisten Register-Konstanten definiert werden, heisst normalerweise stm32f4xx.h

  5. #5
    Unregistriert
    Gast
    Hallo,

    Du wirfst da ein bisschen was durcheinander.
    Dieser ganze HAL-Kram kommt von dieser unerträglich ST-Library. Meine Empfehlung: Tu Dir den Mist erst gar nicht an. Schneller bist Du damit nicht, hast aber dafür umso mehr Ärger wenn mal was nicht geht.

    Was Du suchst, steht in der stm32f446xx.h:

    Code:
    /** 
      * @brief General Purpose I/O
      */
    
    typedef struct
    {
      __IO uint32_t MODER;    /*!< GPIO port mode register,               Address offset: 0x00      */
      __IO uint32_t OTYPER;   /*!< GPIO port output type register,        Address offset: 0x04      */
      __IO uint32_t OSPEEDR;  /*!< GPIO port output speed register,       Address offset: 0x08      */
      __IO uint32_t PUPDR;    /*!< GPIO port pull-up/pull-down register,  Address offset: 0x0C      */
      __IO uint32_t IDR;      /*!< GPIO port input data register,         Address offset: 0x10      */
      __IO uint32_t ODR;      /*!< GPIO port output data register,        Address offset: 0x14      */
      __IO uint32_t BSRR;     /*!< GPIO port bit set/reset register,      Address offset: 0x18      */
      __IO uint32_t LCKR;     /*!< GPIO port configuration lock register, Address offset: 0x1C      */
      __IO uint32_t AFR[2];   /*!< GPIO alternate function registers,     Address offset: 0x20-0x24 */
    } GPIO_TypeDef;
    Das ist die Grund(C-)struktur für die GPIOs.
    Dazu kommen dann die Bit-Definitionen:

    Code:
    /******************************************************************************/
    /*                                                                            */
    /*                            General Purpose I/O                             */
    /*                                                                            */
    /******************************************************************************/
    /******************  Bits definition for GPIO_MODER register  *****************/
    #define GPIO_MODER_MODER0                    ((uint32_t)0x00000003)
    #define GPIO_MODER_MODER0_0                  ((uint32_t)0x00000001)
    #define GPIO_MODER_MODER0_1                  ((uint32_t)0x00000002)
    
    #define GPIO_MODER_MODER1                    ((uint32_t)0x0000000C)
    #define GPIO_MODER_MODER1_0                  ((uint32_t)0x00000004)
    #define GPIO_MODER_MODER1_1                  ((uint32_t)0x00000008)
    
    #define GPIO_MODER_MODER2                    ((uint32_t)0x00000030)
    #define GPIO_MODER_MODER2_0                  ((uint32_t)0x00000010)
    #define GPIO_MODER_MODER2_1                  ((uint32_t)0x00000020)
    
    #define GPIO_MODER_MODER3                    ((uint32_t)0x000000C0)
    #define GPIO_MODER_MODER3_0                  ((uint32_t)0x00000040)
    #define GPIO_MODER_MODER3_1                  ((uint32_t)0x00000080)
    
    #define GPIO_MODER_MODER4                    ((uint32_t)0x00000300)
    #define GPIO_MODER_MODER4_0                  ((uint32_t)0x00000100)
    #define GPIO_MODER_MODER4_1                  ((uint32_t)0x00000200)
    
    #define GPIO_MODER_MODER5                    ((uint32_t)0x00000C00)
    #define GPIO_MODER_MODER5_0                  ((uint32_t)0x00000400)
    #define GPIO_MODER_MODER5_1                  ((uint32_t)0x00000800)
    
    #define GPIO_MODER_MODER6                    ((uint32_t)0x00003000)
    #define GPIO_MODER_MODER6_0                  ((uint32_t)0x00001000)
    #define GPIO_MODER_MODER6_1                  ((uint32_t)0x00002000)
    
    #define GPIO_MODER_MODER7                    ((uint32_t)0x0000C000)
    #define GPIO_MODER_MODER7_0                  ((uint32_t)0x00004000)
    #define GPIO_MODER_MODER7_1                  ((uint32_t)0x00008000)
    
    #define GPIO_MODER_MODER8                    ((uint32_t)0x00030000)
    #define GPIO_MODER_MODER8_0                  ((uint32_t)0x00010000)
    #define GPIO_MODER_MODER8_1                  ((uint32_t)0x00020000)
    
    #define GPIO_MODER_MODER9                    ((uint32_t)0x000C0000)
    #define GPIO_MODER_MODER9_0                  ((uint32_t)0x00040000)
    #define GPIO_MODER_MODER9_1                  ((uint32_t)0x00080000)
    
    #define GPIO_MODER_MODER10                   ((uint32_t)0x00300000)
    #define GPIO_MODER_MODER10_0                 ((uint32_t)0x00100000)
    #define GPIO_MODER_MODER10_1                 ((uint32_t)0x00200000)
    
    #define GPIO_MODER_MODER11                   ((uint32_t)0x00C00000)
    #define GPIO_MODER_MODER11_0                 ((uint32_t)0x00400000)
    #define GPIO_MODER_MODER11_1                 ((uint32_t)0x00800000)
    
    #define GPIO_MODER_MODER12                   ((uint32_t)0x03000000)
    #define GPIO_MODER_MODER12_0                 ((uint32_t)0x01000000)
    #define GPIO_MODER_MODER12_1                 ((uint32_t)0x02000000)
    
    #define GPIO_MODER_MODER13                   ((uint32_t)0x0C000000)
    #define GPIO_MODER_MODER13_0                 ((uint32_t)0x04000000)
    #define GPIO_MODER_MODER13_1                 ((uint32_t)0x08000000)
    
    #define GPIO_MODER_MODER14                   ((uint32_t)0x30000000)
    #define GPIO_MODER_MODER14_0                 ((uint32_t)0x10000000)
    #define GPIO_MODER_MODER14_1                 ((uint32_t)0x20000000)
    
    #define GPIO_MODER_MODER15                   ((uint32_t)0xC0000000)
    #define GPIO_MODER_MODER15_0                 ((uint32_t)0x40000000)
    #define GPIO_MODER_MODER15_1                 ((uint32_t)0x80000000)
    
    /******************  Bits definition for GPIO_OTYPER register  ****************/
    #define GPIO_OTYPER_OT_0                     ((uint32_t)0x00000001)
    #define GPIO_OTYPER_OT_1                     ((uint32_t)0x00000002)
    #define GPIO_OTYPER_OT_2                     ((uint32_t)0x00000004)
    #define GPIO_OTYPER_OT_3                     ((uint32_t)0x00000008)
    #define GPIO_OTYPER_OT_4                     ((uint32_t)0x00000010)
    #define GPIO_OTYPER_OT_5                     ((uint32_t)0x00000020)
    #define GPIO_OTYPER_OT_6                     ((uint32_t)0x00000040)
    #define GPIO_OTYPER_OT_7                     ((uint32_t)0x00000080)
    #define GPIO_OTYPER_OT_8                     ((uint32_t)0x00000100)
    #define GPIO_OTYPER_OT_9                     ((uint32_t)0x00000200)
    #define GPIO_OTYPER_OT_10                    ((uint32_t)0x00000400)
    #define GPIO_OTYPER_OT_11                    ((uint32_t)0x00000800)
    #define GPIO_OTYPER_OT_12                    ((uint32_t)0x00001000)
    #define GPIO_OTYPER_OT_13                    ((uint32_t)0x00002000)
    #define GPIO_OTYPER_OT_14                    ((uint32_t)0x00004000)
    #define GPIO_OTYPER_OT_15                    ((uint32_t)0x00008000)
    
    /******************  Bits definition for GPIO_OSPEEDR register  ***************/
    #define GPIO_OSPEEDER_OSPEEDR0               ((uint32_t)0x00000003)
    #define GPIO_OSPEEDER_OSPEEDR0_0             ((uint32_t)0x00000001)
    #define GPIO_OSPEEDER_OSPEEDR0_1             ((uint32_t)0x00000002)
    
    #define GPIO_OSPEEDER_OSPEEDR1               ((uint32_t)0x0000000C)
    #define GPIO_OSPEEDER_OSPEEDR1_0             ((uint32_t)0x00000004)
    #define GPIO_OSPEEDER_OSPEEDR1_1             ((uint32_t)0x00000008)
    
    #define GPIO_OSPEEDER_OSPEEDR2               ((uint32_t)0x00000030)
    #define GPIO_OSPEEDER_OSPEEDR2_0             ((uint32_t)0x00000010)
    #define GPIO_OSPEEDER_OSPEEDR2_1             ((uint32_t)0x00000020)
    
    #define GPIO_OSPEEDER_OSPEEDR3               ((uint32_t)0x000000C0)
    #define GPIO_OSPEEDER_OSPEEDR3_0             ((uint32_t)0x00000040)
    #define GPIO_OSPEEDER_OSPEEDR3_1             ((uint32_t)0x00000080)
    
    #define GPIO_OSPEEDER_OSPEEDR4               ((uint32_t)0x00000300)
    #define GPIO_OSPEEDER_OSPEEDR4_0             ((uint32_t)0x00000100)
    #define GPIO_OSPEEDER_OSPEEDR4_1             ((uint32_t)0x00000200)
    
    #define GPIO_OSPEEDER_OSPEEDR5               ((uint32_t)0x00000C00)
    #define GPIO_OSPEEDER_OSPEEDR5_0             ((uint32_t)0x00000400)
    #define GPIO_OSPEEDER_OSPEEDR5_1             ((uint32_t)0x00000800)
    
    #define GPIO_OSPEEDER_OSPEEDR6               ((uint32_t)0x00003000)
    #define GPIO_OSPEEDER_OSPEEDR6_0             ((uint32_t)0x00001000)
    #define GPIO_OSPEEDER_OSPEEDR6_1             ((uint32_t)0x00002000)
    
    #define GPIO_OSPEEDER_OSPEEDR7               ((uint32_t)0x0000C000)
    #define GPIO_OSPEEDER_OSPEEDR7_0             ((uint32_t)0x00004000)
    #define GPIO_OSPEEDER_OSPEEDR7_1             ((uint32_t)0x00008000)
    
    #define GPIO_OSPEEDER_OSPEEDR8               ((uint32_t)0x00030000)
    #define GPIO_OSPEEDER_OSPEEDR8_0             ((uint32_t)0x00010000)
    #define GPIO_OSPEEDER_OSPEEDR8_1             ((uint32_t)0x00020000)
    
    #define GPIO_OSPEEDER_OSPEEDR9               ((uint32_t)0x000C0000)
    #define GPIO_OSPEEDER_OSPEEDR9_0             ((uint32_t)0x00040000)
    #define GPIO_OSPEEDER_OSPEEDR9_1             ((uint32_t)0x00080000)
    
    #define GPIO_OSPEEDER_OSPEEDR10              ((uint32_t)0x00300000)
    #define GPIO_OSPEEDER_OSPEEDR10_0            ((uint32_t)0x00100000)
    #define GPIO_OSPEEDER_OSPEEDR10_1            ((uint32_t)0x00200000)
    
    #define GPIO_OSPEEDER_OSPEEDR11              ((uint32_t)0x00C00000)
    #define GPIO_OSPEEDER_OSPEEDR11_0            ((uint32_t)0x00400000)
    #define GPIO_OSPEEDER_OSPEEDR11_1            ((uint32_t)0x00800000)
    
    #define GPIO_OSPEEDER_OSPEEDR12              ((uint32_t)0x03000000)
    #define GPIO_OSPEEDER_OSPEEDR12_0            ((uint32_t)0x01000000)
    #define GPIO_OSPEEDER_OSPEEDR12_1            ((uint32_t)0x02000000)
    
    #define GPIO_OSPEEDER_OSPEEDR13              ((uint32_t)0x0C000000)
    #define GPIO_OSPEEDER_OSPEEDR13_0            ((uint32_t)0x04000000)
    #define GPIO_OSPEEDER_OSPEEDR13_1            ((uint32_t)0x08000000)
    
    #define GPIO_OSPEEDER_OSPEEDR14              ((uint32_t)0x30000000)
    #define GPIO_OSPEEDER_OSPEEDR14_0            ((uint32_t)0x10000000)
    #define GPIO_OSPEEDER_OSPEEDR14_1            ((uint32_t)0x20000000)
    
    #define GPIO_OSPEEDER_OSPEEDR15              ((uint32_t)0xC0000000)
    #define GPIO_OSPEEDER_OSPEEDR15_0            ((uint32_t)0x40000000)
    #define GPIO_OSPEEDER_OSPEEDR15_1            ((uint32_t)0x80000000)
    
    /******************  Bits definition for GPIO_PUPDR register  *****************/
    #define GPIO_PUPDR_PUPDR0                    ((uint32_t)0x00000003)
    #define GPIO_PUPDR_PUPDR0_0                  ((uint32_t)0x00000001)
    #define GPIO_PUPDR_PUPDR0_1                  ((uint32_t)0x00000002)
    
    #define GPIO_PUPDR_PUPDR1                    ((uint32_t)0x0000000C)
    #define GPIO_PUPDR_PUPDR1_0                  ((uint32_t)0x00000004)
    #define GPIO_PUPDR_PUPDR1_1                  ((uint32_t)0x00000008)
    
    #define GPIO_PUPDR_PUPDR2                    ((uint32_t)0x00000030)
    #define GPIO_PUPDR_PUPDR2_0                  ((uint32_t)0x00000010)
    #define GPIO_PUPDR_PUPDR2_1                  ((uint32_t)0x00000020)
    
    #define GPIO_PUPDR_PUPDR3                    ((uint32_t)0x000000C0)
    #define GPIO_PUPDR_PUPDR3_0                  ((uint32_t)0x00000040)
    #define GPIO_PUPDR_PUPDR3_1                  ((uint32_t)0x00000080)
    
    #define GPIO_PUPDR_PUPDR4                    ((uint32_t)0x00000300)
    #define GPIO_PUPDR_PUPDR4_0                  ((uint32_t)0x00000100)
    #define GPIO_PUPDR_PUPDR4_1                  ((uint32_t)0x00000200)
    
    #define GPIO_PUPDR_PUPDR5                    ((uint32_t)0x00000C00)
    #define GPIO_PUPDR_PUPDR5_0                  ((uint32_t)0x00000400)
    #define GPIO_PUPDR_PUPDR5_1                  ((uint32_t)0x00000800)
    
    #define GPIO_PUPDR_PUPDR6                    ((uint32_t)0x00003000)
    #define GPIO_PUPDR_PUPDR6_0                  ((uint32_t)0x00001000)
    #define GPIO_PUPDR_PUPDR6_1                  ((uint32_t)0x00002000)
    
    #define GPIO_PUPDR_PUPDR7                    ((uint32_t)0x0000C000)
    #define GPIO_PUPDR_PUPDR7_0                  ((uint32_t)0x00004000)
    #define GPIO_PUPDR_PUPDR7_1                  ((uint32_t)0x00008000)
    
    #define GPIO_PUPDR_PUPDR8                    ((uint32_t)0x00030000)
    #define GPIO_PUPDR_PUPDR8_0                  ((uint32_t)0x00010000)
    #define GPIO_PUPDR_PUPDR8_1                  ((uint32_t)0x00020000)
    
    #define GPIO_PUPDR_PUPDR9                    ((uint32_t)0x000C0000)
    #define GPIO_PUPDR_PUPDR9_0                  ((uint32_t)0x00040000)
    #define GPIO_PUPDR_PUPDR9_1                  ((uint32_t)0x00080000)
    
    #define GPIO_PUPDR_PUPDR10                   ((uint32_t)0x00300000)
    #define GPIO_PUPDR_PUPDR10_0                 ((uint32_t)0x00100000)
    #define GPIO_PUPDR_PUPDR10_1                 ((uint32_t)0x00200000)
    
    #define GPIO_PUPDR_PUPDR11                   ((uint32_t)0x00C00000)
    #define GPIO_PUPDR_PUPDR11_0                 ((uint32_t)0x00400000)
    #define GPIO_PUPDR_PUPDR11_1                 ((uint32_t)0x00800000)
    
    #define GPIO_PUPDR_PUPDR12                   ((uint32_t)0x03000000)
    #define GPIO_PUPDR_PUPDR12_0                 ((uint32_t)0x01000000)
    #define GPIO_PUPDR_PUPDR12_1                 ((uint32_t)0x02000000)
    
    #define GPIO_PUPDR_PUPDR13                   ((uint32_t)0x0C000000)
    #define GPIO_PUPDR_PUPDR13_0                 ((uint32_t)0x04000000)
    #define GPIO_PUPDR_PUPDR13_1                 ((uint32_t)0x08000000)
    
    #define GPIO_PUPDR_PUPDR14                   ((uint32_t)0x30000000)
    #define GPIO_PUPDR_PUPDR14_0                 ((uint32_t)0x10000000)
    #define GPIO_PUPDR_PUPDR14_1                 ((uint32_t)0x20000000)
    
    #define GPIO_PUPDR_PUPDR15                   ((uint32_t)0xC0000000)
    #define GPIO_PUPDR_PUPDR15_0                 ((uint32_t)0x40000000)
    #define GPIO_PUPDR_PUPDR15_1                 ((uint32_t)0x80000000)
    
    /******************  Bits definition for GPIO_IDR register  *******************/
    #define GPIO_IDR_IDR_0                       ((uint32_t)0x00000001)
    #define GPIO_IDR_IDR_1                       ((uint32_t)0x00000002)
    #define GPIO_IDR_IDR_2                       ((uint32_t)0x00000004)
    #define GPIO_IDR_IDR_3                       ((uint32_t)0x00000008)
    #define GPIO_IDR_IDR_4                       ((uint32_t)0x00000010)
    #define GPIO_IDR_IDR_5                       ((uint32_t)0x00000020)
    #define GPIO_IDR_IDR_6                       ((uint32_t)0x00000040)
    #define GPIO_IDR_IDR_7                       ((uint32_t)0x00000080)
    #define GPIO_IDR_IDR_8                       ((uint32_t)0x00000100)
    #define GPIO_IDR_IDR_9                       ((uint32_t)0x00000200)
    #define GPIO_IDR_IDR_10                      ((uint32_t)0x00000400)
    #define GPIO_IDR_IDR_11                      ((uint32_t)0x00000800)
    #define GPIO_IDR_IDR_12                      ((uint32_t)0x00001000)
    #define GPIO_IDR_IDR_13                      ((uint32_t)0x00002000)
    #define GPIO_IDR_IDR_14                      ((uint32_t)0x00004000)
    #define GPIO_IDR_IDR_15                      ((uint32_t)0x00008000)
    /* Old GPIO_IDR register bits definition, maintained for legacy purpose */
    #define GPIO_OTYPER_IDR_0                    GPIO_IDR_IDR_0
    #define GPIO_OTYPER_IDR_1                    GPIO_IDR_IDR_1
    #define GPIO_OTYPER_IDR_2                    GPIO_IDR_IDR_2
    #define GPIO_OTYPER_IDR_3                    GPIO_IDR_IDR_3
    #define GPIO_OTYPER_IDR_4                    GPIO_IDR_IDR_4
    #define GPIO_OTYPER_IDR_5                    GPIO_IDR_IDR_5
    #define GPIO_OTYPER_IDR_6                    GPIO_IDR_IDR_6
    #define GPIO_OTYPER_IDR_7                    GPIO_IDR_IDR_7
    #define GPIO_OTYPER_IDR_8                    GPIO_IDR_IDR_8
    #define GPIO_OTYPER_IDR_9                    GPIO_IDR_IDR_9
    #define GPIO_OTYPER_IDR_10                   GPIO_IDR_IDR_10
    #define GPIO_OTYPER_IDR_11                   GPIO_IDR_IDR_11
    #define GPIO_OTYPER_IDR_12                   GPIO_IDR_IDR_12
    #define GPIO_OTYPER_IDR_13                   GPIO_IDR_IDR_13
    #define GPIO_OTYPER_IDR_14                   GPIO_IDR_IDR_14
    #define GPIO_OTYPER_IDR_15                   GPIO_IDR_IDR_15
    
    /******************  Bits definition for GPIO_ODR register  *******************/
    #define GPIO_ODR_ODR_0                       ((uint32_t)0x00000001)
    #define GPIO_ODR_ODR_1                       ((uint32_t)0x00000002)
    #define GPIO_ODR_ODR_2                       ((uint32_t)0x00000004)
    #define GPIO_ODR_ODR_3                       ((uint32_t)0x00000008)
    #define GPIO_ODR_ODR_4                       ((uint32_t)0x00000010)
    #define GPIO_ODR_ODR_5                       ((uint32_t)0x00000020)
    #define GPIO_ODR_ODR_6                       ((uint32_t)0x00000040)
    #define GPIO_ODR_ODR_7                       ((uint32_t)0x00000080)
    #define GPIO_ODR_ODR_8                       ((uint32_t)0x00000100)
    #define GPIO_ODR_ODR_9                       ((uint32_t)0x00000200)
    #define GPIO_ODR_ODR_10                      ((uint32_t)0x00000400)
    #define GPIO_ODR_ODR_11                      ((uint32_t)0x00000800)
    #define GPIO_ODR_ODR_12                      ((uint32_t)0x00001000)
    #define GPIO_ODR_ODR_13                      ((uint32_t)0x00002000)
    #define GPIO_ODR_ODR_14                      ((uint32_t)0x00004000)
    #define GPIO_ODR_ODR_15                      ((uint32_t)0x00008000)
    /* Old GPIO_ODR register bits definition, maintained for legacy purpose */
    #define GPIO_OTYPER_ODR_0                    GPIO_ODR_ODR_0
    #define GPIO_OTYPER_ODR_1                    GPIO_ODR_ODR_1
    #define GPIO_OTYPER_ODR_2                    GPIO_ODR_ODR_2
    #define GPIO_OTYPER_ODR_3                    GPIO_ODR_ODR_3
    #define GPIO_OTYPER_ODR_4                    GPIO_ODR_ODR_4
    #define GPIO_OTYPER_ODR_5                    GPIO_ODR_ODR_5
    #define GPIO_OTYPER_ODR_6                    GPIO_ODR_ODR_6
    #define GPIO_OTYPER_ODR_7                    GPIO_ODR_ODR_7
    #define GPIO_OTYPER_ODR_8                    GPIO_ODR_ODR_8
    #define GPIO_OTYPER_ODR_9                    GPIO_ODR_ODR_9
    #define GPIO_OTYPER_ODR_10                   GPIO_ODR_ODR_10
    #define GPIO_OTYPER_ODR_11                   GPIO_ODR_ODR_11
    #define GPIO_OTYPER_ODR_12                   GPIO_ODR_ODR_12
    #define GPIO_OTYPER_ODR_13                   GPIO_ODR_ODR_13
    #define GPIO_OTYPER_ODR_14                   GPIO_ODR_ODR_14
    #define GPIO_OTYPER_ODR_15                   GPIO_ODR_ODR_15
    
    /******************  Bits definition for GPIO_BSRR register  ******************/
    #define GPIO_BSRR_BS_0                       ((uint32_t)0x00000001)
    #define GPIO_BSRR_BS_1                       ((uint32_t)0x00000002)
    #define GPIO_BSRR_BS_2                       ((uint32_t)0x00000004)
    #define GPIO_BSRR_BS_3                       ((uint32_t)0x00000008)
    #define GPIO_BSRR_BS_4                       ((uint32_t)0x00000010)
    #define GPIO_BSRR_BS_5                       ((uint32_t)0x00000020)
    #define GPIO_BSRR_BS_6                       ((uint32_t)0x00000040)
    #define GPIO_BSRR_BS_7                       ((uint32_t)0x00000080)
    #define GPIO_BSRR_BS_8                       ((uint32_t)0x00000100)
    #define GPIO_BSRR_BS_9                       ((uint32_t)0x00000200)
    #define GPIO_BSRR_BS_10                      ((uint32_t)0x00000400)
    #define GPIO_BSRR_BS_11                      ((uint32_t)0x00000800)
    #define GPIO_BSRR_BS_12                      ((uint32_t)0x00001000)
    #define GPIO_BSRR_BS_13                      ((uint32_t)0x00002000)
    #define GPIO_BSRR_BS_14                      ((uint32_t)0x00004000)
    #define GPIO_BSRR_BS_15                      ((uint32_t)0x00008000)
    #define GPIO_BSRR_BR_0                       ((uint32_t)0x00010000)
    #define GPIO_BSRR_BR_1                       ((uint32_t)0x00020000)
    #define GPIO_BSRR_BR_2                       ((uint32_t)0x00040000)
    #define GPIO_BSRR_BR_3                       ((uint32_t)0x00080000)
    #define GPIO_BSRR_BR_4                       ((uint32_t)0x00100000)
    #define GPIO_BSRR_BR_5                       ((uint32_t)0x00200000)
    #define GPIO_BSRR_BR_6                       ((uint32_t)0x00400000)
    #define GPIO_BSRR_BR_7                       ((uint32_t)0x00800000)
    #define GPIO_BSRR_BR_8                       ((uint32_t)0x01000000)
    #define GPIO_BSRR_BR_9                       ((uint32_t)0x02000000)
    #define GPIO_BSRR_BR_10                      ((uint32_t)0x04000000)
    #define GPIO_BSRR_BR_11                      ((uint32_t)0x08000000)
    #define GPIO_BSRR_BR_12                      ((uint32_t)0x10000000)
    #define GPIO_BSRR_BR_13                      ((uint32_t)0x20000000)
    #define GPIO_BSRR_BR_14                      ((uint32_t)0x40000000)
    #define GPIO_BSRR_BR_15                      ((uint32_t)0x80000000)
    
    /****************** Bit definition for GPIO_LCKR register *********************/
    #define GPIO_LCKR_LCK0                       ((uint32_t)0x00000001)
    #define GPIO_LCKR_LCK1                       ((uint32_t)0x00000002)
    #define GPIO_LCKR_LCK2                       ((uint32_t)0x00000004)
    #define GPIO_LCKR_LCK3                       ((uint32_t)0x00000008)
    #define GPIO_LCKR_LCK4                       ((uint32_t)0x00000010)
    #define GPIO_LCKR_LCK5                       ((uint32_t)0x00000020)
    #define GPIO_LCKR_LCK6                       ((uint32_t)0x00000040)
    #define GPIO_LCKR_LCK7                       ((uint32_t)0x00000080)
    #define GPIO_LCKR_LCK8                       ((uint32_t)0x00000100)
    #define GPIO_LCKR_LCK9                       ((uint32_t)0x00000200)
    #define GPIO_LCKR_LCK10                      ((uint32_t)0x00000400)
    #define GPIO_LCKR_LCK11                      ((uint32_t)0x00000800)
    #define GPIO_LCKR_LCK12                      ((uint32_t)0x00001000)
    #define GPIO_LCKR_LCK13                      ((uint32_t)0x00002000)
    #define GPIO_LCKR_LCK14                      ((uint32_t)0x00004000)
    #define GPIO_LCKR_LCK15                      ((uint32_t)0x00008000)
    #define GPIO_LCKR_LCKK                       ((uint32_t)0x00010000)

    Konfigurieren tust Du die IOs dann z.B. so:

    Code:
    GPIOA->MODER |= ( GPIO_MODER_MODER5_0 );
    GPIOA->OSPEEDR |= ( GPIO_OSPEEDER_OSPEEDR5_1 );

    Fertig ist die Laube.

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Vielen Dank für eure Hilfe, entschuldigt bitte daß ich mich so lange nicht mehr gemeldet habe. HW-Entwicklung ging vor.
    Ich denk ich hab den Code verstanden.
    Und ich hab jetzt die richtigen Dateien...und noch nen Riesenhaufen Bibliotheken für die Peripherie.

    Ich kriegs nur nicht hin, die Bibliotheken korrekt ins Projekt einzubinden. Ich will mit meinem Programm ja bloß eine LED blinken lassen (und als erste Vorstufe die LED erstmal nur einschalten). Dazu wollte ich die GPIO-Bibliothek einbinden, aber das funktioniert nicht. Die include-Anweisung meckert der Kompiler jedesmal an.

    Jetzt hab ich mal aus Spaß einfach die letzten beiden Zeilen meines Vorposters stumpf in die main-Funktion kopiert. Wider Erwarten kommt keine Fehlermeldung was mich jetzt wiederum zu der Frage führt: Brauch ich die GPIO-Dateien um die Pins wackeln zu lassen? (Offenbar ist dem ja aber so.) Wenn ich die GPIO-Bibliothek dafür nicht brauche, wofür sind die dann gut?

    Edit:
    Gemeint ist natürlich die stm32f4xx_gpio.h.
    Geändert von White_Fox (11.06.2016 um 13:35 Uhr)

  7. #7
    Unregistriert
    Gast
    Zitat Zitat von White_Fox Beitrag anzeigen
    Jetzt hab ich mal aus Spaß einfach die letzten beiden Zeilen meines Vorposters stumpf in die main-Funktion kopiert. Wider Erwarten kommt keine Fehlermeldung was mich jetzt wiederum zu der Frage führt: Brauch ich die GPIO-Dateien um die Pins wackeln zu lassen? (Offenbar ist dem ja aber so.) Wenn ich die GPIO-Bibliothek dafür nicht brauche, wofür sind die dann gut?

    Edit:
    Gemeint ist natürlich die stm32f4xx_gpio.h.

    Habe mich vielleicht ein bisschen unklar ausgedrückt:

    Die stm32f4xx_gpio.h brauchst Du nur, wenn Du die - meiner Meinung nach abgrundtief schlechte - ST-Library nutzt. Dann musst Du diesen ganzen Unsinn mit dem Strukturen-Füllen machen.

    Wenn Du aber die Register direkt beschreibst, dann kannst Du die ganzen anderen Includes weglassen. Ausschließlich die Definitionen aus der stm32f446xx.h sind nötig, damit Du die Register und Bits mit Namen ansprechen kannst.
    Für den reinen Cortex-Kern kannst Du noch die CMSIS-Header einbinden.

    Bei meinen Projekten mache ich es grundsätzlich so:
    Von ST nutze ich:
    - stm32f446xx.h
    - Die CMSIS-Includes (also die core_cm4.h includen)
    - startup_stm32f446xx.s (Hier stehen die Deklarationen für die Interrupthandler drin sowie der Assemblercode für die Initialisierung der statischen Variable, etc.)

    Das war es auch schon.
    Die Initialisierung der MCU mache ich komplett selber.
    In der startup_stm32f446xx.s wird zuerst die Funktion SystemInit aufgerufen, danach dann die Funktion main.

    In der von mir erstellten Funktion SystemInit initialisiere ich die MCU. Also zuerst aktiviere ich die Caches, konfiguriere den Prefetch und die Waitstates.
    Anschließend konfiguriere ich die PLLs und schalte auf die entsprechende Taktquelle (meistens HSE, entweder extern -> Nucleo oder Quarz) um.

    Ob man dann die Peripherie wie GPIOs, Timer, Systick, etc. in der SystemInit konfiguriert oder erst später, ist dann Geschmackssache.

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Ah ja...vielen Dank, jetzt ist mir Einiges schon viel klarer, ein paar Feagen hab ich aber noch.

    Was ist eigentlich die genaue Funktion des Output-Speed-Registers? Ich werd da aus dem Datenblatt nicht schlau, kann aber auch daran liegen daß ich immer noch mehr oder weniger in meiner AVR-Denke drinhänge und imemr wieder staune, um welchen Mist man sich beim ARM kümmern muß.
    Muß ich das Speed-Register eigentlich beschreiben oder wird sich auch so etwas tun?

    Ich muß ja, soweit ich das mitbekommen habe, den Port noch irgendwie an einen Bus anbinden. Nach was richtet man sich da, woher weiß ich wie ich da den Port am besten wo anbinde? Wie geht man da vor allem vor, wenn man etwas mehr Peripherie verwendet?

    Kann meinen Code leider nicht testen, weil ich Embedded Studio nicht mit dem J-Link zusammenkriege.
    J-Link Commander hat aber seltsamerweise keine Probleme mit dem J-Link zu quatschen.

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <stm32f446xx.h>
    
    /*********************************************************************
    *
    *       main()
    *
    *  Function description
    *   Application entry point.
    */
    void main(void) {
    GPIOA->MODER |= (GPIO_MODER_MODER5_0);    //A5 => Ausgang
    GPIOA->OTYPER |= (GPIO_OTYPER_OT_5);      //A5 0> OpenDrain
    GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR5);     //A5 ohne Pullup-Pulldown
    }

  9. #9
    Unregistriert
    Gast
    Der Output-Speed ist für die Schaltflanken der IOs zuständig.
    Er kontrolliert also die Slew-Rate (also die Anstiegs- und Abfallzeit der Flanken).
    Je größer die Anstiegszeit, desto größer sind die abgestrahlten Störsignale. Daher sollte man den Output Speed nur so schnell wie nötig konfigurieren.

    Das Speed-Register musst Du übrigens nicht beschreiben, nach dem Reset ist die Default-Einstellung 00 (also Low speed). Nur Port B ist da eine Ausnahme.

    Die Komplexität hat übrigens nichts mit dem ARM-Kern zu tun. ST hätte auch Simpel-Peripherie wie beim AVR an den Cortex anbinden können. Aber das wäre doch Verschwendung

    Was Du mit "Bus-Anbinden" meinst, verstehe ich nicht. Der Port läuft nach dem Reset sofort (bis auf die paar Ausnahmen wie JTAG, etc.). Du musst nur den Takt für den entsprechenden Port einschalten, wie auch für jede andere Peripherie.
    Also z.B. für Port A:
    Code:
    RCC->AHB1ENR |= ( RCC_AHB1ENR_GPIOAEN );
    Danach kannst Du dann ganz normal Bits setzen oder zurücksetzen:
    Code:
    GPIOA->BSRR |= GPIO_BSRR_BS_0;
    oder
    Code:
    GPIOA->BSRR |= GPIO_BSRR_BR_0;
    Oder meinst Du das Umlegen der Peripherie-Funktionen auf andere Pins über das AFR-Register?



    Zitat Zitat von White_Fox Beitrag anzeigen
    Ah ja...vielen Dank, jetzt ist mir Einiges schon viel klarer, ein paar Feagen hab ich aber noch.

    Was ist eigentlich die genaue Funktion des Output-Speed-Registers? Ich werd da aus dem Datenblatt nicht schlau, kann aber auch daran liegen daß ich immer noch mehr oder weniger in meiner AVR-Denke drinhänge und imemr wieder staune, um welchen Mist man sich beim ARM kümmern muß.
    Muß ich das Speed-Register eigentlich beschreiben oder wird sich auch so etwas tun?

    Ich muß ja, soweit ich das mitbekommen habe, den Port noch irgendwie an einen Bus anbinden. Nach was richtet man sich da, woher weiß ich wie ich da den Port am besten wo anbinde? Wie geht man da vor allem vor, wenn man etwas mehr Peripherie verwendet?

    Kann meinen Code leider nicht testen, weil ich Embedded Studio nicht mit dem J-Link zusammenkriege.
    J-Link Commander hat aber seltsamerweise keine Probleme mit dem J-Link zu quatschen.

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <stm32f446xx.h>
    
    /*********************************************************************
    *
    *       main()
    *
    *  Function description
    *   Application entry point.
    */
    void main(void) {
    GPIOA->MODER |= (GPIO_MODER_MODER5_0);    //A5 => Ausgang
    GPIOA->OTYPER |= (GPIO_OTYPER_OT_5);      //A5 0> OpenDrain
    GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR5);     //A5 ohne Pullup-Pulldown
    }

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Hallo,
    Zitat Zitat von White_Fox Beitrag anzeigen
    Jetzt bin ich aber etwas über die Syntax verwirrt. Ich kenne C eher von der Windows-Programmierung her und hab C vllt eine Woche lang auf nem ATMega verwendet. Wenn ich da ein Bit in einem Register setzen will, tu ich das für gewöhnlich so:
    Code:
    Register |= (1<<Bit);
    Einzelne Register sind Write-Only, da funktioniert dies nicht!
    Beim STM32 werden diese als 0 gelesen, bei anderen Prozessoren auch als 1.

    Bei manchen µC und Anwendungen kommt man dann nicht darum herum Schatten-Register zu führen.
    Dies dürfte auch eine der Ideen hinter den Bibliotheken für den Hardware Abstraction Layer sein.

    MfG Peter(TOO)
    Geändert von Peter(TOO) (14.06.2016 um 19:01 Uhr)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

Seite 1 von 4 123 ... LetzteLetzte

Ähnliche Themen

  1. Syntax-Frage -> writeString(char *string)
    Von Furzgas im Forum Robby RP6
    Antworten: 13
    Letzter Beitrag: 31.12.2009, 09:06
  2. Frage zum Ansteuern von Ports/Programmierfrage
    Von Geimel im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 26.01.2007, 23:29
  3. Kurze Syntax Frage
    Von Brantiko im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 18.01.2007, 19:58
  4. Frage zum Programmieren der Ports
    Von Geimel im Forum Asuro
    Antworten: 2
    Letzter Beitrag: 07.08.2006, 20:29
  5. kleine Frage zur Syntax
    Von freddy0815 im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 07.02.2005, 15:19

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test