Forum: Mikrocontroller und Digitale Elektronik Uart Kommunkation fehlerhaft - debug vs flash download


von Michael (Gast)


Lesenswert?

Guten Tag zusammen

Bei der implementierung einer Uart Schnittstelle, die ich als feedback 
zwischen PC und einem  Stm32f070CBT6 verwende (IDE Keil /ARM 
Compiler/MDK-Proffessional),habe ich folgendes Problem:

- Wenn ich debugge bekomme ich alle relevanten Informationen, auch nach 
einem SW reset
- Wenn ich den chip flash bekomme ich nur wirre Zeichen, zumindest bei 
allen Ausgaben, die vor dem Main ausgeführt werden (nach einem HW 
reset)..

Ich gehe von einem Timming Problem aus, im debuge mode werden die 
Ausgänge auf digital gesetzt daher könnte es sein, dass nach dem 
download die Pins nicht richtig konfiguriert sind. Die fehlerhaften 
Informationen erhalte ich nach dem HW Reset.

Was ändert sich noch beim debugen im gegensatz zum eine download auf dem 
Chip?

Über einen heissen tip würde ich mich sehr freuen :)

von Michael (Gast)


Lesenswert?

Keiner eine Idee?

von Steffen R. (steffen_rose)


Lesenswert?

Zu wenig Informationen...

Du debuggst im RAM oder Flash?
Was meinst du ganz genau mit SW Reset? Es gibt davon verschiedene und 
beim debuggen wird ganz gerne kein echter Reset ausgelöst.

Michael schrieb:
> zumindest bei
> allen Ausgaben, die vor dem Main ausgeführt werden

Welchen Takt nimmst du und wann initialisierst du ihn?
Takt und Uart müssen natürlich vor der ersten Ausgabe initialisiert 
werden.

von Michael (Gast)


Lesenswert?

Du debuggst im RAM oder Flash? --> im Flash

Was meinst du ganz genau mit SW Reset? --> Der Watchdog self-test 
erfolgt wie in Bild 3/4 dargestellt (Auszug Applikation note 3307)


/*********************************************************************** 
*******/
/**
  * @brief  Verifies the watchdog by forcing watchdog resets
  * @param  : None
  * @retval : None
  */
