Forum: Mikrocontroller und Digitale Elektronik STM32F4 CubeMX UART Probleme


von Peter K. (peterka2000)


Angehängte Dateien:

Lesenswert?

Guten Tag,

Ich würde gerne über den UART eines STM32F4 was verschicken. Hardware 
ist (vorerst) ein STM32F4-Discovery, mit dem STM32F407VG.
Das letzte mal als ich mit dem Zeug gearbeitet hab, war das noch die 
Standard-Peripheral-Lib, jetzt wollte ich mal das Cube-Zeugs 
ausprobieren.
Also, gesagt, getan, ein neues CubeMX-Projekt (CubeMX Version 4.13.1) 
für Atollic TrueStudio (V 5.4.0). Den UART habe ich, zum debuggen, 
erstmal mit dem Klickibunti-Interface von CubeMX konfiguriert. Der 
entstandene Source-Code ist angehangen. Baudrate sollte übrigens 9600 
sein.

Raus kommt aber nichts, was wie UART aussieht. Nur die Signale vom Bild, 
und die alle 40ms (wie zu erwarten; aber halt nichts UART-ähnliches).

Hat jemand die Lust/Zeit/Erfahrung, mich beim Debugging zu ünterstützen? 
Wem springt mein Fehler sofort ins Auge?

PS: Noch was zur Config: Habe den HSE auf die 8 MHz gestellt, die PLL 
auf M=8; N=336 und P=2. Sollten also 168MHz Sysclk rauskommen.
PPS: TxD ist an PA9. Hab ich mit einem LA verbunden. Auch wenn das im 
Quelltext nicht ersichtbar ist, ist der in einer von CubeMX-generierten 
LowLevel-Methode (im UART_Init) auf AlternativeFunction geschalten.

: Bearbeitet durch User
von Vincent H. (vinci)


Lesenswert?

__UART1_CLK_ENABLE();

?

von Peter K. (peterka2000)


Lesenswert?

Vincent H. schrieb:
> __UART1_CLK_ENABLE();
>
> ?

sollte CubeMX für mich machen:

Die HAL_UART_Init:
1
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
2
{
3
  /* Check the UART handle allocation */
4
  if(huart == NULL)
5
  {
6
    return HAL_ERROR;
7
  }
8
9
  /* Check the parameters */
10
  if(huart->Init.HwFlowCtl != UART_HWCONTROL_NONE)
11
  { 
12
    /* The hardware flow control is available only for USART1, USART2, USART3 and USART6 */
13
    assert_param(IS_UART_HWFLOW_INSTANCE(huart->Instance));
14
    assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl));
15
  }
16
  else
17
  {
18
    assert_param(IS_UART_INSTANCE(huart->Instance));
19
  }
20
  assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength));
21
  assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling));
22
  
23
  if(huart->gState == HAL_UART_STATE_RESET)
24
  {  
25
    /* Allocate lock resource and initialize it */
26
    huart->Lock = HAL_UNLOCKED;
27
    /* Init the low level hardware */
28
    HAL_UART_MspInit(huart);
29
  }
30
31
  huart->gState = HAL_UART_STATE_BUSY;
32
33
  /* Disable the peripheral */
34
  __HAL_UART_DISABLE(huart);
35
  
36
  /* Set the UART Communication parameters */
37
  UART_SetConfig(huart);
38
  
39
  /* In asynchronous mode, the following bits must be kept cleared: 
40
     - LINEN and CLKEN bits in the USART_CR2 register,
41
     - SCEN, HDSEL and IREN  bits in the USART_CR3 register.*/
42
  huart->Instance->CR2 &= ~(USART_CR2_LINEN | USART_CR2_CLKEN);
43
  huart->Instance->CR3 &= ~(USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN);
44
  
45
  /* Enable the peripheral */
46
  __HAL_UART_ENABLE(huart);
47
  
48
  /* Initialize the UART state */
49
  huart->ErrorCode = HAL_UART_ERROR_NONE;
50
  huart->gState= HAL_UART_STATE_READY;
51
  huart->RxState= HAL_UART_STATE_READY;
52
  
53
  return HAL_OK;
54
}

