Forum: Mikrocontroller und Digitale Elektronik UART Problem zwischen ESP32 und STM32


von Jj O. (jj_online)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe ein Problem bei der UART Kommunikation zwischen einem ESP32 und 
STM32. Es funktioniert alles soweit bis ich den ESP32 hardresete dann 
sehe ich erstmal ein Framingerror auf RX und im TX einen Shift in der 
Antwort. Sobald ich den STM32 dann hardresete funktioniert wieder alles 
und ich sehe auch die gleiche Ausgabe wie Eingabe. Kann mir jemand 
helfen?

Scheint wohl ein Framing Error zu sein. Wie behebe ich den? Hier mein 
Code:
1
  #include "main.h"
2
3
4
  #include "ProductMain.h"
5
  #include <string.h>
6
7
  #include "DebugOutput.h"
8
9
  #include "GUI.h"
10
11
12
13
  uint8_t UART7_rxBuffer[2] = {0};
14
  uint8_t pass1 = 99;
15
16
  uint8_t rfidDetected = 0;
17
18
19
  SPI_HandleTypeDef hspi1;
20
21
  UART_HandleTypeDef huart7;
22
  UART_HandleTypeDef huart1;
23
24
25
  void SystemClock_Config(void);
26
  static void MX_GPIO_Init(void);
27
  static void MX_SPI1_Init(void);
28
  static void MX_UART7_Init(void);
29
  static void MX_USART1_UART_Init(void);
30
31
  char spi_buf ='A';
32
33
  int main(void)
34
  {
35
36
    HAL_Init();
37
38
    SystemClock_Config();
39
40
41
    MX_GPIO_Init();
42
    MX_SPI1_Init();
43
    MX_UART7_Init();
44
    MX_USART1_UART_Init();
45
46
    Product_init();
47
48
49
    HAL_UART_Receive_IT (&huart7, UART7_rxBuffer, 2);
50
51
    while (1)
52
    {
53
      Product_loop(pass1);
54
55
    }
56
57
  }
58
59
60
  void SystemClock_Config(void)
61
  {
62
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
63
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
64
65
   
66
    __HAL_RCC_PWR_CLK_ENABLE();
67
    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);
68
69
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
70
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
71
    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
72
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
73
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
74
    RCC_OscInitStruct.PLL.PLLM = 16;
75
    RCC_OscInitStruct.PLL.PLLN = 192;
76
    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
77
    RCC_OscInitStruct.PLL.PLLQ = 4;
78
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
79
    {
80
    Error_Handler();
81
    }
82
83
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
84
                  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
85
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
86
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
87
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
88
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV8;
89
90
    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
91
    {
92
    Error_Handler();
93
    }
94
    HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLLCLK, RCC_MCODIV_1);
95
  }
96
97
98
  static void MX_SPI1_Init(void)
99
  {
100
101
102
    hspi1.Instance = SPI1;
103
    hspi1.Init.Mode = SPI_MODE_MASTER;
104
    hspi1.Init.Direction = SPI_DIRECTION_2LINES;
105
    hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
106
    hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
107
    hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
108
    hspi1.Init.NSS = SPI_NSS_SOFT;
109
    hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
110
    hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
111
    hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
112
    hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
113
    hspi1.Init.CRCPolynomial = 10;
114
    if (HAL_SPI_Init(&hspi1) != HAL_OK)
115
    {
116
    Error_Handler();
117
    }
118
119
120
  }
121
122
123
  static void MX_UART7_Init(void)
124
  {
125
126
127
    huart7.Instance = UART7;
128
    huart7.Init.BaudRate = 9600;
129
    huart7.Init.WordLength = UART_WORDLENGTH_8B;
130
    huart7.Init.StopBits = UART_STOPBITS_1;
131
    huart7.Init.Parity = UART_PARITY_NONE;
132
    huart7.Init.Mode = UART_MODE_TX_RX;
133
    huart7.Init.HwFlowCtl = UART_HWCONTROL_NONE;
134
    huart7.Init.OverSampling = UART_OVERSAMPLING_16;
135
    if (HAL_UART_Init(&huart7) != HAL_OK)
136
    {
137
    Error_Handler();
138
    }
139
140
141
  }
142
143
144
  static void MX_USART1_UART_Init(void)
