使用 DMA 将 ADC 值传输到 UART 的问题

问题描述 投票:0回答:0

The data that I am getting on Putty

我目前正在从事个人项目,目前我想了解使用 DMA 的 ADC 的基础知识以及使用 UART 将值传输到我的计算机。我正在研究 STM CubeIDE,我使用连接到电位器的引脚 A0 对 ADC 进行了正确的配置,因此根据其电阻传输 0 到 4096 之间的模拟值。

我正在使用带有 UART 回调和 Putty 的循环缓冲区和乒乓配置,以检查我是否收到了正确的整数。问题是我收到的是特殊字符而不是整数,这是一个真正的问题,因为我需要使用这些整数来使用算法计算传感器的温度。这就是我目前尝试做的事情。通过 TIM2 的配置,我使用 ADC 获得了实际值,但我无法链接 UART DMA 并在我的 PC 上传输这些值。

#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include "uart.h"
/* USER CODE END Includes */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

#define BUFFER_SIZE 128
int i;                        // AO!
char msgbuf[BUFFER_SIZE];     // AO!

/* USER CODE END PD */

/* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc;
DMA_HandleTypeDef hdma_adc;

TIM_HandleTypeDef htim2;

UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart2_tx;
DMA_HandleTypeDef hdma_usart2_rx;

/* USER CODE BEGIN PV */

uint16_t ADC_buffer[BUFFER_SIZE];
uint16_t DAC_buffer[BUFFER_SIZE];

static volatile uint16_t *inBufPtr = &ADC_buffer[0];
static volatile uint16_t *outBufPtr = &DAC_buffer[0];

uint8_t dataReadyFlag; // flag in order to process the data
uint16_t adcdata[1];

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_ADC_Init(void);
static void MX_USB_PCD_Init(void);
static void MX_TIM2_Init(void);
/* USER CODE BEGIN PFP */

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc);
void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef *hadc);

/* USER CODE END PFP */
HAL_DMA
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart2)
{
    inBufPtr = &ADC_buffer[0];
    outBufPtr = &DAC_buffer[0];
    HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
    dataReadyFlag = 1;
}

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart2)
{
    inBufPtr = &ADC_buffer[BUFFER_SIZE / 2];
    outBufPtr = &DAC_buffer[BUFFER_SIZE / 2];
    HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
    dataReadyFlag = 1;
}

void processData()
{
    static uint16_t leftIn, leftOut;
    static uint16_t rightIn, rightOut;

    for (uint8_t n = 0; n < (BUFFER_SIZE / 2) - 1; n += 2) {
        /*
         * Left Channel
         */
        /* Get ADC input and convert to float */
        leftIn = (uint16_t)inBufPtr[n];
        if (leftIn > 1)
            leftIn -= 2;
        /*Compute new output sample */
        leftOut = leftIn;

        /* Convert back to signed int and set DAC output*/
        outBufPtr[n] = (uint16_t)leftOut;

        /*
         * Right Channel
         */
        /* Get ADC input and convert to float */
                rightIn = (uint16_t)inBufPtr[n + 1];
                if (rightIn > 1)
                    rightIn -= 2;
                /* Compute new output sample */
                rightOut = rightIn;

                /* Convert back to signed int and set DAC output */
                outBufPtr[n + 1] = (uint16_t)rightOut;
    }
    dataReadyFlag = 0;
}

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART2_UART_Init();
  MX_ADC_Init();
  MX_USB_PCD_Init();
  MX_TIM2_Init();

  /* USER CODE BEGIN 2 */

  HAL_UART_Receive_DMA(&huart2, (uint16_t *)DAC_buffer, BUFFER_SIZE);
  HAL_UART_Transmit_DMA(&huart2, (uint16_t *)ADC_buffer, BUFFER_SIZE);
  HAL_ADC_Start_DMA(&hadc, (uint32_t *)adcdata, 1);
  HAL_TIM_Base_Start(&htim2);

  // HAL_UART_Transmit_DMA(&huart2, (uint8_t *)ADC_buffer, BUFFER_SIZE);

  // uart_Init(&huart2);

  /* USER CODE END 2 */

  /* Infinite loop */
  while (1)
  {
      if (dataReadyFlag)
          processData();
  }
}
c stm32 uart dma adc
© www.soinside.com 2019 - 2024. All rights reserved.