adc.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. /*
  2. *
  3. * Copyright (c) 2019
  4. * Author: Daniele Lacamera <root@danielinux.net>
  5. * GPL2.0
  6. */
  7. #include <stdint.h>
  8. #include "adc.h"
  9. #include "system.h"
  10. int adc_init(void)
  11. {
  12. int i;
  13. uint32_t val;
  14. /* Enable clock */
  15. APB2_CLOCK_ER |= ADC1_APB2_CLOCK_ER_VAL;
  16. /* Power off */
  17. ADC1_CR2 &= ~(ADC_CR2_EN);
  18. /* Set common clock prescaler */
  19. ADC_COM_CCR &= ~(0x03 << 16);
  20. /* Disable scan mode */
  21. ADC1_CR1 &= ~(ADC_CR1_SCAN);
  22. /* Set one-shot (disable continuous mode) */
  23. ADC1_CR2 &= ~(ADC_CR2_CONT);
  24. /* Set sample time for all channels */
  25. val = ADC1_SMPR1;
  26. for (i = 0; i < 10; i++) {
  27. val |= ADC_SMPR_SMP_480CYC << (i * 3);
  28. ADC1_SMPR1 = val;
  29. val = ADC1_SMPR2;
  30. for (i = 10; i < 18; i++)
  31. val |= ADC_SMPR_SMP_480CYC << ((i-10) * 3);
  32. }
  33. ADC1_SMPR2 = val;
  34. ADC1_CR2 &= ~(ADC_CR2_EN);
  35. return 0;
  36. }
  37. void adc_pin_val(uint32_t ch, uint16_t *val)
  38. {
  39. ADC1_SQR3 = ch;
  40. ADC1_CR2 |= ADC_CR2_EN;
  41. ADC1_CR2 |= ADC_CR2_SWSTART;
  42. while (ADC1_CR2 & ADC_CR2_SWSTART);;
  43. while ((ADC1_SR & ADC_SR_EOC) == 0);;
  44. *val= ADC1_DR;
  45. printf("Channel %d val %hu\r\n", ch, *val);
  46. ADC1_SQR3 = 0;
  47. }