void STL_WDGSelfTest(void)
{
  /* 
======================================================================== 
======*/
  /* MISRA violation of rule 12.4 - side effect of && and || operators 
ignored */
  #ifdef _IAR_SYSTEMS_ICC_  /* IAR Compiler */
    #pragma diag_suppress=Pm026
  #endif /* _IAR_SYSTEMS_ICC_ */

  #ifdef STL_VERBOSE_POR
    if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST)  != RESET) printf("Pin reset 
\r\n");
    if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST)  != RESET) printf("POR reset 
\r\n");
    if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST)  != RESET) printf("SW reset 
\r\n");
    if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET) printf("IWDG 
reset \r\n");
    if (__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) != RESET) printf("WWDG 
reset \r\n");
    if (__HAL_RCC_GET_FLAG(RCC_FLAG_LPWRRST) != RESET) printf("LP reset 
\r\n");
  #endif /* STL_VERBOSE_POR */

  /* start watchdogs test if one of the 4 conditions below is valid */
  if ( (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET)\
   ||  (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST) != RESET)\
   ||  (__HAL_RCC_GET_FLAG(RCC_FLAG_LPWRRST) != RESET)\
   || ((__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET) && 
(__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) == RESET) && 
(__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) == RESET)))
  {
    #ifdef STL_VERBOSE_POR
      printf("... Power-on or software reset, testing IWDG ... \r\n");
    #endif  /* STL_VERBOSE_POR */

    #if defined(STL_EVAL_MODE)
      /* IWDG at debug mode */
      __DBGMCU_CLK_ENABLE();
      __HAL_FREEZE_IWDG_DBGMCU();
    #endif  /* STL_EVAL_MODE */

    /* Clear all flags before resuming test */
    __HAL_RCC_CLEAR_FLAG();

    /* Setup IWDG to minimum period */
    IwdgHandle.Instance = IWDG;
    IwdgHandle.Init.Prescaler = IWDG_PRESCALER_4;
    IwdgHandle.Init.Reload = 1;
    #ifdef IWDG_FEATURES_BY_WINDOW_OPTION
      IwdgHandle.Init.Window = IWDG_WINDOW_DISABLE;
    #endif /* IWDG_FEATURES_BY_WINDOW_OPTION */
    /* Initialization */
    HAL_IWDG_Init(&IwdgHandle);

    /* Wait for an independent watchdog reset */
    while(1)
    { }
  }
  else  /* Watchdog test or software reset triggered by application 
failure */
  {
    /* If WWDG only was set, re-start the complete test (indicates a 
reset triggered by safety routines */
    if ((__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST)  != RESET) && 
(__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) == RESET) && 
(__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) != RESET))
    {
      __HAL_RCC_CLEAR_FLAG();
      #ifdef STL_VERBOSE_POR
        printf("... WWDG reset, re-start WDG test ... \r\n");
      #endif  /* STL_VERBOSE_POR */
      NVIC_SystemReset();
    }
    else  /* If IWDG only was set, continue the test with WWDG test*/
    {
      if ((__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST)  != RESET) && 
(__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET) && 
(__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) == RESET))
      { /* If IWDG only was set, test WWDG*/
        #ifdef STL_VERBOSE_POR
          printf("... IWDG reset from test or application, testing 
WWDG\r\n");
        #endif  /* STL_VERBOSE_POR */

        #if defined(STL_EVAL_MODE)
          /* WWDG at debug mode */
          __DBGMCU_CLK_ENABLE();
          __HAL_FREEZE_WWDG_DBGMCU();
        #endif  /* STL_EVAL_MODE */

         /* Setup WWDG to minimum period */
        __WWDG_CLK_ENABLE();
        WwdgHandle.Instance = WWDG;
        WwdgHandle.Init.Prescaler = WWDG_PRESCALER_1;
        WwdgHandle.Init.Counter = 64;
        WwdgHandle.Init.Window = 63;
        WwdgHandle.Init.EWIMode = WWDG_EWI_DISABLE;
        HAL_WWDG_Init(&WwdgHandle);

        while(1)
        { }
      }
      else  /* If both flags IWDG & WWDG flags are set, means that 
watchdog test is completed */
      {
        if ((__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST)  != RESET) && 
(__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET) && 
(__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) != RESET))
        {
          __HAL_RCC_CLEAR_FLAG();
          #ifdef STL_VERBOSE_POR
            printf("... WWDG reset, WDG test completed ... \r\n");
          #endif  /* STL_VERBOSE_POR */
        }
        else  /* Unexpected Flag configuration, re-start WDG test */
        {
          __HAL_RCC_CLEAR_FLAG();
          #ifdef STL_VERBOSE_POR
            printf("...Unexpected Flag configuration, re-start WDG 
test... \r\n");
          #endif  /* STL_VERBOSE_POR */
        NVIC_SystemReset();
        } /* End of Unexpected Flag configuration */
      } /* End of normal test sequence */
    } /* End of partial WDG test (IWDG test done) */
  } /* End of part where 1 or 2 Watchdog flags are set */

  #ifdef _IAR_SYSTEMS_ICC_  /* IAR Compiler */
    #pragma diag_default=Pm026
  #endif /* _IAR_SYSTEMS_ICC_ */
  /* 
======================================================================== 
======*/
}


Welchen Takt nimmst du und wann initialisierst du ihn?


1. Im $Sub$$main stelle ich auf HSI

void StartUpClock_Config(void)
{
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_OscInitTypeDef RCC_OscInitStruct;

  /* Enable Power Control clock */
  __PWR_CLK_ENABLE();

  /* Enable HSI Oscillator */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6;
  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
  if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    #ifdef STL_VERBOSE_POR
      printf("PLL clock config failure\n\r");
    #endif  /* STL_VERBOSE_POR */
    FailSafePOR();
  }
  /* Select PLL as system clock source and configure the HCLK, PCLK1 and 
PCLK2
     clocks dividers */
  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | 
RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1);
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  {
    #ifdef STL_VERBOSE_POR
      printf("PLL clock switch failure\n\r");
    #endif  /* STL_VERBOSE_POR */
    FailSafePOR();
  }
}

Anschliessen führe ich folgende Startup tests gemäss class B software 
durch:
- CPU core self-test
- Watchdogs self-test
- Switch PLL On
- Flash integrity check
- RAM funcional check
- Clock frequency check (evtl liegt hier das Problem, Timer 14 läuft auf 
dem HSI und ich messe den LSI um die Frequenz zu überprüfen.


/*********************************************************************** 
*******/
/**
  * @brief Configure TIM14 to measure LSI period
  * @param  : None
  * @retval : ErrorStatus = (ERROR, SUCCESS)
  */
ErrorStatus STL_InitClock_Xcross_Measurement(void)
{
  ErrorStatus result = SUCCESS;
  TIM_HandleTypeDef  tim_capture_handle;
  TIM_IC_InitTypeDef tim_input_config;
  RCC_OscInitTypeDef        RCC_OscInitStruct;
  RCC_PeriphCLKInitTypeDef  PeriphClkInitStruct;

  __PWR_CLK_ENABLE();
  HAL_PWR_EnableBkUpAccess();

  /* Configue LSI as RTC clock soucre */
  RCC_OscInitStruct.OscillatorType =  RCC_OSCILLATORTYPE_LSI | 
RCC_OSCILLATORTYPE_LSE;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  RCC_OscInitStruct.LSEState = RCC_LSE_OFF;
  RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    result = ERROR;
  }

  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
  PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
  if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  {
    result = ERROR;
  }
  /* Enable RTC Clock */
  __HAL_RCC_RTC_ENABLE();

  /* TIM14 Peripheral clock enable */
  __TIM14_CLK_ENABLE();

  /* Configure the NVIC for TIM14 */
  HAL_NVIC_SetPriority(TIM14_IRQn, 4u, 0u);

  /* Enable the TIM14 global Interrupt */
  HAL_NVIC_EnableIRQ(TIM14_IRQn);

  /* TIM14 configuration: Input Capture mode ---------------------
  The LSI oscillator is connected to TIM14 CH1 via RTC clock.
  The Rising edge is used as active edge, ICC input divided by 8
  The TIM14 CCR1 is used to compute the frequency value.
  ------------------------------------------------------------ */
  tim_capture_handle.Instance = TIM14;
  tim_capture_handle.Init.Prescaler         = 0u; //jt löschen
  tim_capture_handle.Init.CounterMode       = TIM_COUNTERMODE_UP;
  tim_capture_handle.Init.Period            = 0xFFFFFFFFul; //jt löschen 
0xFFFFFFFFul;
  tim_capture_handle.Init.ClockDivision     = 0u;
  tim_capture_handle.Init.RepetitionCounter = 0u;
  /* define internal HAL driver status here as handle structure is 
defined locally */
  __HAL_RESET_HANDLE_STATE(&tim_capture_handle);
  if(HAL_TIM_IC_Init(&tim_capture_handle) != HAL_OK)
  {
    /* Initialization Error */
    result = ERROR;
  }
  /* Connect internally the TIM5_CH1 Input Capture to the LSI clock 
output */
  HAL_TIMEx_RemapConfig(&tim_capture_handle, TIM_TIM14_RTC);

  /* Configure the TIM14 Input Capture of channel 1 */
  tim_input_config.ICPolarity  = TIM_ICPOLARITY_RISING;
  tim_input_config.ICSelection = TIM_ICSELECTION_DIRECTTI;
  tim_input_config.ICPrescaler = TIM_ICPSC_DIV8;
  tim_input_config.ICFilter    = 0u;
  if(HAL_TIM_IC_ConfigChannel(&tim_capture_handle, &tim_input_config, 
TIM_CHANNEL_1) != HAL_OK)
  {
    /* Initialization Error */
    result = ERROR;
  }

  /* Reset the flags */
  tim_capture_handle.Instance->SR = 0u;
  LSIPeriodFlag = 0u;

  /* Start the TIM Input Capture measurement in interrupt mode */
  if(HAL_TIM_IC_Start_IT(&tim_capture_handle, TIM_CHANNEL_1) != HAL_OK)
  {
    /* Initialization Error */
    result = ERROR;
  }
  return(result);
}

- Control Flow check


Die Uart Konfiguration sieht wie folgt aus:

  * @brief  Configure the UART peripheral
  * @param  None
  * @retval None
  */
