Прерывание AD C мешает while (1) l oop на STM32. Как я могу это исправить? - PullRequest
0 голосов
/ 04 марта 2020

Я работаю над STM32F303 и кодирую с помощью STM32CubeIDE. Я работаю с ИК-датчиком и учусь читать вход AD C. Сначала я все сделал за время l oop без таймеров и без DMA, и все работало отлично.

/* USER CODE BEGIN 2 */
  HAL_ADC_Start(&hadc1);
/* USER CODE END 2 */     
 while(1)
{
      HAL_ADC_PollForConversion(&hadc1, 1000);
      adc=HAL_ADC_GetValue(&hadc1);
      sprintf(data, "%hu\r\n", adc);
      HAL_UART_Transmit(&huart2, (uint8_t*)data, strlen(data), 1000);
      HAL_Delay(1000);
}

Я решил попробовать то же самое с таймером AD C. Поэтому я пометил глобальное прерывание AD C в CubeMX и изменил код на следующий.

/* USER CODE BEGIN 0 */
uint32_t adc;
char data[20];

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    if(hadc->Instance == ADC1) 
    {
        adc = HAL_ADC_GetValue(&hadc1);
      //  sprintf(data, "%hu\r\n", adc);
      //  HAL_UART_Transmit(&huart2, (uint8_t*)data, strlen(data), 1000);
    }
}

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
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_USART2_UART_Init();
  MX_TIM2_Init();
  MX_ADC1_Init();
  /* USER CODE BEGIN 2 */

  HAL_ADC_Start_IT(&hadc1);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
       HAL_UART_Transmit(&huart2, "h", 1, 1000);
       HAL_Delay(500);

    /* USER CODE END WHILE */

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

Часть AD C работает нормально, когда я смотрю значение объявления c или когда я передаю его на свой com-порт. Проблема в том, что ничего не выполняется, пока l oop. Чтобы проверить это, я отключил выход AD C на ком-порт и вместо этого добавил передачу UART, чтобы просто отправить букву 'h' на мой ком-порт. Ничего не произошло. Но как только я отключаю HAL_ADC_Start_IT(&hadc1);, он сразу начинает работать. Почему у меня проблемы с выполнением while l oop и прерыванием одновременно ??

Заранее спасибо.

...