STM32F031K6 HAL UART Interrupts Problem

Geben Sie hier die Bildbeschreibung einIch habe eine neue STM32F0 31 K6 Nucleo-Platine und muss auf dieser Platine eine GSM-UART-Schnittstelle erstellen. Ich muss als ersten Schritt ein AT senden und ein OK von der GSM-Karte erhalten. Ich kann AT erfolgreich senden, kann aber nichts empfangen. Ich verwende IAR. Ich verwende PA9 - TX und PA10 - RX. So erstellen Sie einen Sende- und Empfangscode mit Interrupts mit dieser HAL-Bibliothek. Ich habe Code mit Interrupts geschrieben und er gibt kein einziges Zeichen aus. Das ist mein Code

     int main(void)
{

  HAL_Init();
  /* Configure the system clock to 48 MHz */
  SystemClock_Config();
    /* Configure LED3 */
  BSP_LED_Init(LED3);
  UART_Init();
  BSP_LED_Off(LED3);
  if(HAL_UART_Transmit(&UartHandle, (uint8_t*)aTxBuffer, TXBUFFERSIZE,100)!= HAL_OK)
  {
    Error_Handler();
  }

    if(HAL_UART_Receive_IT(&UartHandle, (uint8_t *)aRxBuffer,6) != HAL_OK)
  {
    Error_Handler();
  }
   /*##-5- Wait for the end of the transfer ###################################*/   
  while (UartReady != SET)
  {
  } 
    /* Reset transmission flag */
  UartReady = RESET;
  /*if(HAL_UART_Transmit(&UartHandle, (uint8_t*)aRxBuffer, 6,1000)!= HAL_OK)
  {
    Error_Handler();
  }*/
  while (1)
  {
  }
}

IRQ-Handler

void USARTx_IRQHandler(void)
{
  HAL_UART_IRQHandler(&UartHandle);
}

Rückruffunktion erhalten

void  HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
  if(UartHandle->Instance == USARTx)
  {  
    /* Set transmission flag: transfer complete */
    UartReady = SET;
    BSP_LED_On(LED3); 
  }
}

Und wenn ich debugge, bleibt der Code an dieser Stelle hängen.

/*##-5- Wait for the end of the transfer ###################################*/   
  while (UartReady != SET)
  {
  } 

Meine eigentliche Anwendung besteht darin, mit UART eine SMS an das GSM-Board zu senden und die Antwort in einem Puffer zu sammeln und sie dann zu analysieren. Zuerst muss ich diese Schnittstelle erstellen. Und ich kann DMA nicht verwenden, da keine Ahnung hat, wie viele Daten empfangen werden diese Kommunikation.

bitte helft jungs..

Grüße, Olivia

Ich empfehle, damit zu beginnen, einen minimalen kompilierbaren Code bereitzustellen, der nicht das tut, was Sie denken, dass er tun sollte, zusammen mit allen Erkenntnissen, die Sie aus Debugging-Versuchen gewonnen haben.
Bitte gehen Sie wie folgt vor ... Lesen Sie dies: electronic.stackexchange.com/help/how-to-ask Stellen Sie eine spezifische Frage und geben Sie alle Details zu Ihrer Frage an. Eine gute Frage braucht keine Klärung. Welche GSM-Schnittstelle? Welcher Kommunikationsbus? SPI I2C oder RS232 (um nur einige zu nennen). Diese Art von Fragen sollten nicht gestellt werden müssen.
@laptop2d Laut Titel ist es UART. Es ist jedoch unklar, da es in den Fragetext hätte aufgenommen werden sollen.
@OliviaChristy Wenn Sie einen Code haben, der nicht funktioniert, sollten Sie das auch in die Frage aufnehmen. Und vielleicht ein Schema, stellen Sie sicher, dass Sie die RX-TX-Leitungen nicht gemischt haben.
Fügen Sie auch Schaltpläne hinzu, die Flusskontrolle ist standardmäßig auf dem Modul deaktiviert oder aktiviert?
Flow Control Pins sind auf den mcu PA0 und PA1 verfügbar. aber es funktioniert als ADC in und ADC out auf den Headern.
Wie ist die Flusssteuerungskonfiguration bezüglich des GSM-Moduls? Ich interessiere mich auch nicht für den Schaltplan des Nucleo-Boards, ich interessiere mich für Ihren Schaltplan, wie Sie das GSM-Modul mit dem Nucleo verbunden haben. Vielleicht sollten Sie versuchen, mehrmals innerhalb der Hauptleitung zu senden und zu empfangen. Grundsätzlich scheint Ihr Code in Ordnung zu sein (richtiger Callback und Interrupt-Handler), aber die Hölle weiß, was Ihr GSM-Modul erwartet, da Sie immer noch kein Datenblatt hinzugefügt haben.
hallo leute ich habe es geschafft. Jeder, der ein Problem mit Interrupt UART in stm32-Boards hat, die die Hal-Bibliothek verwenden, folgt bitte diesem Link. letanphuc.net/2015/09/stm32f0-uart-tutorial-5/#comment-278 Es hat mir geholfen