void USART_Configuration(void)
{
  RCC_PeriphCLKInitTypeDef PeriphClkInit;
  RCC_OscInitTypeDef RCC_OscInitStruct;

   /* Start high speed internal (HSI) oscillator */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6;
  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

   /* HSI feeds USART1 */
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_HSI;
  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);

  /* UART configuration */
  UartHandle.Instance = USART1; //jt USARTx
  UartHandle.Init.BaudRate   = 115200;
  UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
  UartHandle.Init.StopBits   = UART_STOPBITS_1;
  UartHandle.Init.Parity     = UART_PARITY_NONE;
  UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;
  UartHandle.Init.Mode       = UART_MODE_TX;
  __HAL_UART_RESET_HANDLE_STATE(&UartHandle);


//  SystemCoreClockUpdate(); // jt
  HAL_UART_Init(&UartHandle); //jt

}


 2. Im main werden dann wieder zykliche run-time tests durchgeführt.

Clock Konfiguration sieht so aus:

/* 
------------------------------------------------------------------------ 
-*/
/**
  * @brief  System Clock Configuration
  *         The system Clock is configured as follow :
  *            System Clock source            = PLL (HSI)
  *            SYSCLK(Hz)                     = 48000000
  *            HCLK(Hz)                       = 48000000
  *            AHB Prescaler                  = 1
  *            APB1 Prescaler                 = 1
  *            PLL_MUL                        = 6
  *            PLL_PREDIV                     = 1
  *            VDD(V)                         = 3.3
  * @param  None
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_OscInitTypeDef RCC_OscInitStruct;

  /* Enable Power Control clock */
  __PWR_CLK_ENABLE();

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6;
  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;

  if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    #ifdef STL_VERBOSE_POR
      printf("PLL Osc config failure\n\r");
    #endif  /* STL_VERBOSE_POR */
    FailSafePOR();
  }
  /* Select PLL as system clock source and configure the HCLK, PCLK1 and 
PCLK2
     clocks dividers */
  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | 
RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1);
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, MAX_FLASH_LATENCY) != 
HAL_OK)
  {
    #ifdef STL_VERBOSE_POR
      printf("PLL clock config failure\n\r");
    #endif  /* STL_VERBOSE_POR */
    FailSafePOR();
  }
}

von Michael (Gast)


Angehängte Dateien:

Lesenswert?

Sorry nur Bild 3 als Anhang..

von Michael (Gast)


Lesenswert?

Benötigst du noch weiter Informationen?

von Steffen R. (steffen_rose)


Lesenswert?

Michael schrieb:
> - Wenn ich debugge bekomme ich alle relevanten Informationen, auch nach
> einem SW reset

Michael schrieb:
> Was meinst du ganz genau mit SW Reset? --> Der Watchdog self-test
> erfolgt wie in Bild 3/4 dargestellt (Auszug Applikation note 3307)

Es ging mir um den SW reset beim Debuggen. Ich vermute, dass es kein 
echter Reset ist und damit die Einstellungen der UART erhalten bleiben.

Michael schrieb:
> void USART_Configuration(void)

Offen ist, ob du die UART Initialisierung vor deinen ganzen Tests 
aufrufst.

Da es hier um Selbsttests geht, ich g´kenne es so, dass diese vor der 
Initialisierung der C-Umgebung durchgeführt werden. Da wäre ich mir 
unsicher, ob printf() schon funktioniert.

von Michael (Gast)


Lesenswert?

Steffen R. schrieb:
> Offen ist, ob du die UART Initialisierung vor deinen ganzen Tests
> aufrufst.

Die Uart Konfiguration erfolgt vor den startup selbsttests, 
anschschliessend nach den startup und vor den run-time tests nach dem 
Einsprung ins main erneut

Steffen R. schrieb:
> Da es hier um Selbsttests geht, ich g´kenne es so, dass diese vor der
> Initialisierung der C-Umgebung durchgeführt werden. Da wäre ich mir
> unsicher, ob printf() schon funktioniert.

Mein Problem ist eben, dass ich die printf Ausgaben nur beim debuggen 
mit Hterm anzeigen kann, aber beim debuggen failed z.B. der flash 
integritäts test. Wenn ich den code auf den chip flash, funktioniert das 
Programm, aber ich weiss nicht genau wie es sich verhält, weil ich kein 
Feedback über den Erfolg oder fail der Tests bekomme.

Das mit dem Reset schaue ich mir jetzt nochmal genauer an.

