snickerdoodle Platform Controller
firmware for STM32F0 platform controller
ADC Functions

Functions

enum sd_adc_err sd_adc_dev_init (struct sd_adc_dev *dev, ADC_HandleTypeDef *adc)
 ADC Device Initialization. More...
 
void sd_adc_init (void)
 
void HAL_ADC_MspInit (ADC_HandleTypeDef *hadc)
 
void HAL_ADC_MspDeInit (ADC_HandleTypeDef *hadc)
 
void sd_adc_watchdog_enable (void)
 ADC Watchdog Enable. More...
 
void sd_adc_irqhandler (struct sd_adc_dev *dev)
 ADC Interrupt Handler Handle interrupt events on the ADC peripheral. More...
 
void sd_adc_print (void)
 Print the ADC Values.
 
void sd_adc_monitor (struct sd_adc_dev *dev)
 Check ADC Limits.
 
void sd_adc_monitor_enable (void)
 

Detailed Description

Function Documentation

◆ HAL_ADC_MspInit()

void HAL_ADC_MspInit ( ADC_HandleTypeDef *  hadc)

#include <Src/sd_adc.c>

ADC GPIO Configuration

Pin/Port Channel ----—
PA0 Channel 0
PA1 Channel 1
PA2 Channel 2
PA3 Channel 3
PA6 Channel 6
PB0 Channel 8
PB1 Channel 9
PC2 Channel 12
PC3 Channel 13
154 {
155  GPIO_InitTypeDef GPIO_InitStruct;
156  if (hadc->Instance==ADC1) {
157  /* Peripheral clock enable */
158  __ADC1_CLK_ENABLE();
159 
175  GPIO_InitStruct.Pin = ZYNQ_1V2_SENSE_Pin |
176  ZYNQ_3V3_SENSE_Pin;
177 
178  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
179  GPIO_InitStruct.Pull = GPIO_NOPULL;
180  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
181 
182  GPIO_InitStruct.Pin = MAIN_3V3_SENSE_Pin |
183  VIN_SENSE_Pin |
184  MAIN_1V8_SENSE_Pin |
185  VDDIO2_3V3_SENSE_Pin |
186  VUSB_SENSE_Pin;
187 
188  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
189  GPIO_InitStruct.Pull = GPIO_NOPULL;
190  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
191 
192  GPIO_InitStruct.Pin = ZYNQ_1V0_SENSE_Pin|ZYNQ_1V8_SENSE_Pin;
193  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
194  GPIO_InitStruct.Pull = GPIO_NOPULL;
195  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
196 
197  HAL_NVIC_SetPriority(ADC1_COMP_IRQn, 0, 0);
198  HAL_NVIC_EnableIRQ(ADC1_COMP_IRQn);
199 
200  HAL_ADCEx_Calibration_Start(hadc);
201  }
202 }

◆ sd_adc_dev_init()

enum sd_adc_err sd_adc_dev_init ( struct sd_adc_dev dev,
ADC_HandleTypeDef *  adc 
)

#include <Src/sd_adc.c>

ADC Device Initialization.

Parameters
devADC device to initialize
adcADC handle to attach to device
Return values
SD_ADC_SUCCESSon success, error status otherwise
241 {
242  dev->adc = adc;
243 
244  /* Set the sampling time and channel selection registers */
245  adc->Instance->SMPR = ADC_SAMPLETIME_71CYCLES_5;
246  adc_dev.adc->Instance->CHSELR = (1U << ADC_CHANNEL_0) |
247  (1U << ADC_CHANNEL_1) |
248  (1U << ADC_CHANNEL_2) |
249  (1U << ADC_CHANNEL_3) |
250  (1U << ADC_CHANNEL_6) |
251  (1U << ADC_CHANNEL_8) |
252  (1U << ADC_CHANNEL_9) |
253  (1U << ADC_CHANNEL_12) |
254  (1U << ADC_CHANNEL_13);
255 
256  /* Start the ADC in interrupt mode */
257  HAL_ADC_Start_IT(adc);
258 
259  return SD_ADC_SUCCESS;
260 }
ADC_HandleTypeDef * adc
Definition: sd_adc.h:94

◆ sd_adc_init()

void sd_adc_init ( void  )

#include <Src/sd_adc.c>

Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)