145
  {
146
147
148
    huart1.Instance = USART1;
149
    huart1.Init.BaudRate = 9600;
150
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
151
    huart1.Init.StopBits = UART_STOPBITS_1;
152
    huart1.Init.Parity = UART_PARITY_NONE;
153
    huart1.Init.Mode = UART_MODE_TX_RX;
154
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
155
    huart1.Init.OverSampling = UART_OVERSAMPLING_16;
156
    if (HAL_UART_Init(&huart1) != HAL_OK)
157
    {
158
    Error_Handler();
159
    }
160
161
162
  }
163
164
165
  static void MX_GPIO_Init(void)
166
  {
167
    GPIO_InitTypeDef GPIO_InitStruct = {0};
168
169
170
    __HAL_RCC_GPIOE_CLK_ENABLE();
171
    __HAL_RCC_GPIOF_CLK_ENABLE();
172
    __HAL_RCC_GPIOH_CLK_ENABLE();
173
    __HAL_RCC_GPIOA_CLK_ENABLE();
174
    __HAL_RCC_GPIOD_CLK_ENABLE();
175
176
    HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_RESET);
177
178
179
    HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, GPIO_PIN_RESET);
180
181
182
    HAL_GPIO_WritePin(GPIOD, DISPLAY_RESET_Pin|DISPLAY_DATA_CMD_Pin, GPIO_PIN_RESET);
183
184
185
    GPIO_InitStruct.Pin = GPIO_PIN_6;
186
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
187
    GPIO_InitStruct.Pull = GPIO_NOPULL;
188
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
189
    HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
190
191
192
    GPIO_InitStruct.Pin = SPI1_CS_Pin;
193
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
194
    GPIO_InitStruct.Pull = GPIO_NOPULL;
195
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
196
    HAL_GPIO_Init(SPI1_CS_GPIO_Port, &GPIO_InitStruct);
197
198
199
    GPIO_InitStruct.Pin = GPIO_PIN_8;
200
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
201
    GPIO_InitStruct.Pull = GPIO_NOPULL;
202
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
203
    GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
204
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
205
206
207
    GPIO_InitStruct.Pin = DISPLAY_RESET_Pin|DISPLAY_DATA_CMD_Pin;
208
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
209
    GPIO_InitStruct.Pull = GPIO_NOPULL;
210
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
211
    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
212
213
    GPIO_InitStruct.Pin = DISPLAY_BUSY_Pin;
214
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
215
    GPIO_InitStruct.Pull = GPIO_NOPULL;
216
    HAL_GPIO_Init(DISPLAY_BUSY_GPIO_Port, &GPIO_InitStruct);
217
218
  }
219
220
221
222
  void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
223
  {
224
225
    HAL_UART_Transmit(&huart7, UART7_rxBuffer, 2, 100);
226
    HAL_UART_Receive_IT(&huart7, UART7_rxBuffer, 2);
227
228
  }
229
230
231
  void Error_Handler(void)
232
  {
233
234
    __disable_irq();
235
    while (1)
236
    {
237
    }
238
239
  }
240
241
  #ifdef  USE_FULL_ASSERT
242
243
  void assert_failed(uint8_t *file, uint32_t line)
244
  {
245
246
  }
247
  #endif /* USE_FULL_ASSERT */

Beste Grüße

: Bearbeitet durch User
von Harry L. (mysth)


Lesenswert?

Jj O. schrieb:
> void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
>   {
>     HAL_UART_Transmit(&huart7, UART7_rxBuffer, 2, 100);
>     HAL_UART_Receive_IT(&huart7, UART7_rxBuffer, 2);
>   }

Was soll das?

HAL_UART_Transmit und HAL_UART_Receive haben in dem Callback absolut 
nichts verloren!

Das muß doch knallen.

Beschäftge dich noch mal mit den nicht blockierenden Funktionen!
Das sind die Funktionen, deren Namen auf "_IT" enden - Bsp: 
HAL_UART_Transmit_IT.

Es reicht nicht, die nur einmal vor der mainloop aufzurufen, und man 
sollte sich entscheiden:
Entweder Interrupt-basierend, dann brauchst du die Versionen mit _IT, 
und nur Die, oder via Polling, und dann natürlich gar keine 
Funktionen mit _IT.

Ein Mix geht meist in die Hose.

von Jj O. (jj_online)


Lesenswert?

Hast du Recht... ist mir passiert als ich von DMA auf Interrupts 
gewechselt bin. Fixe ich gleiche, habe aber das gleiche Problem mit DMA.

Habe das gleich korrigiert, framing error bleibt aber weiterhin 
bestehen.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Jj O. schrieb:
> Habe das gleich korrigiert, framing error bleibt aber weiterhin
> bestehen.

Ja logisch! Wenn der Controller (Sender) einen RESET macht, geht das 
IO-Pin auf Tristate. Dann macht das Signal was es will, wenn kein 
passender, externer Pull-Up Widerstand existiert.

Außerdem muss eine ROBUSTE Empfangsroutine mit solchen Fehlern klar 
kommen und sich selber wieder syncronisieren. Dazu gibt es spezielle 
Kennzeichen im Datenstrom, Pakete mit Prüfsummen und Timeouts.

von Stefan F. (Gast)


Lesenswert?

Der Bootloader gibt ja auch Text mit einer "unerwarteten" Baudrate aus, 
auch das führt zum Framing Fehler.

von Jj O. (jj_online)


Lesenswert?

Jup, danke aber wie handle ich das jetzt auf der Seite vom STM?

Bin gerade dabei mit

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{

  HAL_UART_Abort_IT(&huart7);
}

ne Lösung zu schaffen. Immerhin wird der Framingerror schon detektiert 
aber wie verhindere ich das der Buffer gefüllt wird? Oder denke ich hier 
gerade falsch?

von Beo B. (beobachte)


Lesenswert?

Stefan ⛄ F. schrieb:
> Der Bootloader gibt ja auch Text mit einer "unerwarteten" Baudrate aus,
> auch das führt zum Framing Fehler.

🤡 Der esp32 ist 240hz und der stm32 72hz, deshalb geht das nicht! 🤡

von Jj O. (jj_online)


Lesenswert?

So scheint's zu funktionieren ^^

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
  HAL_UART_Abort_IT(&huart7);
  HAL_UART_Receive_IT (&huart7, UART7_rxBuffer, 3);
  HAL_UART_Transmit_IT (&huart7, UART7_rxBuffer, 3);
}

Aber so ganz sauber...

Hat jemand noch ne bessere Idee?

Beitrag #7028972 wurde vom Autor gelöscht.
von Harry L. (mysth)


Angehängte Dateien:

Lesenswert?

Jj O. schrieb:
> Hat jemand noch ne bessere Idee?

Schau dir mal den Code im Anhang an.

von Stefan F. (Gast)


Lesenswert?

Der HAL UART Treiber Code ist nicht so einfach zu verwenden, wie bei 
Arduino. Vor allem zwingen einem die Festen Puffergrößen dazu, wein 
wenig länger über das Konstrukt nachzudenken.

Hier wurde mal ausführlich diskutiert, wie man mit HAL_UART_xxxx_IT 
einen Ringpuffer umsetzt. Suche mal danach, ich fand den Thread ziemlich 
aufschlussreicht (und hatte danach beschlossen, den UART lieber "zu Fuß" 
zu programmieren, weil mit das mit der HAL unnötig kompliziert vor kam).

von Forist (Gast)


Lesenswert?

Jj O. schrieb:
> Scheint wohl ein Framing Error zu sein.

Vor allen Dingen scheint ein ernstes Problem mit einfachstem 
Textverständnis zu bestehen.

Zurück auf Los und lies noch einmal ganz gründlich:
1
Wichtige Regeln - erst lesen, dann posten!
2
...
3
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

von Harry L. (mysth)


Lesenswert?

Stefan ⛄ F. schrieb:
> Vor allem zwingen einem die Festen Puffergrößen
Das ist Unfug!

Stefan ⛄ F. schrieb:
> Hier wurde mal ausführlich diskutiert, wie man mit HAL_UART_xxxx_IT
> einen Ringpuffer umsetzt. Suche mal danach

So kompliziert ist das nicht, und ich hab mehrfach funktionierenden Code 
gezeigt.
Zu letzt hier:

Beitrag "Re: UART Problem zwischen ESP32 und STM32"

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.