Servus zusammen,
Ich verwende zurzeit das erste mal Interrupts und habe noch Probleme
damit. Ich versuche lediglich Daten von meinem STM32F767ZI zu versenden
und zu empfangen. Ich verwende dafür die HAL_Receive_IT(...), sowie die
HAL_Transmit() Funktionen. In der main while(1) rufe ich
HAL_Receive_IT(...) auf und frage eine globale Variable ab. Im Interrupt
Handler von HAL_Receive setze ich die globale Variable von 0 auf 1. Dies
soll in der main dann den Transmit Prozess starten. (siehe Quellcode
unten)
Ich mache das über eine globale Variable weil da später noch mehr Code
dazu kommt und die Interrupts ja nur so gering wie möglich gehalten und
auch Schleifen vermieden werden sollen.
Allerdings habe ich das Problem wenn ich mir über die Uart-Schnittstelle
Daten empfange, sendet er mir nicht immer Daten zurück, was ich mir
nicht erklären kann (siehe Bild).
Hier der Quellcode:
In der main:
int a = 0;
int docklight = 0;
while (1)
{
HAL_UART_Receive_IT(&huart3,&docklight,10);
if(a == 1){
a = 0;
HAL_UART_Transmit(&huart3,(int)&docklight,sizeof(docklight)/4,10);
}
}
In der ISR:
extern a;
extern docklight;
void USART3_IRQHandler(void)
{
/* USER CODE BEGIN USART3_IRQn 0 */
a = 1;
//if(TIM2->CCR1 == 2048) TIM2->CCR1 = 0;
//else TIM2->CCR1 = 2048; //gelb
/* USER CODE END USART3_IRQn 0 */
HAL_UART_IRQHandler(&huart3);
/* USER CODE BEGIN USART3_IRQn 1 */
/* USER CODE END USART3_IRQn 1 */
}
So wie ich das sehe wird in HAL_UART_Transmit() solange verblieben, bis alle Daten gesendet sind. Während dieser Zeit müssen die empfangenen Daten irgendwo gepuffert werden. Hast du das bedacht? Vlt. besser HAL_UART_Transmit_IT benützen?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
