具有FreeRTOS的DMA使能ADC

时间:2019-08-16 08:41:31

标签: stm32 freertos dma stm32f1

对于DMA连续请求,程序将仅在DMA1_Channel1_IRQHandler中循环,而FreeRTOS线程未运行。

有人知道如何解决吗?

{

  HAL_Init();


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

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_I2C2_Init();
  MX_IWDG_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  uprintf("Before dma\n");
  HAL_ADC_Start_DMA(&hadc1, adcBuffer, 2);
  uprintf("After dma\n");

  /* Call init function for freertos objects (in freertos.c) */
  MX_FREERTOS_Init();

  /* Start scheduler */
  osKernelStart();

  /* We should never get here as control is now taken by the scheduler */

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

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

1 个答案:

答案 0 :(得分:1)

听起来您的DMA通道具有比FreeRTOS任务(NVIC优先级)更高的优先级(NVIC优先级),并且正在使调度程序处于饥饿状态。要进行故障排除,请尝试将DMA通道设置为与FreeRTOS任务设置(NVIC优先级)匹配,或将FreeRTOS的优先级提高到比DMA高的水平。

将DMA设置为连续请求可能不是您的应用程序所需的配置,或者只是您想要的配置。