von Steffen R. (steffen_rose)


Lesenswert?

Michael schrieb:
> Mein Problem ist eben, dass ich die printf Ausgaben nur beim debuggen
> mit Hterm anzeigen kann, aber beim debuggen failed z.B. der flash
> integritäts test. Wenn ich den code auf den chip flash, funktioniert das
> Programm, aber ich weiss nicht genau wie es sich verhält, weil ich kein
> Feedback über den Erfolg oder fail der Tests bekomme.

Verstehe ich nicht.

Ich debugge auf dem Chip...
Für mich ist es nur ein Unterschied, ob ich den Jtag gesteckt habe oder 
nicht.
Oder ob ich mit Debug oder Release übersetze.

Wenn du das Projekt nicht selbst aufgesetzt hast, kann es sein, dass es 
nur im Release nichts anzeigt, z.B. weil STL_VERBOSE_POR nicht gesetzt 
ist.

Nimmst du eine echte UART Schnittstelle am PC oder eine virtuelle per 
USB. Bei letzterem stören vielleicht die vielen Resets.

Vielleicht nutzt Du im Release auch eine andere printf() 
Implementierung.
Ich persönlich würde erstmal die Selbsttest übergehen und schauen, dass 
das Programm ohne Debugger überhaupt eine Ausgabe macht.

Und im STL_InitClock_Xcross_Measurement() wird der Clock geändert. Falls 
hier was fehlschlägt, wird dann der Clock wieder zurückgeändert, bevor 
eine Ausgabe erfolgt?

Wie wäre es statt printf() eine Funktion anzuspringen, bei der zuerst 
Clock und UART wieder richtig eingestellt werden und dann die Ausgabe 
erfolgt.

Naja, die Ausgaben sind auch nur im Fehlerfall. Vielleicht läuft ja 
alles durch?

von Michael (Gast)


Lesenswert?

Steffen R. schrieb:
> Wenn du das Projekt nicht selbst aufgesetzt hast, kann es sein, dass es
> nur im Release nichts anzeigt, z.B. weil STL_VERBOSE_POR nicht gesetzt
> ist.

Das Beispiel ist von STM und ich habe es für meine Zwecke angepasst, 
STL_VERBOSE_POR ist gesetzt und wird ausgeführt

Steffen R. schrieb:
> Nimmst du eine echte UART Schnittstelle am PC oder eine virtuelle per
> USB. Bei letzterem stören vielleicht die vielen Resets.

USB hab aber auch mit dem oszi nichts vernünftiges bekommen

> Vielleicht nutzt Du im Release auch eine andere printf()
> Implementierung.
> Ich persönlich würde erstmal die Selbsttest übergehen und schauen, dass
> das Programm ohne Debugger überhaupt eine Ausgabe macht.

Die Ausgabe erfolgt, aber die Zeichen werden nicht detektiert.. unten 
habe ich die Ausgabe mit debugger und nach dem flashen gepostet

> Und im STL_InitClock_Xcross_Measurement() wird der Clock geändert. Falls
> hier was fehlschlägt, wird dann der Clock wieder zurückgeändert, bevor
> eine Ausgabe erfolgt?

> Wie wäre es statt printf() eine Funktion anzuspringen, bei der zuerst
> Clock und UART wieder richtig eingestellt werden und dann die Ausgabe
> erfolgt.

Eigentlich ja, aber ich schreibe jetzt mal wie du gesagt hast eine 
Funktion welche clock &Uart immer gleich initialisiert

> Naja, die Ausgaben sind auch nur im Fehlerfall. Vielleicht läuft ja
> alles durch?

Erfolgreiche Tests werden ebenfalls ausgegeben, sorry wenn ich mich 
undeutlich ausgedrückt habe, die Zeichen kommen immer beim debuggen und 
flashen nur sind Sie beim flashen falsch angezeigt wie in Bild 1, 
deshalb dachte ich an ein timming Problem oder das die Uart die falsche 
baudrate berechnet

beim debuggen:

<\n>
<\n>
<\r> *******  Self Test Library Init (Zeile 153 - STL_StartUp) 
*******<\n>
<\r> Start-up CPU Test OK<\n>
<\r>Pin reset <\r><\n>
SW reset <\r><\n>
... Power-on or software reset, testing IWDG ... <\r><\n>
<\n>
<\n>
<\r> *******  Self Test Library Init (Zeile 153 - STL_StartUp) 
*******<\n>
<\r> Start-up CPU Test OK<\n>
<\r>Pin reset <\r><\n>
IWDG reset <\r><\n>
... IWDG reset from test or application, testing WWDG<\r><\n>
<\n>
<\n>
<\r> *******  Self Test Library Init (Zeile 153 - STL_StartUp) 
*******<\n>
<\r> Start-up CPU Test OK<\n>
<\r>Pin reset <\r><\n>
IWDG reset <\r><\n>
WWDG reset <\r><\n>
... WWDG reset, WDG test completed ... <\r><\n>
FLASH 32-bit CRC Error at Start-up<\n>
<\r> >>>>>>>>>> POR FailSafe Mode <<<<<<<<<<<\n>

und so siehts nach dem flash download aus:

?|}????x?<30>??~^?????O?|=???}?<31>??z?<<30>?????<31>/?}???z?>?x~????x?? 
??=_??~?<31>????????????z???????>^<15>?~??<31>?}<31><15>??^??}?^????? 
?z~??^?{<??{_???^<31>??}????|}????x?<30>??~^?????O?|=???}?<31>??z?<<30 
>?????<31>/?}???z?>?x~????x????=_??~?<31>?????o?|??<31>?????????^<31 
>????????}?__/?z????????{????z?>?y?<???}<???_??_/???|}????x?<30>??~^? 
????O?|=???}???|=??????x=?????z?>?x~????x????=_??~?<31>?<31><15>???? 
?o??<31>?????????^<31>????????__<31>????????}<31>/?y>^??~?<30>/?><30>?? 
{????y???x??x}??<?7?(:<25>?}=<28>?<25>;{<_?_\~<29><25><????|<27>{  Clock 
frequency OK <\n>
<\r> Control Flow Checkpoint 2 OK <\n>
<\r><\n>
<\r>  STM32F0xx Cortex-M0 <\n>
<\r>  IEC60335 test @ARMc <\n>
<\r> ... main routine starts ...<\r><\n>

Ich versuchs jetzt mal mit deinem Vorschlag, vielen Dank für die Mühe, 
echt klasse

von Steffen R. (steffen_rose)


Lesenswert?

Michael schrieb:
> und so siehts nach dem flash download aus:
>
> ?|}????x?<30>??~^?????O?|=???}?<31>??z?<<30>?????<31>/?}???z?>?x~????x??
> ??=_??~?<31>????????????z???????>^<15>?~??<31>?}<31><15>??^??}?^?????
> ?z~??^?{<??{_???^<31>??}????|}????x?<30>??~^?????O?|=???}?<31>??z?<<30
>>?????<31>/?}???z?>?x~????x????=_??~?<31>?????o?|??<31>?????????^<3 1
>>????????}?__/?z????????{????z?>?y?<???}<???_??_/???|}????x?<30>??~^ ?
> ????O?|=???}???|=??????x=?????z?>?x~????x????=_??~?<31>?<31><15>????
> ?o??<31>?????????^<31>????????__<31>????????}<31>/?y>^??~?<30>/?><30>??
> {????y???x??x}??<?7?(:<25>?}=<28>?<25>;{<_?_\~<29><25><????|<27>{  Clock
> frequency OK <\n>
> <\r> Control Flow Checkpoint 2 OK <\n>
> <\r><\n>
> <\r>  STM32F0xx Cortex-M0 <\n>
> <\r>  IEC60335 test @ARMc <\n>
> <\r> ... main routine starts ...<\r><\n>
>
> Ich versuchs jetzt mal mit deinem Vorschlag, vielen Dank für die Mühe,
> echt klasse

Ich tippe mal auf falschen Takt (LSI statt HSI?) oder darauf, dass das 
Startbit nicht korrekt erkannte wird (von deinem RS232 nach USB 
Umsetzer).
Wenn möglich, mal auf 2 Stoppbits gehen? Vielleicht kann er dann auch 
besser das Startbit erkennen.

Michael schrieb:
> USB hab aber auch mit dem oszi nichts vernünftiges bekommen

Da etwas herauskommt, verstehe ich diese Aussage nicht.
Heißt es du siehst dort auch die Wirren Zeichen oder "unsinnige" 
Pegelwechsel?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.