130 {
135  hadc.Instance = ADC1;
136  hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC;
137  hadc.Init.Resolution = ADC_RESOLUTION12b;
138  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
139  hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
140  hadc.Init.EOCSelection = EOC_SINGLE_CONV;
141  hadc.Init.LowPowerAutoWait = DISABLE;
142  hadc.Init.LowPowerAutoPowerOff = DISABLE;
143  hadc.Init.ContinuousConvMode = ENABLE;
144  hadc.Init.DiscontinuousConvMode = DISABLE;
145  hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
146  hadc.Init.DMAContinuousRequests = DISABLE;
147  hadc.Init.Overrun = OVR_DATA_PRESERVED;
148  HAL_ADC_Init(&hadc);
149 
150  sd_adc_dev_init(&adc_dev, &hadc);
151 }
enum sd_adc_err sd_adc_dev_init(struct sd_adc_dev *dev, ADC_HandleTypeDef *adc)
ADC Device Initialization.
Definition: sd_adc.c:240

◆ sd_adc_irqhandler()

void sd_adc_irqhandler ( struct sd_adc_dev dev)

#include <Src/sd_adc.c>

ADC Interrupt Handler Handle interrupt events on the ADC peripheral.

Parameters
devADC device
Return values
None
290 {
291  ADC_HandleTypeDef *hadc = dev->adc;
292 
293  /* Check the parameters */
294  assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
295  assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode));
296  assert_param(IS_ADC_EOC_SELECTION(hadc->Init.EOCSelection));
297 
298  /* Check if the analog watchdog triggered interrupt */
299  if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_AWD) &&
300  __HAL_ADC_GET_IT_SOURCE(hadc, ADC_IT_AWD)) {
301 
302  /* Disable the Zynq clock */
303 // sd_zynq_clk_enable(FALSE);
304 
305  /* Disable the Zynq power rails */
306 // sd_zynq_disable();
307  }
308 
309  /* Check if an end of conversion triggered interrupt */
310  if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOC) &&
311  __HAL_ADC_GET_IT_SOURCE(hadc, ADC_IT_EOC)) {
312 
313  /* Update state machine on conversion status if not in error state */
314  if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL)) {
315 
316  /* Set ADC state */
317  SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
318  }
319 
320  /* Record channel measurement */
321  (adc_chan++)->meas = hadc->Instance->DR;
322 
323  /* Clear regular group conversion flag */
324  __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOC);
325  }
326 
327  /* Check if end of sequence triggered interrupt */
328  if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOS) &&
329  __HAL_ADC_GET_IT_SOURCE(hadc, ADC_IT_EOS)) {
330 
331  /* Reset to beginning of table */
332  adc_chan = &adc_tab[0];
333 
334  /* Clear interrupt flag */
335  __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOS);
336  }
337 
338  /*------------------- Check overrun interrupt flag -------------------*/
339  if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_OVR) &&
340  __HAL_ADC_GET_IT_SOURCE(hadc, ADC_IT_OVR)) {
341  /* If overrun is set to overwrite previous data (default setting), */
342  /* overrun event is not considered as an error. */
343  /* (cf ref manual "Managing conversions without using the DMA and without */
344  /* overrun ") */
345  /* Exception for usage with DMA overrun event always considered as an */
346  /* error. */
347  if ((hadc->Init.Overrun == ADC_OVR_DATA_PRESERVED) ||
348  HAL_IS_BIT_SET(hadc->Instance->CFGR1, ADC_CFGR1_DMAEN)) {
349  /* Set ADC error code overrun bit */
350  hadc->ErrorCode |= HAL_ADC_ERROR_OVR;
351 
352  /* Clear ADC overrun flag */
353  __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
354 
355  /* Error callback */
356  HAL_ADC_ErrorCallback(hadc);
357  }
358 
359  /* Clear the Overrun flag */
360  __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
361  }
362 }
#define assert_param(expr)
Uncomment the line below to expanse the "assert_param" macro in the HAL drivers code.
Definition: stm32f0xx_hal_conf.h:304
ADC_HandleTypeDef * adc
Definition: sd_adc.h:94

◆ sd_adc_watchdog_enable()

void sd_adc_watchdog_enable ( void  )

#include <Src/sd_adc.c>

ADC Watchdog Enable.

Return values
None
269 {
270  ADC_AnalogWDGConfTypeDef adc_wd_config;
271 
272  adc_wd_config.WatchdogMode = ADC_ANALOGWATCHDOG_SINGLE_REG;
273  adc_wd_config.Channel = ADC_CHANNEL_2;
274  adc_wd_config.ITMode = ENABLE;
275  adc_wd_config.HighThreshold = 3583;
276  adc_wd_config.LowThreshold = 3242;
277 
278  HAL_ADC_AnalogWDGConfig(&hadc, &adc_wd_config);
279 }