我目前正在从事个人项目,目前我想了解使用 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();
}
}