b. 임베디드/STM32

[STM32F407VGT Discovery] ADC Interrupt 사용하기

로봇쟁이 2019. 6. 26. 00:05

이번에는 인터럽트 방식을 사용해보겠습니다

 

먼저 ADC를 설정합니다.

 

 

이전 Polling 방식과 같이 ADC1 IN2를 선택하여 체크해 줍니다.

 

이번에는 인터럽트를 사용할 것임으로

 

NVIC 인터럽트 테이블에 Global 인터럽트 Enabled를 체크해 줍니다.

그럼 LL로 변경하시고 Generate Code를 진행합니다.

 

 

인터럽트는 EOCIE bitSet하면 인터럽트가 발생한다고 되어 있네요.

 

그럼 먼저 main 함수를 다음과 같이 작성합니다.

  LL_ADC_Enable(ADC1);
  LL_ADC_EnableIT_EOCS(ADC1);
  LL_ADC_REG_StartConversionSWStart(ADC1);

  /* USER CODE END 2 */

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

    /* USER CODE BEGIN 3 */
	  if(adc_flag == 1)
	  {
		  adc_flag = 0;
		  printf("%d\r\n", adc_data);
	  }
  }

 

main에서 확인해야 할 부분은 ADCADC 인터럽트를 Enable 시키고

한번 LL_ADC_REG_StartConversionSWStart를 시켜줘야 하는 부분입니다. ^^;

 

그리고 stm32f4xx_it.c 파일에 ADC_IRQHandler를 보겠습니다.

 

void ADC_IRQHandler(void)
{
  /* USER CODE BEGIN ADC_IRQn 0 */
	LL_ADC_REG_StartConversionSWStart(ADC1);
	if(LL_ADC_IsActiveFlag_EOCS(ADC1))
	{
		LL_ADC_ClearFlag_EOCS(ADC1);
		adc_flag = 1;
		adc_data = LL_ADC_REG_ReadConversionData12(ADC1);
	}

  /* USER CODE END ADC_IRQn 0 */
  
  /* USER CODE BEGIN ADC_IRQn 1 */

  /* USER CODE END ADC_IRQn 1 */
}

 

동작 설명은 인터럽트가 발생하면 adc_flag1로 변경하고 데이터는 adc_data에 저장 후

이를 main에서 adc_flag를 확인하여 데이터를 출력하도록 만들었습니다.

 

반응형