und die msp_init, die von obiger aufgerufen wird:
1
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
2
{
3
4
  GPIO_InitTypeDef GPIO_InitStruct;
5
  if(huart->Instance==USART1)
6
  {
7
  /* USER CODE BEGIN USART1_MspInit 0 */
8
9
  /* USER CODE END USART1_MspInit 0 */
10
    /* Peripheral clock enable */
11
    __USART1_CLK_ENABLE();
12
  
13
    /**USART1 GPIO Configuration    
14
    PA9     ------> USART1_TX
15
    PA10     ------> USART1_RX 
16
    */
17
    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
18
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
19
    GPIO_InitStruct.Pull = GPIO_PULLUP;
20
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
21
    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
22
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
23
24
  /* Peripheral interrupt init*/
25
    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
26
    HAL_NVIC_EnableIRQ(USART1_IRQn);
27
  /* USER CODE BEGIN USART1_MspInit 1 */
28
29
  /* USER CODE END USART1_MspInit 1 */
30
  }
31
32
}

von Vincent H. (vinci)


Lesenswert?

Hab grad nochmal ins Datenblatt geschaut, der 407er hat im USART_CR1 
Register eigene Bits für "Transmitter enable" und "Receiver enable". 
Hast du schon überprüft ob die gesetzt werden?


So wie ich das seh setzt nämlich weder das Makro
1
__HAL_UART_ENABLE(__HANDLE__)                   ((__HANDLE__)->Instance->CR1 |=  USART_CR1_UE)

Noch die USART_Transmit Funktion dieses Bit?

von Peter K. (peterka2000)


Lesenswert?

So schnell gehts, ich habe es (vermutlich) hinbekommen.

Mindestens ein Problem habe ich entdeckt:

Der TxD-Pin (PA9) ist am Discovery-Board auch für VBUS (von USB) 
genutzt. Da liegt wohl noch irgendwas auf der Leitung, was den stört. 
Ich habe den jetzt auf PB6-regemapped.
Außerdem gibt es wohl noch irgendein Problem mit meiner 
Debug-Konfiguration im TrueSTUDIO, also musste ich die Software erstmal 
(manuell) über die ST-Link Utility flashen.

Aber er macht das was er soll. Trotzdem danke an alle, die versucht 
haben, zu helfen.

Schönen Freitag,
Peter

: Bearbeitet durch User
von Dr. MIPS (Gast)


Lesenswert?

Peter K. schrieb:
> Guten Tag,
>
> PS: Noch was zur Config: Habe den HSE auf die 8 MHz gestellt, die PLL
> auf M=8; N=336 und P=2. Sollten also 168MHz Sysclk rauskommen.
> PPS: TxD ist an PA9. Hab ich mit einem LA verbunden. Auch wenn das im
> Quelltext nicht ersichtbar ist, ist der in einer von CubeMX-generierten
> LowLevel-Methode (im UART_Init) auf AlternativeFunction geschalten.


Zum eigentlichen Problem schreibe ich nichts (die Libraries sind einfach 
würg und ohne geht es meiner Meinung nach viel einfacher), aber die 
PLL-Faktoren solltest Du umstellen.
Laut Datenblatt ist der Jitter bei M=4 deutlich kleiner.
("Caution: The software has to set these bits correctly to ensure that 
the VCO input frequency ranges from 1 to 2 MHz. It is recommended to 
select a frequency of 2 MHz to limit PLL jitter.")

von Peter K. (peterka2000)


Lesenswert?

Dr. MIPS schrieb:
> Zum eigentlichen Problem schreibe ich nichts (die Libraries sind einfach
> würg und ohne geht es meiner Meinung nach viel einfacher), aber die
> PLL-Faktoren solltest Du umstellen.
> Laut Datenblatt ist der Jitter bei M=4 deutlich kleiner.
> ("Caution: The software has to set these bits correctly to ensure that
> the VCO input frequency ranges from 1 to 2 MHz. It is recommended to
> select a frequency of 2 MHz to limit PLL jitter.")
Vielen Dank, ist notiert und wird realisiert! So gründlich habe ich mir 
das Datenblatt doch nicht durchgelesen :)

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.