adc.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #include "hal/adc.h"
  2. static ADC_HandleTypeDef hadc1;
  3. void HAL_ADC1_Init(void){
  4. ADC_InjectionConfTypeDef sConfigInjected = {0};
  5. ADC_ChannelConfTypeDef sConfig = {0};
  6. hadc1.Instance = ADC1;
  7. hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV1;
  8. hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  9. hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  10. hadc1.Init.ContinuousConvMode = DISABLE;
  11. hadc1.Init.DiscontinuousConvMode = DISABLE;
  12. hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  13. hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  14. hadc1.Init.DataAlign = ADC_DATAALIGN_LEFT;
  15. hadc1.Init.NbrOfConversion = 2;
  16. hadc1.Init.DMAContinuousRequests = DISABLE;
  17. hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  18. hadc1.Init.LowPowerAutoWait = DISABLE;
  19. hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  20. if (HAL_ADC_Init(&hadc1) != HAL_OK)
  21. {
  22. Error_Handler();
  23. }
  24. /** Configure Injected Channel
  25. */
  26. sConfigInjected.InjectedChannel = ADC_CHANNEL_1;
  27. sConfigInjected.InjectedRank = ADC_INJECTED_RANK_1;
  28. sConfigInjected.InjectedSingleDiff = ADC_SINGLE_ENDED;
  29. sConfigInjected.InjectedNbrOfConversion = 3;
  30. sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_7CYCLES_5;
  31. sConfigInjected.ExternalTrigInjecConvEdge = ADC_EXTERNALTRIGINJECCONV_EDGE_RISING;
  32. sConfigInjected.ExternalTrigInjecConv = ADC_EXTERNALTRIGINJECCONV_T1_TRGO;
  33. sConfigInjected.AutoInjectedConv = DISABLE;
  34. sConfigInjected.InjectedDiscontinuousConvMode = DISABLE;
  35. sConfigInjected.QueueInjectedContext = ENABLE;
  36. sConfigInjected.InjectedOffset = 0;
  37. sConfigInjected.InjectedOffsetNumber = ADC_OFFSET_NONE;
  38. if (HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected) != HAL_OK)
  39. {
  40. Error_Handler();
  41. }
  42. /** Configure Injected Channel
  43. */
  44. sConfigInjected.InjectedChannel = ADC_CHANNEL_7;
  45. sConfigInjected.InjectedRank = ADC_INJECTED_RANK_2;
  46. if (HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected) != HAL_OK)
  47. {
  48. Error_Handler();
  49. }
  50. /** Configure Injected Channel
  51. */
  52. sConfigInjected.InjectedChannel = ADC_CHANNEL_6;
  53. sConfigInjected.InjectedRank = ADC_INJECTED_RANK_3;
  54. if (HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected) != HAL_OK)
  55. {
  56. Error_Handler();
  57. }
  58. /** Configure Regular Channel
  59. */
  60. sConfig.Channel = ADC_CHANNEL_2;
  61. sConfig.Rank = ADC_REGULAR_RANK_1;
  62. sConfig.SingleDiff = ADC_SINGLE_ENDED;
  63. sConfig.SamplingTime = ADC_SAMPLETIME_61CYCLES_5;
  64. sConfig.OffsetNumber = ADC_OFFSET_NONE;
  65. sConfig.Offset = 0;
  66. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  67. {
  68. Error_Handler();
  69. }
  70. /** Configure Regular Channel
  71. */
  72. sConfig.Channel = ADC_CHANNEL_8;
  73. sConfig.Rank = ADC_REGULAR_RANK_2;
  74. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  75. {
  76. Error_Handler();
  77. }
  78. }
  79. void HAL_ADC1_Enable(void) {
  80. ADC_TypeDef * ADCx = hadc1.Instance;
  81. /* disable IT and flags in case of LL driver usage
  82. * workaround for unwanted interrupt enabling done by LL driver */
  83. LL_ADC_DisableIT_EOC( ADCx );
  84. LL_ADC_ClearFlag_EOC( ADCx );
  85. LL_ADC_DisableIT_JEOC( ADCx );
  86. LL_ADC_ClearFlag_JEOC( ADCx );
  87. if (LL_ADC_IsEnabled (ADCx) == 0)
  88. {
  89. if ( LL_ADC_IsInternalRegulatorEnabled(ADCx) == 0u)
  90. {
  91. /* Enable ADC internal voltage regulator */
  92. LL_ADC_EnableInternalRegulator(ADCx);
  93. /* Wait for Regulator Startup time */
  94. /* Note: Variable divided by 2 to compensate partially */
  95. /* CPU processing cycles, scaling in us split to not */
  96. /* exceed 32 bits register capacity and handle low frequency. */
  97. volatile uint32_t wait_loop_index = ((LL_ADC_DELAY_INTERNAL_REGUL_STAB_US / 10UL) * (SystemCoreClock / (100000UL * 2UL)));
  98. while(wait_loop_index != 0UL)
  99. {
  100. wait_loop_index--;
  101. }
  102. }
  103. LL_ADC_StartCalibration( ADCx, LL_ADC_SINGLE_ENDED );
  104. while ( LL_ADC_IsCalibrationOnGoing( ADCx) == 1u)
  105. {}
  106. /* ADC Enable (must be done after calibration) */
  107. /* ADC5-140924: Enabling the ADC by setting ADEN bit soon after polling ADCAL=0
  108. * following a calibration phase, could have no effect on ADC
  109. * within certain AHB/ADC clock ratio.
  110. */
  111. while ( LL_ADC_IsActiveFlag_ADRDY( ADCx ) == 0u)
  112. {
  113. LL_ADC_Enable( ADCx );
  114. }
  115. /* Clear JSQR from CubeMX setting to avoid not wanting conversion*/
  116. //LL_ADC_INJ_StartConversion( ADCx );
  117. //LL_ADC_INJ_StopConversion(ADCx);
  118. /* TODO: check if not already done by MX */
  119. LL_ADC_INJ_SetQueueMode( ADCx, LL_ADC_INJ_QUEUE_2CONTEXTS_END_EMPTY );
  120. /* Only the Interrupt of the first ADC is enabled.
  121. * As Both ADCs are fired by HW at the same moment
  122. * It is safe to consider that both conversion are ready at the same time*/
  123. LL_ADC_ClearFlag_JEOS( ADCx );
  124. LL_ADC_EnableIT_JEOS( ADCx );
  125. }
  126. HAL_NVIC_EnableIRQ(ADC1_IRQn);
  127. //LL_ADC_INJ_StartConversion( ADCx );
  128. }
  129. void HAL_ADC1_InJ_StartConvert(void) {
  130. ADC_TypeDef * ADCx = hadc1.Instance;
  131. while(LL_ADC_INJ_IsConversionOngoing( ADCx ) == 0) {
  132. LL_ADC_INJ_StartConversion( ADCx );
  133. }
  134. }
  135. void HAL_ADC1_ChanConfig(u32 channel) {
  136. if (LL_ADC_IsEnabled(hadc1.Instance) == 0 )
  137. {
  138. LL_ADC_DisableIT_EOC(hadc1.Instance);
  139. LL_ADC_ClearFlag_EOC(hadc1.Instance);
  140. LL_ADC_DisableIT_JEOC(hadc1.Instance);
  141. LL_ADC_ClearFlag_JEOC(hadc1.Instance);
  142. LL_ADC_StartCalibration( hadc1.Instance, LL_ADC_SINGLE_ENDED );
  143. while ( LL_ADC_IsCalibrationOnGoing( hadc1.Instance ) )
  144. { }
  145. LL_ADC_Enable( hadc1.Instance );
  146. }
  147. /* reset regular conversion sequencer length set by cubeMX */
  148. LL_ADC_REG_SetSequencerLength( hadc1.Instance, LL_ADC_REG_SEQ_SCAN_DISABLE );
  149. /* configure the sampling time (should already be configured by for non user conversions)*/
  150. LL_ADC_SetChannelSamplingTime ( hadc1.Instance, __LL_ADC_DECIMAL_NB_TO_CHANNEL(channel) ,ADC_SAMPLETIME_61CYCLES_5);
  151. }
  152. u16 HAL_ADC1_ReadValue(u32 channel)
  153. {
  154. u16 retVal;
  155. LL_ADC_REG_SetSequencerRanks( hadc1.Instance,
  156. LL_ADC_REG_RANK_1,
  157. __LL_ADC_DECIMAL_NB_TO_CHANNEL( channel ) );
  158. LL_ADC_REG_ReadConversionData12(hadc1.Instance);
  159. LL_ADC_REG_StartConversion(hadc1.Instance);
  160. /* Wait until end of regular conversion */
  161. while ( LL_ADC_IsActiveFlag_EOC(hadc1.Instance) == 0u ) {}
  162. retVal = LL_ADC_REG_ReadConversionData12(hadc1.Instance);
  163. return retVal;
  164. }