adc.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. #include "stm32wbxx_ll_adc.h"
  2. #include <furi.h>
  3. #define assert_param furi_assert
  4. /* Check of parameters for configuration of ADC hierarchical scope: */
  5. /* common to several ADC instances. */
  6. #if defined(ADC_SUPPORT_2_5_MSPS)
  7. #define IS_LL_ADC_COMMON_CLOCK(__CLOCK__) \
  8. (((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV1) || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV2) || \
  9. ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV4) || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV6) || \
  10. ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV8) || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV10) || \
  11. ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV12) || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV16) || \
  12. ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV32) || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV64) || \
  13. ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV128) || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV256))
  14. #else
  15. #define IS_LL_ADC_COMMON_CLOCK(__CLOCK__) \
  16. (((__CLOCK__) == LL_ADC_CLOCK_SYNC_PCLK_DIV1) || \
  17. ((__CLOCK__) == LL_ADC_CLOCK_SYNC_PCLK_DIV2) || \
  18. ((__CLOCK__) == LL_ADC_CLOCK_SYNC_PCLK_DIV4) || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV1) || \
  19. ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV2) || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV4) || \
  20. ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV6) || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV8) || \
  21. ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV10) || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV12) || \
  22. ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV16) || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV32) || \
  23. ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV64) || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV128) || \
  24. ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV256))
  25. #endif /* ADC_SUPPORT_2_5_MSPS */
  26. /* Check of parameters for configuration of ADC hierarchical scope: */
  27. /* ADC instance. */
  28. #if defined(ADC_SUPPORT_2_5_MSPS)
  29. #define IS_LL_ADC_CLOCK(__CLOCK__) \
  30. (((__CLOCK__) == LL_ADC_CLOCK_SYNC_PCLK_DIV4) || \
  31. ((__CLOCK__) == LL_ADC_CLOCK_SYNC_PCLK_DIV2) || \
  32. ((__CLOCK__) == LL_ADC_CLOCK_SYNC_PCLK_DIV1) || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC))
  33. #endif /* ADC_SUPPORT_2_5_MSPS */
  34. #define IS_LL_ADC_RESOLUTION(__RESOLUTION__) \
  35. (((__RESOLUTION__) == LL_ADC_RESOLUTION_12B) || \
  36. ((__RESOLUTION__) == LL_ADC_RESOLUTION_10B) || ((__RESOLUTION__) == LL_ADC_RESOLUTION_8B) || \
  37. ((__RESOLUTION__) == LL_ADC_RESOLUTION_6B))
  38. #define IS_LL_ADC_DATA_ALIGN(__DATA_ALIGN__) \
  39. (((__DATA_ALIGN__) == LL_ADC_DATA_ALIGN_RIGHT) || ((__DATA_ALIGN__) == LL_ADC_DATA_ALIGN_LEFT))
  40. #if defined(ADC_SUPPORT_2_5_MSPS)
  41. #define IS_LL_ADC_LOW_POWER(__LOW_POWER__) \
  42. (((__LOW_POWER__) == LL_ADC_LP_MODE_NONE) || ((__LOW_POWER__) == LL_ADC_LP_AUTOWAIT) || \
  43. ((__LOW_POWER__) == LL_ADC_LP_AUTOPOWEROFF) || \
  44. ((__LOW_POWER__) == LL_ADC_LP_AUTOWAIT_AUTOPOWEROFF))
  45. #else
  46. #define IS_LL_ADC_LOW_POWER(__LOW_POWER__) \
  47. (((__LOW_POWER__) == LL_ADC_LP_MODE_NONE) || ((__LOW_POWER__) == LL_ADC_LP_AUTOWAIT))
  48. #endif /* ADC_SUPPORT_2_5_MSPS */
  49. /* Check of parameters for configuration of ADC hierarchical scope: */
  50. /* ADC group regular */
  51. #if defined(ADC_SUPPORT_2_5_MSPS)
  52. #define IS_LL_ADC_REG_TRIG_SOURCE(__REG_TRIG_SOURCE__) \
  53. (((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_SOFTWARE) || \
  54. ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_TRGO2) || \
  55. ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH4) || \
  56. ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_TRGO) || \
  57. ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_CH4) || \
  58. ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_CH3) || \
  59. ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_EXTI_LINE11))
  60. #else
  61. #define IS_LL_ADC_REG_TRIG_SOURCE(__REG_TRIG_SOURCE__) \
  62. (((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_SOFTWARE) || \
  63. ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_TRGO) || \
  64. ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_TRGO2) || \
  65. ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH1) || \
  66. ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH2) || \
  67. ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH3) || \
  68. ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_TRGO) || \
  69. ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_CH2) || \
  70. ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_EXTI_LINE11))
  71. #endif /* ADC_SUPPORT_2_5_MSPS */
  72. #define IS_LL_ADC_REG_CONTINUOUS_MODE(__REG_CONTINUOUS_MODE__) \
  73. (((__REG_CONTINUOUS_MODE__) == LL_ADC_REG_CONV_SINGLE) || \
  74. ((__REG_CONTINUOUS_MODE__) == LL_ADC_REG_CONV_CONTINUOUS))
  75. #define IS_LL_ADC_REG_DMA_TRANSFER(__REG_DMA_TRANSFER__) \
  76. (((__REG_DMA_TRANSFER__) == LL_ADC_REG_DMA_TRANSFER_NONE) || \
  77. ((__REG_DMA_TRANSFER__) == LL_ADC_REG_DMA_TRANSFER_LIMITED) || \
  78. ((__REG_DMA_TRANSFER__) == LL_ADC_REG_DMA_TRANSFER_UNLIMITED))
  79. #define IS_LL_ADC_REG_OVR_DATA_BEHAVIOR(__REG_OVR_DATA_BEHAVIOR__) \
  80. (((__REG_OVR_DATA_BEHAVIOR__) == LL_ADC_REG_OVR_DATA_PRESERVED) || \
  81. ((__REG_OVR_DATA_BEHAVIOR__) == LL_ADC_REG_OVR_DATA_OVERWRITTEN))
  82. #if defined(ADC_SUPPORT_2_5_MSPS)
  83. #define IS_LL_ADC_REG_SEQ_MODE(__REG_SEQ_MODE__) \
  84. (((__REG_SEQ_MODE__) == LL_ADC_REG_SEQ_FIXED) || \
  85. ((__REG_SEQ_MODE__) == LL_ADC_REG_SEQ_CONFIGURABLE))
  86. #endif /* ADC_SUPPORT_2_5_MSPS */
  87. #if defined(ADC_SUPPORT_2_5_MSPS)
  88. #define IS_LL_ADC_REG_SEQ_SCAN_LENGTH(__REG_SEQ_SCAN_LENGTH__) \
  89. (((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_DISABLE) || \
  90. ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_2RANKS) || \
  91. ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_3RANKS) || \
  92. ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_4RANKS) || \
  93. ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_5RANKS) || \
  94. ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_6RANKS) || \
  95. ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_7RANKS) || \
  96. ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_8RANKS))
  97. #else
  98. #define IS_LL_ADC_REG_SEQ_SCAN_LENGTH(__REG_SEQ_SCAN_LENGTH__) \
  99. (((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_DISABLE) || \
  100. ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_2RANKS) || \
  101. ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_3RANKS) || \
  102. ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_4RANKS) || \
  103. ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_5RANKS) || \
  104. ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_6RANKS) || \
  105. ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_7RANKS) || \
  106. ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_8RANKS) || \
  107. ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_9RANKS) || \
  108. ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_10RANKS) || \
  109. ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_11RANKS) || \
  110. ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_12RANKS) || \
  111. ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_13RANKS) || \
  112. ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_14RANKS) || \
  113. ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_15RANKS) || \
  114. ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_16RANKS))
  115. #endif /* ADC_SUPPORT_2_5_MSPS */
  116. #if defined(ADC_SUPPORT_2_5_MSPS)
  117. #define IS_LL_ADC_REG_SEQ_SCAN_DISCONT_MODE(__REG_SEQ_DISCONT_MODE__) \
  118. (((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_DISABLE) || \
  119. ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_1RANK))
  120. #else
  121. #define IS_LL_ADC_REG_SEQ_SCAN_DISCONT_MODE(__REG_SEQ_DISCONT_MODE__) \
  122. (((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_DISABLE) || \
  123. ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_1RANK) || \
  124. ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_2RANKS) || \
  125. ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_3RANKS) || \
  126. ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_4RANKS) || \
  127. ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_5RANKS) || \
  128. ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_6RANKS) || \
  129. ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_7RANKS) || \
  130. ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_8RANKS))
  131. #endif /* ADC_SUPPORT_2_5_MSPS */
  132. /* Check of parameters for configuration of ADC hierarchical scope: */
  133. /* ADC group injected */
  134. #define IS_LL_ADC_INJ_TRIG_SOURCE(__INJ_TRIG_SOURCE__) \
  135. (((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_SOFTWARE) || \
  136. ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM1_TRGO) || \
  137. ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM1_TRGO2) || \
  138. ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM1_CH4) || \
  139. ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM2_TRGO) || \
  140. ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM2_CH1) || \
  141. ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_EXTI_LINE15))
  142. #define IS_LL_ADC_INJ_TRIG_EXT_EDGE(__INJ_TRIG_EXT_EDGE__) \
  143. (((__INJ_TRIG_EXT_EDGE__) == LL_ADC_INJ_TRIG_EXT_RISING) || \
  144. ((__INJ_TRIG_EXT_EDGE__) == LL_ADC_INJ_TRIG_EXT_FALLING) || \
  145. ((__INJ_TRIG_EXT_EDGE__) == LL_ADC_INJ_TRIG_EXT_RISINGFALLING))
  146. #define IS_LL_ADC_INJ_TRIG_AUTO(__INJ_TRIG_AUTO__) \
  147. (((__INJ_TRIG_AUTO__) == LL_ADC_INJ_TRIG_INDEPENDENT) || \
  148. ((__INJ_TRIG_AUTO__) == LL_ADC_INJ_TRIG_FROM_GRP_REGULAR))
  149. #define IS_LL_ADC_INJ_SEQ_SCAN_LENGTH(__INJ_SEQ_SCAN_LENGTH__) \
  150. (((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_DISABLE) || \
  151. ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_ENABLE_2RANKS) || \
  152. ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_ENABLE_3RANKS) || \
  153. ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_ENABLE_4RANKS))
  154. #define IS_LL_ADC_INJ_SEQ_SCAN_DISCONT_MODE(__INJ_SEQ_DISCONT_MODE__) \
  155. (((__INJ_SEQ_DISCONT_MODE__) == LL_ADC_INJ_SEQ_DISCONT_DISABLE) || \
  156. ((__INJ_SEQ_DISCONT_MODE__) == LL_ADC_INJ_SEQ_DISCONT_1RANK))
  157. ErrorStatus LL_ADC_Init(ADC_TypeDef* ADCx, const LL_ADC_InitTypeDef* ADC_InitStruct) {
  158. ErrorStatus status = SUCCESS;
  159. /* Check the parameters */
  160. assert_param(IS_ADC_ALL_INSTANCE(ADCx));
  161. #if defined(ADC_SUPPORT_2_5_MSPS)
  162. assert_param(IS_LL_ADC_CLOCK(ADC_InitStruct->Clock));
  163. #endif /* ADC_SUPPORT_2_5_MSPS */
  164. assert_param(IS_LL_ADC_RESOLUTION(ADC_InitStruct->Resolution));
  165. assert_param(IS_LL_ADC_DATA_ALIGN(ADC_InitStruct->DataAlignment));
  166. assert_param(IS_LL_ADC_LOW_POWER(ADC_InitStruct->LowPowerMode));
  167. /* Note: Hardware constraint (refer to description of this function): */
  168. /* ADC instance must be disabled. */
  169. if(LL_ADC_IsEnabled(ADCx) == 0UL) {
  170. /* Configuration of ADC hierarchical scope: */
  171. /* - ADC instance */
  172. /* - Set ADC data resolution */
  173. /* - Set ADC conversion data alignment */
  174. /* - Set ADC low power mode */
  175. #if defined(ADC_SUPPORT_2_5_MSPS)
  176. MODIFY_REG(
  177. ADCx->CFGR1,
  178. ADC_CFGR1_RES | ADC_CFGR1_ALIGN | ADC_CFGR1_WAIT | ADC_CFGR1_AUTOFF,
  179. ADC_InitStruct->Resolution | ADC_InitStruct->DataAlignment |
  180. ADC_InitStruct->LowPowerMode);
  181. MODIFY_REG(ADCx->CFGR2, ADC_CFGR2_CKMODE, ADC_InitStruct->Clock);
  182. #else
  183. MODIFY_REG(
  184. ADCx->CFGR,
  185. ADC_CFGR_RES | ADC_CFGR_ALIGN | ADC_CFGR_AUTDLY,
  186. ADC_InitStruct->Resolution | ADC_InitStruct->DataAlignment |
  187. ADC_InitStruct->LowPowerMode);
  188. #endif /* ADC_SUPPORT_2_5_MSPS */
  189. } else {
  190. /* Initialization error: ADC instance is not disabled. */
  191. status = ERROR;
  192. }
  193. return status;
  194. }
  195. ErrorStatus LL_ADC_REG_Init(ADC_TypeDef* ADCx, const LL_ADC_REG_InitTypeDef* ADC_REG_InitStruct) {
  196. ErrorStatus status = SUCCESS;
  197. /* Check the parameters */
  198. assert_param(IS_ADC_ALL_INSTANCE(ADCx));
  199. assert_param(IS_LL_ADC_REG_TRIG_SOURCE(ADC_REG_InitStruct->TriggerSource));
  200. #if defined(ADC_SUPPORT_2_5_MSPS)
  201. if(LL_ADC_REG_GetSequencerConfigurable(ADCx) != LL_ADC_REG_SEQ_FIXED) {
  202. assert_param(IS_LL_ADC_REG_SEQ_SCAN_LENGTH(ADC_REG_InitStruct->SequencerLength));
  203. }
  204. if((LL_ADC_REG_GetSequencerConfigurable(ADCx) == LL_ADC_REG_SEQ_FIXED) ||
  205. (ADC_REG_InitStruct->SequencerLength != LL_ADC_REG_SEQ_SCAN_DISABLE)) {
  206. assert_param(IS_LL_ADC_REG_SEQ_SCAN_DISCONT_MODE(ADC_REG_InitStruct->SequencerDiscont));
  207. /* ADC group regular continuous mode and discontinuous mode */
  208. /* can not be enabled simultenaeously */
  209. assert_param(
  210. (ADC_REG_InitStruct->ContinuousMode == LL_ADC_REG_CONV_SINGLE) ||
  211. (ADC_REG_InitStruct->SequencerDiscont == LL_ADC_REG_SEQ_DISCONT_DISABLE));
  212. }
  213. #else
  214. assert_param(IS_LL_ADC_REG_SEQ_SCAN_LENGTH(ADC_REG_InitStruct->SequencerLength));
  215. if(ADC_REG_InitStruct->SequencerLength != LL_ADC_REG_SEQ_SCAN_DISABLE) {
  216. assert_param(IS_LL_ADC_REG_SEQ_SCAN_DISCONT_MODE(ADC_REG_InitStruct->SequencerDiscont));
  217. /* ADC group regular continuous mode and discontinuous mode */
  218. /* can not be enabled simultenaeously */
  219. assert_param(
  220. (ADC_REG_InitStruct->ContinuousMode == LL_ADC_REG_CONV_SINGLE) ||
  221. (ADC_REG_InitStruct->SequencerDiscont == LL_ADC_REG_SEQ_DISCONT_DISABLE));
  222. }
  223. #endif /* ADC_SUPPORT_2_5_MSPS */
  224. assert_param(IS_LL_ADC_REG_CONTINUOUS_MODE(ADC_REG_InitStruct->ContinuousMode));
  225. assert_param(IS_LL_ADC_REG_DMA_TRANSFER(ADC_REG_InitStruct->DMATransfer));
  226. assert_param(IS_LL_ADC_REG_OVR_DATA_BEHAVIOR(ADC_REG_InitStruct->Overrun));
  227. /* Note: Hardware constraint (refer to description of this function): */
  228. /* ADC instance must be disabled. */
  229. if(LL_ADC_IsEnabled(ADCx) == 0UL) {
  230. /* Configuration of ADC hierarchical scope: */
  231. /* - ADC group regular */
  232. /* - Set ADC group regular trigger source */
  233. /* - Set ADC group regular sequencer length */
  234. /* - Set ADC group regular sequencer discontinuous mode */
  235. /* - Set ADC group regular continuous mode */
  236. /* - Set ADC group regular conversion data transfer: no transfer or */
  237. /* transfer by DMA, and DMA requests mode */
  238. /* - Set ADC group regular overrun behavior */
  239. /* Note: On this STM32 series, ADC trigger edge is set to value 0x0 by */
  240. /* setting of trigger source to SW start. */
  241. #if defined(ADC_SUPPORT_2_5_MSPS)
  242. if((LL_ADC_REG_GetSequencerConfigurable(ADCx) == LL_ADC_REG_SEQ_FIXED) ||
  243. (ADC_REG_InitStruct->SequencerLength != LL_ADC_REG_SEQ_SCAN_DISABLE)) {
  244. /* Case of sequencer mode fixed
  245. or sequencer length >= 2 ranks with sequencer mode fully configurable:
  246. discontinuous mode configured */
  247. MODIFY_REG(
  248. ADCx->CFGR1,
  249. ADC_CFGR1_EXTSEL | ADC_CFGR1_EXTEN | ADC_CFGR1_DISCEN | ADC_CFGR1_CONT |
  250. ADC_CFGR1_DMAEN | ADC_CFGR1_DMACFG | ADC_CFGR1_OVRMOD,
  251. ADC_REG_InitStruct->TriggerSource | ADC_REG_InitStruct->SequencerDiscont |
  252. ADC_REG_InitStruct->ContinuousMode | ADC_REG_InitStruct->DMATransfer |
  253. ADC_REG_InitStruct->Overrun);
  254. } else {
  255. /* Case of sequencer mode fully configurable
  256. and sequencer length 1 rank (sequencer disabled):
  257. discontinuous mode discarded (fixed to disable) */
  258. MODIFY_REG(
  259. ADCx->CFGR1,
  260. ADC_CFGR1_EXTSEL | ADC_CFGR1_EXTEN | ADC_CFGR1_DISCEN | ADC_CFGR1_CONT |
  261. ADC_CFGR1_DMAEN | ADC_CFGR1_DMACFG | ADC_CFGR1_OVRMOD,
  262. ADC_REG_InitStruct->TriggerSource | LL_ADC_REG_SEQ_DISCONT_DISABLE |
  263. ADC_REG_InitStruct->ContinuousMode | ADC_REG_InitStruct->DMATransfer |
  264. ADC_REG_InitStruct->Overrun);
  265. }
  266. #else
  267. if(ADC_REG_InitStruct->SequencerLength != LL_ADC_REG_SEQ_SCAN_DISABLE) {
  268. MODIFY_REG(
  269. ADCx->CFGR,
  270. ADC_CFGR_EXTSEL | ADC_CFGR_EXTEN | ADC_CFGR_DISCEN | ADC_CFGR_DISCNUM |
  271. ADC_CFGR_CONT | ADC_CFGR_DMAEN | ADC_CFGR_DMACFG | ADC_CFGR_OVRMOD,
  272. ADC_REG_InitStruct->TriggerSource | ADC_REG_InitStruct->SequencerDiscont |
  273. ADC_REG_InitStruct->ContinuousMode | ADC_REG_InitStruct->DMATransfer |
  274. ADC_REG_InitStruct->Overrun);
  275. } else {
  276. MODIFY_REG(
  277. ADCx->CFGR,
  278. ADC_CFGR_EXTSEL | ADC_CFGR_EXTEN | ADC_CFGR_DISCEN | ADC_CFGR_DISCNUM |
  279. ADC_CFGR_CONT | ADC_CFGR_DMAEN | ADC_CFGR_DMACFG | ADC_CFGR_OVRMOD,
  280. ADC_REG_InitStruct->TriggerSource | LL_ADC_REG_SEQ_DISCONT_DISABLE |
  281. ADC_REG_InitStruct->ContinuousMode | ADC_REG_InitStruct->DMATransfer |
  282. ADC_REG_InitStruct->Overrun);
  283. }
  284. #endif /* ADC_SUPPORT_2_5_MSPS */
  285. /* Set ADC group regular sequencer length and scan direction */
  286. #if defined(ADC_SUPPORT_2_5_MSPS)
  287. if(LL_ADC_REG_GetSequencerConfigurable(ADCx) != LL_ADC_REG_SEQ_FIXED) {
  288. LL_ADC_REG_SetSequencerLength(ADCx, ADC_REG_InitStruct->SequencerLength);
  289. }
  290. #else
  291. LL_ADC_REG_SetSequencerLength(ADCx, ADC_REG_InitStruct->SequencerLength);
  292. #endif /* ADC_SUPPORT_2_5_MSPS */
  293. } else {
  294. /* Initialization error: ADC instance is not disabled. */
  295. status = ERROR;
  296. }
  297. return status;
  298. }
  299. ErrorStatus LL_ADC_CommonInit(
  300. ADC_Common_TypeDef* ADCxy_COMMON,
  301. const LL_ADC_CommonInitTypeDef* ADC_CommonInitStruct) {
  302. ErrorStatus status = SUCCESS;
  303. /* Check the parameters */
  304. assert_param(IS_ADC_COMMON_INSTANCE(ADCxy_COMMON));
  305. assert_param(IS_LL_ADC_COMMON_CLOCK(ADC_CommonInitStruct->CommonClock));
  306. /* Note: Hardware constraint (refer to description of functions */
  307. /* "LL_ADC_SetCommonXXX()": */
  308. /* On this STM32 series, setting of these features is conditioned to */
  309. /* ADC state: */
  310. /* All ADC instances of the ADC common group must be disabled. */
  311. if(__LL_ADC_IS_ENABLED_ALL_COMMON_INSTANCE(ADCxy_COMMON) == 0UL) {
  312. /* Configuration of ADC hierarchical scope: */
  313. /* - common to several ADC */
  314. /* (all ADC instances belonging to the same ADC common instance) */
  315. /* - Set ADC clock (conversion clock) */
  316. #if defined(ADC_MULTIMODE_SUPPORT)
  317. if(ADC_CommonInitStruct->Multimode != LL_ADC_MULTI_INDEPENDENT) {
  318. MODIFY_REG(
  319. ADCxy_COMMON->CCR,
  320. ADC_CCR_CKMODE | ADC_CCR_PRESC | ADC_CCR_DUAL | ADC_CCR_MDMA | ADC_CCR_DELAY,
  321. ADC_CommonInitStruct->CommonClock | ADC_CommonInitStruct->Multimode |
  322. ADC_CommonInitStruct->MultiDMATransfer |
  323. ADC_CommonInitStruct->MultiTwoSamplingDelay);
  324. } else {
  325. MODIFY_REG(
  326. ADCxy_COMMON->CCR,
  327. ADC_CCR_CKMODE | ADC_CCR_PRESC | ADC_CCR_DUAL | ADC_CCR_MDMA | ADC_CCR_DELAY,
  328. ADC_CommonInitStruct->CommonClock | LL_ADC_MULTI_INDEPENDENT);
  329. }
  330. #else
  331. LL_ADC_SetCommonClock(ADCxy_COMMON, ADC_CommonInitStruct->CommonClock);
  332. #endif
  333. } else {
  334. /* Initialization error: One or several ADC instances belonging to */
  335. /* the same ADC common instance are not disabled. */
  336. status = ERROR;
  337. }
  338. return status;
  339. }