Forum: Mikrocontroller und Digitale Elektronik STM32F334 USART2


von T. F. (sar)


Lesenswert?

Hallo,

Über die USART2 vom NucleoF334 will ich debug Meldungen mit printf an 
den PC ausgeben. Dies funktioniert solange ich SYSCLK vom HSI über die 
PLL erzeuge, nicht jedoch wenn ich den HSE wähle, dann kommen am 
Terminal keine vernünftigen Zeichen an.
1
void SystemClock_Config(void)
2
{
3
    RCC_OscInitTypeDef RCC_OscInitStruct;
4
    RCC_ClkInitTypeDef RCC_ClkInitStruct;
5
    RCC_PeriphCLKInitTypeDef PeriphClkInit;
6
7
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
8
    RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;
9
    RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
10
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
11
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
12
    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL8;
13
    HAL_RCC_OscConfig(&RCC_OscInitStruct);
14
15
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
16
                                |RCC_CLOCKTYPE_PCLK1;
17
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
18
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV2;
19
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
20
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
21
    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
22
23
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_HRTIM1|RCC_PERIPHCLK_USART2;
24
    PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
25
    PeriphClkInit.Hrtim1ClockSelection = RCC_HRTIM1CLK_PLLCLK;
26
    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
27
28
    HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
29
30
    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
31
32
    __SYSCFG_CLK_ENABLE();
33
34
}

Wechsle ich allerdings auf den HSI (rest gleich wie oben):
1
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
2
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
funktioniert die Kommunikation.

Woran kann das liegen?

von hp-freund (Gast)


Lesenswert?

HSI wird vor PLL noch durch 2 geteilt, HSE nicht.

von hp-freund (Gast)


Lesenswert?

Hatte ich übersehen, hast Du ja schon beachtet.
Was gibt denn der MCO aus?

von hp-freund (Gast)


Lesenswert?

Noch eine Frage: den Quarz und die C hast Du aber richtig bestückt?
Wenn HSE sich nicht Initialisieren lässt, geht er auf HSI zurück.
Dann passt der Multiplikator evtl. nicht mehr.

von T. F. (sar)


Lesenswert?

Hallo,

Der Clock kommt von dem zweiten UC auf dem Nucleo board. Undbdrshalb 
auch bypass in der Config.

Auch wenn ich nur die USART vom HSI takten lasse kommt nur Müll raus. 
Baudrate mal 2 und durch 2 usw habe ich schon ausprobiert..

von hp-freund (Gast)


Lesenswert?

Hast Du den Takt am MCO kontrolliert?

von T. F. (sar)


Lesenswert?

Kann ich im Moment leider nicht. Das Programm läuft ja und wenn ich 
alles außer der USART2 von HSE speise  und USART2 alleine vom HSI (und 
HSI ist aktiviert) bekomme ich auch nur Müll. Muss mir morgen ein Scope 
ausleihen um zu sehen wo das Übel liegt...

von hp-freund (Gast)


Lesenswert?

Die Konfiguration des USART hast Du geprüft?
Das ist, wenn der Takt stimmt, die eigentliche Einstellung - die auch zu 
falschen Zeichen führt.

von hp-freund (Gast)


Lesenswert?

CubeMX setzt den UART auf: 38400,7,n,1

von T. F. (sar)


Lesenswert?

Die Konfiguration ist auf 9600,8,n,1 sonst würde es auch bei nur 
aktivierten HSI+PLL als SYSCLK nicht funktionieren.

von T. F. (sar)


Lesenswert?

Nachdem ich die CMSIS & HAL Libraries neu in das Projekt kopiert habe 
hat alles funktioniert. Muss wohl die Libs aus dem falschen Projekt (bei 
dem ich selber Änderungen an der HAL Lib vorgenommen habe) erwischt 
haben...

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.