Hallo,
ich habe auf meinem STM32L4R5ZI-Nucleo Board 6 UARTs laufen, alle
half-duplex (Single wire) und mit Interrupts. Gesteuert werden
Motortreiberbausteine, hauptsächlich geht es um das fortlaufende
Auslesen der Motorlast im Hintergrund. Nach jedem Sende- und
Empfangsvorgang wird dann der Parameter in der Callback-Routine geprüft
und wenn ein Wert überstiegen wird z.B. der Motor angehalten:
1. Sender aktivieren und UART-Interrupt Prozesse starten:
1 | HAL_HalfDuplex_EnableTransmitter(&huart1);
|
2 | HAL_UART_Transmit(&huart1, data8_ptr, 8, 10);
|
3 | HAL_HalfDuplex_EnableTransmitter(&huart2);
|
4 | HAL_UART_Transmit(&huart2, data8_ptr, 8, 10);
|
5 | HAL_HalfDuplex_EnableTransmitter(&huart3);
|
6 | HAL_UART_Transmit(&huart3, data8_ptr, 8, 10);
|
7 | HAL_HalfDuplex_EnableTransmitter(&huart4);
|
8 | HAL_UART_Transmit(&huart4, data8_ptr, 8, 10);
|
9 | HAL_HalfDuplex_EnableTransmitter(&huart5);
|
10 | HAL_UART_Transmit(&huart5, data8_ptr, 8, 10);
|
11 | HAL_HalfDuplex_EnableTransmitter(&hlpuart1);
|
12 | HAL_UART_Transmit(&hlpuart1, data8_ptr, 8, 10);
|
2. Die Callback Funktionen sorgen dann abwechselnd immer selbst dafür,
dass Daten gesendet und empfangen werden und zwar halt immer für den
Kanal, der den Interrupt auslöst:
1 | void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
|
2 |
|
3 | HAL_HalfDuplex_EnableReceiver(huart);
|
4 | HAL_UART_Receive_IT(huart,indata_ptr,8);
|
5 |
|
6 | }
|
7 |
|
8 | void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
|
9 |
|
10 | if (indata[2] == 65) { // hier passiert dann der Ableich ..... }
|
11 |
|
12 | HAL_HalfDuplex_EnableTransmitter(huart);
|
13 | HAL_UART_Transmit_IT(huart, data_ptr, sendlength); // Sendeschleife
|
14 |
|
15 | }
|
Leider funktioniert das nur mit einem Kanal. Ich habe das auch so
ausprobiert, dass die RxCpltCallback-Funktion die Kanäle nacheinander
ansteuert (also z.B. if huart->INSTANCE==huart1 {huartnext=huart2} dann
beim HAL_UART_Transmit_IT(huartnext, data_ptr, sendlength)) aber das
geht auch nicht.
Habt ihr einen Tipp für mich, wie ich das hinbekomme?
Vielen DANK im Voraus