STM32f072vb UART-связь с использованием режима прерывания - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь разработать беспроводной канал связи между платой, основанной на 32-битном ARM на основе STM32f072vb, и устройством Raspberry Pi (Edge). Для этого я использую модуль WiFly RN 171. Между STM32f0 и модулем WiFly устанавливается связь UART с использованием библиотеки stm32f0xx_hal в режиме прерывания. Я довольно новичок в программировании на c, c ++ и некоторое время застрял, пытаясь заставить его работать.

Через некоторое время система получает сообщение об ошибке и понятия не имеет, что может быть. Я использую в основном два класса, основной и класс receive.c. В последнем я реализую методы для TX и RX и называю их в основном.

Плата должна непрерывно передавать информацию, полученную от подключенных датчиков, на RPi (через модуль Wi-Fi с использованием UART2) (tracedataf -> см. В коде). Pi обрабатывает эти данные и при необходимости отправляет фиксированный кадр, используя TCP-соединение с модулем, который, в свою очередь, отправляет данные на плату. Здесь я назначаю его в буфер (dorobo_Buffer_RX -> см. В коде), а затем разделяю его, чтобы получить отдельные значения, которые должны быть назначены для набора двигателей (split, get motor -> see in code). Кажется, моя проблема в управлении связью UART, потому что я получаю сообщение об ошибке от HAL_UART_ErrorCallback

Я прилагаю свой код, любая информация будет полезна.

*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
main
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

//--Import--
int main()
{
//--Initialization--

  receive_Dorobo(); //-->from receive.c

  while(1){

// ---Acquire data---
//--Get data from buffer (UART)--
       m1rx=getMotor(0); //-->from receive.c
       m2rx=getMotor(1); //-->from receive.c
       m3rx=getMotor(2); //-->from receive.c
//--Set motor speed --

 //--Generate message--
      sprintf(msg,"I:%i:%i:%i:%i:%i:%i:%i:%i:%i:E_",sensorLeft,sensorRight,SwLeft,SwRight,t1,t2,m1,m2,m3);

//--Send data via UART--

         tracedataf("%s",msg); // TRACE DOROBO32 MSG //-->from receive.c
         delay(50);
  }
  return 0;                                    
}

*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
receive.c
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

#include "receive.h"
#include "stm32f0xx_hal.h"
#include "string.h"
#include "stdio.h"
#include "stdarg.h"
#include "dorobo32.h"
/***************************************************************************
***************************************************************************/
extern UART_HandleTypeDef huart2;
static UART_HandleTypeDef *trace_uart_ptr = &huart2;
/***************************************************************************
***************************************************************************/
#define MAX_RECEIVE_LENGTH 100 //MAX LENGTH OF THE MSG TO RECEIVE USING 
/***************************************************************************
***************************************************************************/
#define DOROBO32_PACKET_LENGTH 16
#define SAFE_STATE_DOROBO32 "I: +00:+00:+00:E_"
#define HEADER_PACKET_DOROBO32 'I'
#define END_PACKET_DOROBO32 '_'
#define SPLIT_START_P 3
#define LENGHT_DATA_MOTOR 3
/***************************************************************************
***************************************************************************/
#define TX_BUF_LENGTH 80
static char tx_buffer[TX_BUF_LENGTH];
volatile uint8_t synch=0;
//************************************************************************
uint8_t dorobo_Buffer_RX[DOROBO32_PACKET_LENGTH];

int8_t motors [3];
char * Safe_State= SAFE_STATE_DOROBO32;
uint8_t Last_Data[DOROBO32_PACKET_LENGTH];
//************************************************************************

 void receive_Dorobo (void)
{
  HAL_UART_Receive_IT(trace_uart_ptr,(uint8_t *)dorobo_Buffer_RX,DOROBO32_PACKET_LENGTH);
}

 /* @brief  Split the data received from the Edge Device and gets the values to be assigned to the motors
 * @param: Dorobo32_packet: char *
 * Example of packet: I:+10:-20:+30:E_
 */

 static void split(char * string)
 {
  char sub[3];
  int position, length, c = 0;
  position=SPLIT_START_P;
  length=LENGHT_DATA_MOTOR;

  for (int i=0;i<3;i++){
     c=0;
    while (c < length) {
          sub[c] = string[position+c-1];
          c++;
    }
      sub[c] = '\0';
      position=position+4;
      motors [i]=atoi(sub); //assigns the complete value accumulated in the sub[] as an integer to the position motor[i] of the array
    }
 }

 /*
  * @brief  Return the motor speed received from the Edge Device. In case of reception of a wrong packet, the function will
  * return the speed of the last correct packet received.
  * @return received speed for current motor in percentage (0-100)
  * @param: number of motor: int
 */

 int getMotor(int numberMotor){
    flag_bufferData=1;
     if(Last_Data[0]==HEADER_PACKET_DOROBO32 & Last_Data[DOROBO32_PACKET_LENGTH-1]==END_PACKET_DOROBO32) //A validation of the received frame, comparing header and tail
     {
       split(Last_Data);
       Safe_State=Last_Data;
     }
     else { split(Safe_State);}
     flag_bufferData=0;
return motors [numberMotor];
}
 /*
 * @brief   Rx completed Callback
 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  led_green_toggle();  //toggle green led in Dorobo32 board each time a reception of UART is completed
  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
  __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
       synch=0;   
       // "cleaning" buffer;
        for (uint8_t i=0;i<DOROBO32_PACKET_LENGTH;i++)
            {
             Last_Data[i]=dorobo_Buffer_RX[i];
            dorobo_Buffer_RX[i]=0;//clear Rx_Buffer before receiving new data
                    }
          HAL_UART_Receive_IT(trace_uart_ptr,(uint8_t*)dorobo_Buffer_RX,DOROBO32_PACKET_LENGTH);
          synch=1;
       }
/* * @brief: function used to send the data via USART and trigger the interrupt */

void tracedata(char *msg)
{
if (synch==1){
          HAL_UART_Transmit_IT(&huart2, msg,  strlen(msg));
        HAL_Delay(1); //uncomment to enable a delay o the HAL
  }
 }

/** @brief  formats a message to trace using arguments */
void tracedataf(char *fmt, ...)
{
  va_list args;
  va_start(args, fmt);
  vsniprintf(tx_buffer, TX_BUF_LENGTH, fmt, args);
  tracedata(tx_buffer);
  va_end(args);
}

/* @brief   Callback in case of error in UART*/
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
  UNUSED(huart);   /* Prevent unused argument(s) compilation warning */
  if (huart->Instance == USART2)
  {
     __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
      huart->ErrorCode |= HAL_UART_ERROR_ORE;
    //TODO: panic("ERROR IN UART!");
   }
}

/** @brief  Tx completed Callback*/
  void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
  {
  led_red_toggle();  //toggle red led in Dorobo32 board each time a Tx of UART is completed
  }
...