Antworten (3)

Eine grundlegende UART-Initialisierung mit Interrupts, die HAL verwenden, sieht in etwa so aus wie unten. Ich möchte die Parameter nicht beschreiben, da sie ziemlich offensichtlich sind. Es ist eine tatsächliche Pin-Konfiguration und die UART-Peripheriekonfiguration. HAL_UART_MspInitwird von angerufen HAL_UART_Init, um es zu benutzen, müssen Sie nur anrufen MX_USART1_UART_Init.

#include "stm32f0xx_hal.h"

UART_HandleTypeDef huart1;

void MX_USART1_UART_Init(void)
{
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  huart1.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  HAL_UART_Init(&huart1);
}

void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
  GPIO_InitTypeDef GPIO_InitStruct;
  if(huart->Instance==USART1)
  {
    __USART1_CLK_ENABLE();

    /**USART1 GPIO Configuration    
    PA2     ------> USART1_TX
    PA3     ------> USART1_RX 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF1_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);       
    HAL_NVIC_EnableIRQ(USART1_IRQn);               // Enable Interrupt
  }
}

Die Interruptbehandlung ist wie folgt:

void USART1_IRQHandler()
{
  HAL_UART_IRQHandler(&huart1);
}

Dies ist die eigentliche ISR und HAL_UART_IRQHandler(&huart1)eine von HAL definierte Handler-Funktion. Es prüft, welches Interrupt-Quellen-Flag gesetzt wurde, ruft einen Callback auf oder wartet auf den Empfang weiterer Bytes und löscht die Interrupt-Flags.

Im Falle von RX-Interrupts zählt dieser Handler die empfangenen Bytes und ruft bei Empfang der gewünschten Menge diese Callback-Funktion auf:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if (huart->Instance == USART1)
  {
    // Your buffer is full with your data process it here or set a flag
  }
}

Der Callback hat eine schwache Deklaration, die müssen Sie implementieren.

Nun zur Nutzung. Zum Senden kann die folgende HAL-Funktion verwendet werden, dies ist die einfachste:

HAL_UART_Transmit(&huart1, (uint8_t*)"AT\r", 3, 0xFFFFFF)

Um mit Interrupt zu empfangen muss man folgende Funktion verwenden:

HAL_UART_Receive_IT(&huart1, uint8_t *pData, uint16_t size)

Dabei pDataist ein Zeiger auf den Empfangspuffer und sizedie Anzahl der erwarteten Bytes. Der HAL_UART_IRQHandler(&huart1)ruft den Rückruf auf, wenn die Anzahl der empfangenen Bytes gleich ist size.

All dies kann mit dem STM32CubeMX- Codegenerator generiert werden, mit Ausnahme der Callbacks, die nicht generiert werden.


Das GSM-Modul hat wahrscheinlich standardmäßig den Echo-Modus aktiviert, so dass AT\res mit antwortet \r\nAT\r\n\r\nOK\r\n, es sollten 12 Bytes gewartet werden.

Der Echomodus kann per ATE0Befehl deaktiviert und mit dem Befehl als Standard gespeichert werden AT&W. Daraus ergibt sich die Antwort \r\nOK\r\nauf die AT\r.

Ich hatte kürzlich ein ähnliches Problem mit meinem LTE-Modul. Es stellt sich heraus, dass viele solcher Module die Hardware-Flusskontrolle standardmäßig aktiviert haben. Sie können auch die HW-Flusskontrolle an Ihrem Ende verwenden oder einfach den CTS-Pin des Moduls erden.

Auch aus irgendeinem Grund wurde in meinem Fall die Beschriftung für RX/TX und RTS/CTS vertauscht. Wenn also die obige Lösung nicht funktioniert hat, können Sie es mit getauschten Verbindungen versuchen.

Danke Jungs für die Diskussion! Ich stand vor dem ähnlichen Problem. In meinem Fall habe ich Interrupts aktiviert (NVIC_EnableIRQ), HAL_UART_RxCpltCallback() und HAL_UART_Receive_IT() Call geschrieben.

Aber das habe ich übersehen:

void USART1_IRQHandler() { HAL_UART_IRQHandler(&huart1); }

Ohne den obigen Handler kann der Interrupt nicht von HAL_UART_RxCpltCallback() und der App abgefangen werden. tritt in eine Endlosschleife ein, da es keinen Interrupt-Handler sieht.