Отправка данных с помощью USB CDC (STM32)

#c #stm32 #adc #nucleo #stm32cubeide

#c #stm32 #АЦП #nucleo #stm32cubeide

Вопрос:


Я использую NucleoF413ZH и STM32CubeIDE. У меня есть 16 микрофонов, каждый из которых подключается к одному каналу АЦП и благодаря использованию DMA направляет данные в память. Однако я хотел бы выполнить взаимную корреляцию сигналов, поэтому я пришел к выводу, что я отправлю данные на ПК или RPi 4b, и я бы выполнил вычисления там. Но проблема для меня заключается в отправке такого большого количества данных из памяти. Я пытаюсь использовать CDC_TRANSMIT_FS, но я не могу отправить все 16 измерений канала, также передача очень медленная. Есть ли какой-либо способ отправить весь массив из 16 элементов или даже лучше 16xM элементов, так что, возможно, это будет быстрее? Мне нужно 16mic x10bit x44,1 кГц ~ = 7 Мбит / с = 882 Кбайт / с, также я могу уменьшить некоторые микрофоны до 12 из них. Вот мой код (полный по ссылке https://pastebin.pl/view/6059edc8 ):


Кроме того, извините, если что-то не подходит грамматически, английский — мой второй язык, и я все еще учусь


 /* USER CODE BEGIN PV */
uint16_t Pomiar[16]; // measurments 16x1
char msg[10];

uint8_t DataToSend[40]; // 
uint8_t MessageCounter = 0; //
uint8_t MessageLength = 0; // Msg lngth
/* USER CODE END PV */
  

  /* USER CODE BEGIN 2 */
  HAL_ADC_Start_DMA(amp;hadc1, (uint16_t*)Pomiar, 16);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */

  while (1)
  {

    // CDC_Transmit_FS((uint8_t*)Pomiar, (512));

        //  MessageCounter;
        //MessageLength = sprintf(DataToSend, "Wiadomosc nr %dnr", MessageCounter);
    //  MessageLength = sprintf(DataToSend, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%dnr", Pomiar[0],Pomiar[1],Pomiar[2],Pomiar[3],Pomiar[4],Pomiar[5],Pomiar[6],Pomiar[7],Pomiar[8],Pomiar[9],Pomiar[10],Pomiar[11],Pomiar[12],Pomiar[13],Pomiar[14],Pomiar[15]);
        MessageLength = sprintf(DataToSend, "%d:%d:%d:%dnr", Pomiar[0],Pomiar[1],Pomiar[2],Pomiar[3]);
        CDC_Transmit_FS(DataToSend, MessageLength);

      //HAL_Delay(1);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  

настройки usart

 static void MX_USART3_UART_Init(void)
    {
    
      /* USER CODE BEGIN USART3_Init 0 */

  /* USER CODE END USART3_Init 0 */

  /* USER CODE BEGIN USART3_Init 1 */
    // huart3.Init.BaudRate = 115200;
  /* USER CODE END USART3_Init 1 */
  huart3.Instance = USART3;
 // huart3.Init.BaudRate = 115200;
  huart3.Init.BaudRate = 921600;
  huart3.Init.WordLength = UART_WORDLENGTH_8B;
  huart3.Init.StopBits = UART_STOPBITS_1;
  huart3.Init.Parity = UART_PARITY_NONE;
  huart3.Init.Mode = UART_MODE_TX_RX;
  huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart3.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(amp;huart3) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART3_Init 2 */

  /* USER CODE END USART3_Init 2 */

}
  

Ответ №1:

sprintf выполняется очень медленно, и вы отправляете ASCII 5 цифр на выборку АЦП. Вы можете отправлять необработанные шестнадцатеричные данные по 2 байта на выборку для экономии полосы пропускания следующим образом

 CDC_Transmit_FS(Pomiar, sizeof(Pomiar));