main.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /*!
  2. \file main.c
  3. \brief ADC_software_trigger_regular_channel_polling
  4. \version 2017-02-10, V1.0.0, firmware for GD32F30x
  5. \version 2018-10-10, V1.1.0, firmware for GD32F30x
  6. \version 2018-12-25, V2.0.0, firmware for GD32F30x
  7. \version 2020-09-30, V2.1.0, firmware for GD32F30x
  8. */
  9. /*
  10. Copyright (c) 2020, GigaDevice Semiconductor Inc.
  11. Redistribution and use in source and binary forms, with or without modification,
  12. are permitted provided that the following conditions are met:
  13. 1. Redistributions of source code must retain the above copyright notice, this
  14. list of conditions and the following disclaimer.
  15. 2. Redistributions in binary form must reproduce the above copyright notice,
  16. this list of conditions and the following disclaimer in the documentation
  17. and/or other materials provided with the distribution.
  18. 3. Neither the name of the copyright holder nor the names of its contributors
  19. may be used to endorse or promote products derived from this software without
  20. specific prior written permission.
  21. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  22. AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  23. WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  24. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
  25. INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  26. NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  27. PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  28. WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  29. ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
  30. OF SUCH DAMAGE.
  31. */
  32. #include "gd32f30x.h"
  33. #include "systick.h"
  34. #include <stdio.h>
  35. #include "gd32f307c_eval.h"
  36. __IO uint16_t adc_value[4];
  37. void rcu_config(void);
  38. void gpio_config(void);
  39. void adc_config(void);
  40. uint16_t adc_channel_sample(uint8_t channel);
  41. /*!
  42. \brief main function
  43. \param[in] none
  44. \param[out] none
  45. \retval none
  46. */
  47. int main(void)
  48. {
  49. /* system clocks configuration */
  50. rcu_config();
  51. /* systick configuration */
  52. systick_config();
  53. /* GPIO configuration */
  54. gpio_config();
  55. /* ADC configuration */
  56. adc_config();
  57. while(1){
  58. adc_value[0]=adc_channel_sample(ADC_CHANNEL_1);
  59. adc_value[1]=adc_channel_sample(ADC_CHANNEL_2);
  60. adc_value[2]=adc_channel_sample(ADC_CHANNEL_3);
  61. adc_value[3]=adc_channel_sample(ADC_CHANNEL_4);
  62. }
  63. }
  64. /*!
  65. \brief configure the different system clocks
  66. \param[in] none
  67. \param[out] none
  68. \retval none
  69. */
  70. void rcu_config(void)
  71. {
  72. /* enable GPIOA clock */
  73. rcu_periph_clock_enable(RCU_GPIOA);
  74. /* enable ADC clock */
  75. rcu_periph_clock_enable(RCU_ADC0);
  76. /* config ADC clock */
  77. rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6);
  78. }
  79. /*!
  80. \brief configure the GPIO peripheral
  81. \param[in] none
  82. \param[out] none
  83. \retval none
  84. */
  85. void gpio_config(void)
  86. {
  87. /* config the GPIO as analog mode */
  88. gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_1);
  89. gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_2);
  90. gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_3);
  91. gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_4);
  92. }
  93. /*!
  94. \brief configure the ADC peripheral
  95. \param[in] none
  96. \param[out] none
  97. \retval none
  98. */
  99. void adc_config(void)
  100. {
  101. /* ADC mode config */
  102. adc_mode_config(ADC_MODE_FREE);
  103. /* ADC data alignment config */
  104. adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
  105. /* ADC channel length config */
  106. adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1U);
  107. /* ADC trigger config */
  108. adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
  109. /* ADC external trigger config */
  110. adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
  111. /* enable ADC interface */
  112. adc_enable(ADC0);
  113. delay_1ms(1U);
  114. /* ADC calibration and reset calibration */
  115. adc_calibration_enable(ADC0);
  116. }
  117. /*!
  118. \brief ADC channel sample
  119. \param[in] none
  120. \param[out] none
  121. \retval none
  122. */
  123. uint16_t adc_channel_sample(uint8_t channel)
  124. {
  125. /* ADC regular channel config */
  126. adc_regular_channel_config(ADC0, 0U, channel, ADC_SAMPLETIME_7POINT5);
  127. /* ADC software trigger enable */
  128. adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
  129. /* wait the end of conversion flag */
  130. while(!adc_flag_get(ADC0, ADC_FLAG_EOC));
  131. /* clear the end of conversion flag */
  132. adc_flag_clear(ADC0, ADC_FLAG_EOC);
  133. /* return regular channel sample value */
  134. return (adc_regular_data_read(ADC0));
  135. }