STM32F303K8 USART1

Gast #4665517
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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

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.

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.