Forum: Mikrocontroller und Digitale Elektronik stm32f030c6t6 pin read funktioniert nicht


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 eugen (Gast)


Bewertung
0 lesenswert
nicht lesenswert
hi eine Frage, ich nutze die cube mx und stm32 workbench for stm32 
(eclipse).

Ich benutze die HAL und habe 2 output pins um leds an/auszuschalten, was 
funktioniert. Jedoch hab ich einen Taster, der richtig angeschlossen 
ist. Sobald dieser gedrückt wird, liegt 0 V an, jedoch reagiert der uC 
nicht da drauf. Nutze die HAL_ReadPin Funktion. Es wird immer eine 1 
gelesen.
Eingestellt ist 'nopull'. Was mich ebenfalls verwundert ist, dass wenn 
ich einen Interrupt Pin in Cube MX einstelle, dass dann immer 0 gelesen 
wird, obwohl 3.3V anliegen. Ich habe eher den Eindruck, dass es ein 
Software Problem ist.

Vielen Dank für Tips

von Curby23523 N. (nils_h494)


Bewertung
-1 lesenswert
nicht lesenswert
Um welchen Pin handelt es sich denn? Manche Pins haben eine 
Defaultkonfiguration und ich weiß nicht, ob HAL diese entfernt wenn 
nicht explizit gefordert.

von eugen (Gast)


Bewertung
0 lesenswert
nicht lesenswert
es handelt sich um den 7. pin von GPIOB.

von eugen (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ne Frage, wo finde ich diese Defaultkonfiguration. Unter Configuration 
finde ich nichts Aufälliges.

von Max D. (max_d)


Bewertung
0 lesenswert
nicht lesenswert
Beim ARM müssen die pins explizit auf Eingang geschaltet werden. Sonst 
steht im IDR nur Müll. Die pinread Funktion wird vmtl. einfach nur per 
bitmaskierung aus dem IDR lesen.

von pegel (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Zeig doch mal deine ioc Datei.

von eugen (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Soll ich die hochladen oder Bilder von der GUI machen.

Hier ist der Code in Eclipse, sieht alles gut aus.
 
static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin : PB7 */
  GPIO_InitStruct.Pin = GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}



von Curby23523 N. (nils_h494)


Bewertung
0 lesenswert
nicht lesenswert
Max D. schrieb:
> Beim ARM müssen die pins explizit auf Eingang geschaltet werden. Sonst
> steht im IDR nur Müll. Die pinread Funktion wird vmtl. einfach nur per
> bitmaskierung aus dem IDR lesen.

Die GPIOs der STM32 sind per default immer Eingang. GPIO7 ist bei diesem 
Controller schonmal nicht vorbelegt, daran kann es nicht liegen.

Ist der Takt vom GPIOB aktiviert?

von Stefan ⛄ F. (stefanus)


Bewertung
-1 lesenswert
nicht lesenswert
>> Ist der Takt vom GPIOB aktiviert?
> __HAL_RCC_GPIOB_CLK_ENABLE();

Sieht danach aus, würde ich mal sagen.

von Lutz (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Gibt es nun auch bald mal den ganzen Code, damit man auf das fehlende 
volatile hinweisen kann?

von eugen (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
das ist echt seltsam, der liest immer nur ein HIGH, selbst wenn ich den 
taster drücke. Wie gesagt, habs gemessen, wenn ich drücke, liegt 0V am 
Pin an. Kann das sein, dass dieser chip schrott ist? habs bei digikey 
gekauft. Ich meine die uC sind super buggy, hardware und softwareseitig.

von eugen (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert



/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  ** This notice applies to any and all portions of this file
  * that are not between comment pairs USER CODE BEGIN and
  * USER CODE END. Other portions of this file, whether 
  * inserted by the user or by software development tools
  * are owned by their respective copyright owners.
  *
  * COPYRIGHT(c) 2018 STMicroelectronics
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f0xx_hal.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  *
  * @retval None
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
// set_frequency();
  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */



  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
/*
  uint8_t check = SSD1306_Init();  // initialize the diaply

  SSD1306_Fill(0);  // fill the display with black color
  SSD1306_UpdateScreen(); // update screen

  SSD1306_GotoXY(10,10);  // goto 10, 10
  SSD1306_Puts("HELLO", &Font_11x18, 1);  // print Hello

  SSD1306_GotoXY(10, 30);
  SSD1306_Puts("WORLD !!", &Font_11x18, 1);

  SSD1306_UpdateScreen(); // update screen
*/
 // char *msg = "Hello Nucleo Fun!\n\r";

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

    if (HAL_GPIO_ReadPin(GPIOB, 7) == 0)
    {

              HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, 1);

          }
          else
          {
          
              HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, 0);

          }

  }

  /* USER CODE END 3 */

}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
*/
static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOF_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET);

  /*Configure GPIO pins : PF6 PF7 */
  GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

  /*Configure GPIO pin : PB7 */
  GPIO_InitStruct.Pin = GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */


/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @param  file: The file name as string.
  * @param  line: The line in file as a number.
  * @retval None
  */
void _Error_Handler(char *file, int line)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  while(1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{ 
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/




von STM32 Experte (Gast)


Bewertung
1 lesenswert
nicht lesenswert
> Ich meine die uC sind super buggy, hardware und softwareseitig.

Wenn man nicht programmieren kann, schiebt man erstmal alles auf die 
Hard- und Software. So ist es richtig.
Die STM32 sind absolut nicht buggy, zumindest nicht hardwareseitig.

Die HAL... die lasse ich lieber weg bei meinen Projekten. Darauf würde 
ich mich nicht verlassen. Bare-Metal ist hier angesagt.

Wenn Du "NOPULL" eingestellt hast, ist denn dann wenigstens ein 
Pullup-Widerstand am Pin dran? Wo soll denn sonst der High-Pegel 
herkommen?

von Curby23523 N. (nils_h494)


Bewertung
0 lesenswert
nicht lesenswert
OT: Ohne HAL wären das für mich keine 10 Zeilen Code gewesen.

von eugen (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
ich hab leider 2. mal die ioc drin.
hab noch den schaltplan mithochgeladen. sw ist der Switch, also der 
Taster.
Vielen dank für eure Mühe.

von eugen (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
richtig, im layout ist ein pull up. haha, jaa, ich überlege auch die hal 
zu lassen. das ding ist bloss in meinen vorherigen projekten hat es 
immer damit wunderbar geklappt.

von eugen (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
hey jungs, glaub weiss woran das liegt, ich kann das nicht mit 0 und 1 
vergleichen, die funktion returnt kein int.

von eugen (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
ne, klappt auch mit GPIO_PIN_RESET nicht...:(

von Curby23523 N. (nils_h494)


Bewertung
0 lesenswert
nicht lesenswert
Probiere mal folgendes, sofern du die Header + CMSIS richtig im Projekt 
eingefügt hast. Ist zwar nicht ganz die saubere Art mit manchen 
Bitmasken, darum gehts jetzt aber nicht:

#include "stm32f0xx.h"
      
int main(){
  RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
  RCC->AHBENR |= RCC_AHBENR_GPIOFEN;
  GPIOF->MODER |= (0b01 << (2 * 7));
  GPIOB->OTYPER |= (1<<7);

  while(1){
    if(GPIOB->IDR & (1<<7)){
      GPIOF->ODR |= (1<<7);
    }
    else{
      GPIOF->ODR &= ~(1<<7);
    }
  }

  return 0;
}

: Bearbeitet durch User
von eugen (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
es hat geklappt! alter....

danke dir, vielen dank. die hal scheint irgendwas komisch zu machen. 
danke dir, ich werd auf die hal verzichten und auf registerebene weiter 
machen!

von eugen (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
und danke für deine präzision. danke liebes forum, super hilfe!

von Darth Moan (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Moin,

eugen schrieb:
> if (HAL_GPIO_ReadPin(GPIOB, 7) == 0)

Man müsste die HAL Funktion nur mit dem korrekten Parameter aufrufen.
* @param  GPIO_Pin: specifies the port bit to read.
*         This parameter can be GPIO_PIN_x where x can be (0..15).

Und GPIO_PIN_7 ist vom HAL definiert als:
#define GPIO_PIN_7           ((uint16_t)0x0080U)  /* Pin 7 selected  */

Dann würde es auch mit HAL funktionieren (denke ich).
Aber ich mag HAL auch nicht so richtig. Vielleicht hab ich angst, er
bringt mich irgendwann mal um.

von eugen (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
du hast recht, es war die ganze zeit mein fehler :D. anstatt die 5 
reinzugeben, muss ich natürlich GPIO_PIN_7 nehmen. Leider war ich zu 
verballert selbst dadrauf zu kommen. Vielen lieben Dank euch:D

von Stefan ⛄ F. (stefanus)


Bewertung
-1 lesenswert
nicht lesenswert
> Die STM32 sind absolut nicht buggy, zumindest nicht hardwareseitig.

Demnach dürfte es kein Errata Dokument geben.

> Die HAL... die lasse ich lieber weg bei meinen Projekten. Darauf würde
> ich mich nicht verlassen. Bare-Metal ist hier angesagt.

Ja, sehe ich auch so.

> Aber ich mag HAL auch nicht so richtig. Vielleicht hab ich angst, er
> bringt mich irgendwann mal um.

Meinst du Hal Faber von Heise?

Wieso abstrahiert die HAL eigentlich solch primitive Sachen? Damit 
erreicht man doch nichts. Ein Programm, das darauf aufbaut ist kein 
bisschen unabhängig von der Hardware, als wenn man direkt auf die 
Register (über die #defines der CMSIS) zugreifen würde. Ganz im 
Gegenteil, die HAL mach Abhängig von ST, was die CMSIS nicht tut.

von Darth Moan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Stefanus F. schrieb:
> Meinst du Hal Faber von Heise?

Nee, ich meinte HAL9000.

von eugen (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
haha:D hal9000
funktioniert nun endlich

von eugen (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
nehme das zum teil zurück mit dem buggy, heeee.

von Christopher J. (christopher_j23)


Bewertung
0 lesenswert
nicht lesenswert
Max D. schrieb:
> Beim ARM müssen die pins explizit auf Eingang geschaltet werden. Sonst
> steht im IDR nur Müll. Die pinread Funktion wird vmtl. einfach nur per
> bitmaskierung aus dem IDR lesen.

Da bin ich mir ziemlich sicher, dass das nicht für alle STM32 gilt. 
Vielleicht gilt es für manche (F1? bin mir nicht sicher). Grundsätzlich 
kann man das IDR auch auslesen wenn der Port als Output konfiguriert 
ist. Zum testen einfach mal eine LED blinken lassen, ab und zu mit dem 
Debugger anhalten und das entsprechende IDR checken.

von Curby23523 N. (nils_h494)


Bewertung
0 lesenswert
nicht lesenswert
Es gibt zu JEDEM µC von JEDEM Hersteller ein errata und es gibt KEINEN 
fehlerfreien µC von irgendeinem Hersteller. Darüber sollte man sich im 
klaren sein. Aber die meisten µC aller Hersteller sind in 99% ihrer 
Funktionalität fehlerfrei.

eugen schrieb:
> danke dir, ich werd auf die hal verzichten und auf registerebene weiter
> machen!

Das ist eine weise Entscheidung. So lernst du wirklich, was da passiert 
und kannst fehlerfrei, sowie optimierend programmieren.

: Bearbeitet durch User

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