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:
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
@Harry: genauso gehe ich schon bei der Auswertung vor, das ist mir nicht
neu, aber danke trotzdem
Irgendwie blockieren sich die Interrupts gegenseitig, kann das sein?
Denkst mal scharf nach was passiert wenn du 6 oder noch mehr Interrupts
hast die gleichzeitig auftreten können und dann die selbe Priorität
haben. Besonders toll wird es wenn deine ISR länger zum Ausführen
braucht als die Abstände zwischen dem Interrupt.
Der STM hat den NVIC nicht ohne Grund benutz ihn doch einfach.
Kevin M. schrieb:> Denkst mal scharf nach was passiert wenn du 6 oder noch mehr Interrupts> hast die gleichzeitig auftreten können und dann die selbe Priorität> haben. Besonders toll wird es wenn deine ISR länger zum Ausführen> braucht als die Abstände zwischen dem Interrupt.>> Der STM hat den NVIC nicht ohne Grund benutz ihn doch einfach.
Du willst eine Kuh auf's Eis ziehen?
Der NVIC verschafft keine zusätzliche Rechenzeit. Bei gleicher Priorität
werden die Interrupts nacheinander abgearbeitet. Der STM32L4 ist viel zu
schnell, als daß man ihn mit ein paar UARTs groß in die Knie zwingen
könnte.
Sudo schrieb:> Habt ihr einen Tipp für mich, wie ich das hinbekomme?
Reduziere Deine UARTs erst einmal auf zwei und finde heraus, wo es
klemmt.
m.n. schrieb:> Du willst eine Kuh auf's Eis ziehen?
Nein Kühe gehören auf die Weide.
m.n. schrieb:> Der NVIC verschafft keine zusätzliche Rechenzeit.
Das habe ich mit keinem Stück behauptet.