STM32F303K8 USART1

Gast #4665517
Hallo,

ich möchte bei meinem STM32 USART1 verwenden. Vorerst ohne DMA und nur 
Tx. Ich habe ein Beispiel für USART2 gefunden und angepasst -> 
funktioniert soweit. Richtiges Zeichen kommt am Computer an.
Jetzt das ganze für USART1 angepasst -> funktioniert nicht.
Es kommt nichts am Computer an.

Ausgewertet wird das ganze von Serial -> USB Adapter und Putty.

Code USART2
1
void RCC_Enable(void){
2
    /* Enable GPIO clock */
3
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
4
    /* Enable USART clock */
5
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
6
    /* Enable DMA2 clock -------------------------------------------------------*/
7
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
8
}
9

10
void init_all(void) {
11
    /*===================================================*/
12
    RCC_Enable();
13

14
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_7);
15
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_7);
16

17
    /* Configure USART Tx as alternate function push-pull */
18
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2| GPIO_Pin_3;
19
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
20
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
21
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
22
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
23
    GPIO_Init(GPIOA, &GPIO_InitStructure);
24

25
    USART2_Config();
26
}
27

28
void USART2_Config(void){
29
    USART_Initialisation.USART_BaudRate = 9600;
30
    USART_Initialisation.USART_WordLength = USART_WordLength_8b;
31
    USART_Initialisation.USART_StopBits = USART_StopBits_1;
32
    USART_Initialisation.USART_Parity = USART_Parity_No;
33
    USART_Initialisation.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
34
    USART_Initialisation.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
35
    /* USART configuration */
36
    USART_Init(USART2, &USART_Initialisation);
37
    /* Enable USART */
38
    USART_Cmd(USART2, ENABLE);
39
}

Code USART1
1
void RCC_Enable(void){
2
    /* Enable GPIO clock */
3
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
4
    /* Enable USART clock */
5
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
6
    /* Enable DMA2 clock -------------------------------------------------------*/
7
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
8
}
9

10
void init_all(void) {
11
    /*===================================================*/
12
    RCC_Enable();
13

14
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_7);
15
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_7);
16

17
    /* Configure USART Tx as alternate function push-pull */
18
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6| GPIO_Pin_7;
19
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
20
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
21
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
22
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
23
    GPIO_Init(GPIOB, &GPIO_InitStructure);
24

25
    USART1_Config();
26
}
27

28
void USART1_Config(void){
29
    USART_Initialisation.USART_BaudRate = 9600;
30
    USART_Initialisation.USART_WordLength = USART_WordLength_8b;
31
    USART_Initialisation.USART_StopBits = USART_StopBits_1;
32
    USART_Initialisation.USART_Parity = USART_Parity_No;
33
    USART_Initialisation.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
34
    USART_Initialisation.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
35
    /* USART configuration */
36
    USART_Init(USART1, &USART_Initialisation);
37
    /* Enable USART */
38
    USART_Cmd(USART1, ENABLE);
39
}

Zeichen wird so gesendet
1
USART_SendData(USART2, tx_var);
bzw.
1
USART_SendData(USART1, tx_var);

Habt ihr eine Idee warum USART1 nicht funktioniert?
Gast #4666197
Nachdem ich USART1 und USART2 mit dem Scope vergliechen habe, ist mir 
aufgefallen, dass USART1 nur halb so schnell ist.
Habe nun im uC Programm die Baudrate auf 19200 gestellt und in Putty auf 
9600
-> jetzt werden richtige Zeichen erkannt.

Ich verwende das Nucleo STM32 Board mit dem STM32F303 drauf. Für 
CoreClock usw. habe ich den Generator von ST verwendet:
STM32F30x_Clock_Configuration_V1.0.0.xls
SystemCoreClock habe ich auf 64MHz eingestellt, über HSI und PLL 
generiert.
Könnte es sein, dass von dem Generator falscher Code generiert wird?

Gruß
Andreas
Gast #4666239
APB1 und APB2 werden unterschiedlich konfiguriert.
Ich habe das CubeMX für mich machen lassen:
1
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
2
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
3
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

So etwas in der Art müsste bei dir auch zu finden sein.
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.