STM32-Peripheral’s-ADC: Watchdog Mode

STM32-Peripheral’s-ADC: Watchdog Mode

Analog watchdog:

The AWD analog watchdog status bit is set if the analog voltage converted by the ADC is
below a lower threshold or above a higher threshold. These thresholds are programmed in
the 12 least significant bits of the ADC_HTR and ADC_LTR 16-bit registers. An interrupt can
be enabled by using the AWDIE bit in the ADC_CR1 register.
The threshold value is independent of the alignment selected by the ALIGN bit in the
ADC_CR2 register. The analog voltage is compared to the lower and higher thresholds
before alignment.

For this blog we are going to use ADC in trigger mode (Single Channel) , for demonstration purpose we will configure one DAC, output of DAC will be Input of ADC channel & Timer 2 is used to trigger adc conversion.

Creating STM32 executable projects steps are available on this link , please follow steps 1 to 10 as per blog, here we will start from step 11. PA9 & PA10 Pin used for debugging purpose as UART Tx & UART Rx respectively. to learn more about ADC in scan mode click here.

11. Enable ADC Functionality

Go to System mode > Analog > ADC > Enable IN0

Figure 1: Enable ADC

12. Enable Watchdog settings

Figure 2: Enable Watchdog

13. Enable external trigger conversion mode

Go to System mode > Analog > ADC > Parameter settings > External Trigger Conversion Source > Timer 2 Trigger Out Event

Go to System mode > Analog > ADC > Parameter settings > External Trigger Conversion Edge > Trigger detection on the rising edge

Figure 3: Enable external conversion mode

14. Enable ADC Interrupt

Go to System mode > Analog > ADC > NVIC settings > ADC Interrupt enable

Figure 4: Enable ADC Interrupt

15. Enable timer 2 for internal ADC trigger

Go to System mode > Timers > Tim2 > Clock Source > Enable Internal Clock

Go to System Mode > timers > Tim2 > Parameter Settings > Set timer according to your requirement

Go to System Mode > timers > Tim2 > Parameter Settings > Trigger Event Selection > select Update Event

Figure 5: Enable Timer 2 for internal ADC Interrupt

16. Press below icon for code generation

Figure 6: Cube IDE Code Generation

17. Sample Code

static volatile U8  adc_wd_flag = 0;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
  if (hadc->Instance->SR & ADC_SR_AWD)
    adc_wd_flag = 1;

  HAL_ADC_Start_IT(&hadc1);	//Enable ADC in interrupt mode 
  HAL_TIM_Base_Start(&htim2);//Enable timer 2 for adc internal trigger.

while (1)

    /* USER CODE BEGIN 3 */
	HAL_Delay(1000);	//1000 ms delay
	RTC_CalendarShow(aShowTime, aShowDate);
	uart1_printf_debug(YEL"time = %s\n",aShowTime);
	HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, dac_data);
	HAL_Delay(500);	//500 ms delay
	uart1_printf_debug(GRN"DAC Value = %d  === ",dac_data);

	if (adc_wd_flag == 1)
      uart1_printf_debug(RED"Watchdag Alarm\n");
      adc_wd_flag = 0;

	if (dac_data > 2100)
		dac_data = 2048;

17. Debug Output

Software Tools:
  1. STM32CubeIDE
  2. STM32CubeMx
  3. Teraterm
Hardware Setup:
  1. STM32F429IDISCOVERY board
  2. Mini USB Cable
  3. Jumper wire

Successfully demonstrated ADC functionality in Watchdog mode (Single Channel), for testing purpose we have used DAC to connect its output to ADC & UART for debug.

  1. STM32 HAL Library
  2. STM32 UM1718 document
Similar topics:
  2. STM32 Peripherals: GPIO
  3. STM32 Peripherals: DAC
  4. STM32 Peripherals: ADC using Polling Mode

Leave a Reply

Your email address will not be published. Required fields are marked *

%d bloggers like this: