0

我对使用 ADC 很陌生。我正在使用外部 ADC MAX144 使用 STM32L452RE 获取传感器数据。我将此 ADC 的两个通道用于两个传感器。ADC 不断发送数据,我想读取它。

ADC 的数据表在这里

我正在做的是:

  1. 创建了一个 2 字节的缓冲区
  2. 我将 DMA 用于 spi 和 uart
  3. 使用 HAL_SPI_Receive_DMA() 接收缓冲区中的数据
  4. 使用 HAL_UART_Transmit_DMA() 通过 usart 传输数据

我所做的代码如下:

#include "main.h"
#include "stm32l4xx_hal.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/
SPI_HandleTypeDef hspi3;
DMA_HandleTypeDef hdma_spi3_rx;

TIM_HandleTypeDef htim1;

UART_HandleTypeDef huart3;
DMA_HandleTypeDef hdma_usart3_tx;

/* USER CODE BEGIN PV */
/* Private variables --------------------------------------------------- 
 ------*/

static uint8_t readBuffer[2];
/* 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_USART3_UART_Init(void);
 static void MX_SPI3_Init(void);
 static void MX_TIM1_Init(void);

 /* USER CODE BEGIN PFP */
 /* Private function prototypes -----------------------------------------------*/

 /* USER CODE END PFP */

/* USER CODE BEGIN 0 */

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi){
while(1);
}

void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma){
while(1);
}
`enter code here`void delay(uint16_t delay)
 {
__HAL_TIM_SET_COUNTER(&htim1,0);
while(__HAL_TIM_GET_COUNTER(&htim1) < delay);
 }

 /* USER CODE END 0 */

  /**
  * @brief  The application entry point.
  *
  * @retval None
  */
 int main(void)
 {
 /* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/* MCU Configuration----------------------------------------------------------*/

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

/* USER CODE BEGIN Init */

/* USER CODE END Init */

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

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART3_UART_Init();
MX_SPI3_Init();
MX_TIM1_Init();
/* USER CODE BEGIN 2 */

/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
 while (1)
{

 /* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, SET);

  HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
  HAL_Delay(80);

  HAL_SPI_Receive_DMA(&hspi3, readBuffer, 2);
  HAL_UART_Transmit_DMA(&huart3, readBuffer, 2);
}
/* USER CODE END 3 */

}

在过去的两周里,我陷入了这个问题。任何这方面的指南都将受到高度赞赏。

问候。

4

1 回答 1

0

这些回调不起作用

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi){
    while(1);
}

void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma){
    while(1);
}

回调是直接从中断例程中调用的。如果您在其中放置一段时间(1),则中断将永远不会完成。

在没有 DMA 功能的情况下进行第一次尝试。

HAL_SPI_Receive(&hspi3, readBuffer, 2);
HAL_UART_Transmit(&huart3, readBuffer, 2);

看看你的 SPI ready ind USART 写作是否有效。作为第二步,您可以尝试设置 DMA 传输。

于 2019-09-03T13:57:52.187 回答