stm32l4xx_hal_adc.c 142 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667
  1. /**
  2. ******************************************************************************
  3. * @file stm32l4xx_hal_adc.c
  4. * @author MCD Application Team
  5. * @brief This file provides firmware functions to manage the following
  6. * functionalities of the Analog to Digital Converter (ADC)
  7. * peripheral:
  8. * + Initialization and de-initialization functions
  9. * + Peripheral Control functions
  10. * + Peripheral State functions
  11. * Other functions (extended functions) are available in file
  12. * "stm32l4xx_hal_adc_ex.c".
  13. *
  14. ******************************************************************************
  15. * @attention
  16. *
  17. * Copyright (c) 2017 STMicroelectronics.
  18. * All rights reserved.
  19. *
  20. * This software is licensed under terms that can be found in the LICENSE file
  21. * in the root directory of this software component.
  22. * If no LICENSE file comes with this software, it is provided AS-IS.
  23. *
  24. ******************************************************************************
  25. @verbatim
  26. ==============================================================================
  27. ##### ADC peripheral features #####
  28. ==============================================================================
  29. [..]
  30. (+) 12-bit, 10-bit, 8-bit or 6-bit configurable resolution.
  31. (+) Interrupt generation at the end of regular conversion and in case of
  32. analog watchdog or overrun events.
  33. (+) Single and continuous conversion modes.
  34. (+) Scan mode for conversion of several channels sequentially.
  35. (+) Data alignment with in-built data coherency.
  36. (+) Programmable sampling time (channel wise)
  37. (+) External trigger (timer or EXTI) with configurable polarity
  38. (+) DMA request generation for transfer of conversions data of regular group.
  39. (+) Configurable delay between conversions in Dual interleaved mode.
  40. (+) ADC channels selectable single/differential input.
  41. (+) ADC offset shared on 4 offset instances.
  42. (+) ADC calibration
  43. (+) ADC conversion of regular group.
  44. (+) ADC supply requirements: 1.62 V to 3.6 V.
  45. (+) ADC input range: from Vref- (connected to Vssa) to Vref+ (connected to
  46. Vdda or to an external voltage reference).
  47. ##### How to use this driver #####
  48. ==============================================================================
  49. [..]
  50. *** Configuration of top level parameters related to ADC ***
  51. ============================================================
  52. [..]
  53. (#) Enable the ADC interface
  54. (++) As prerequisite, ADC clock must be configured at RCC top level.
  55. (++) Two clock settings are mandatory:
  56. (+++) ADC clock (core clock, also possibly conversion clock).
  57. (+++) ADC clock (conversions clock).
  58. Two possible clock sources: synchronous clock derived from APB clock
  59. or asynchronous clock derived from system clock, PLLSAI1 or the PLLSAI2
  60. running up to 80MHz.
  61. (+++) Example:
  62. Into HAL_ADC_MspInit() (recommended code location) or with
  63. other device clock parameters configuration:
  64. (+++) __HAL_RCC_ADC_CLK_ENABLE(); (mandatory)
  65. RCC_ADCCLKSOURCE_PLL enable: (optional: if asynchronous clock selected)
  66. (+++) RCC_PeriphClkInitTypeDef RCC_PeriphClkInit;
  67. (+++) PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  68. (+++) PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_PLL;
  69. (+++) HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
  70. (++) ADC clock source and clock prescaler are configured at ADC level with
  71. parameter "ClockPrescaler" using function HAL_ADC_Init().
  72. (#) ADC pins configuration
  73. (++) Enable the clock for the ADC GPIOs
  74. using macro __HAL_RCC_GPIOx_CLK_ENABLE()
  75. (++) Configure these ADC pins in analog mode
  76. using function HAL_GPIO_Init()
  77. (#) Optionally, in case of usage of ADC with interruptions:
  78. (++) Configure the NVIC for ADC
  79. using function HAL_NVIC_EnableIRQ(ADCx_IRQn)
  80. (++) Insert the ADC interruption handler function HAL_ADC_IRQHandler()
  81. into the function of corresponding ADC interruption vector
  82. ADCx_IRQHandler().
  83. (#) Optionally, in case of usage of DMA:
  84. (++) Configure the DMA (DMA channel, mode normal or circular, ...)
  85. using function HAL_DMA_Init().
  86. (++) Configure the NVIC for DMA
  87. using function HAL_NVIC_EnableIRQ(DMAx_Channelx_IRQn)
  88. (++) Insert the ADC interruption handler function HAL_ADC_IRQHandler()
  89. into the function of corresponding DMA interruption vector
  90. DMAx_Channelx_IRQHandler().
  91. *** Configuration of ADC, group regular, channels parameters ***
  92. ================================================================
  93. [..]
  94. (#) Configure the ADC parameters (resolution, data alignment, ...)
  95. and regular group parameters (conversion trigger, sequencer, ...)
  96. using function HAL_ADC_Init().
  97. (#) Configure the channels for regular group parameters (channel number,
  98. channel rank into sequencer, ..., into regular group)
  99. using function HAL_ADC_ConfigChannel().
  100. (#) Optionally, configure the analog watchdog parameters (channels
  101. monitored, thresholds, ...)
  102. using function HAL_ADC_AnalogWDGConfig().
  103. *** Execution of ADC conversions ***
  104. ====================================
  105. [..]
  106. (#) Optionally, perform an automatic ADC calibration to improve the
  107. conversion accuracy
  108. using function HAL_ADCEx_Calibration_Start().
  109. (#) ADC driver can be used among three modes: polling, interruption,
  110. transfer by DMA.
  111. (++) ADC conversion by polling:
  112. (+++) Activate the ADC peripheral and start conversions
  113. using function HAL_ADC_Start()
  114. (+++) Wait for ADC conversion completion
  115. using function HAL_ADC_PollForConversion()
  116. (+++) Retrieve conversion results
  117. using function HAL_ADC_GetValue()
  118. (+++) Stop conversion and disable the ADC peripheral
  119. using function HAL_ADC_Stop()
  120. (++) ADC conversion by interruption:
  121. (+++) Activate the ADC peripheral and start conversions
  122. using function HAL_ADC_Start_IT()
  123. (+++) Wait for ADC conversion completion by call of function
  124. HAL_ADC_ConvCpltCallback()
  125. (this function must be implemented in user program)
  126. (+++) Retrieve conversion results
  127. using function HAL_ADC_GetValue()
  128. (+++) Stop conversion and disable the ADC peripheral
  129. using function HAL_ADC_Stop_IT()
  130. (++) ADC conversion with transfer by DMA:
  131. (+++) Activate the ADC peripheral and start conversions
  132. using function HAL_ADC_Start_DMA()
  133. (+++) Wait for ADC conversion completion by call of function
  134. HAL_ADC_ConvCpltCallback() or HAL_ADC_ConvHalfCpltCallback()
  135. (these functions must be implemented in user program)
  136. (+++) Conversion results are automatically transferred by DMA into
  137. destination variable address.
  138. (+++) Stop conversion and disable the ADC peripheral
  139. using function HAL_ADC_Stop_DMA()
  140. [..]
  141. (@) Callback functions must be implemented in user program:
  142. (+@) HAL_ADC_ErrorCallback()
  143. (+@) HAL_ADC_LevelOutOfWindowCallback() (callback of analog watchdog)
  144. (+@) HAL_ADC_ConvCpltCallback()
  145. (+@) HAL_ADC_ConvHalfCpltCallback
  146. *** Deinitialization of ADC ***
  147. ============================================================
  148. [..]
  149. (#) Disable the ADC interface
  150. (++) ADC clock can be hard reset and disabled at RCC top level.
  151. (++) Hard reset of ADC peripherals
  152. using macro __ADCx_FORCE_RESET(), __ADCx_RELEASE_RESET().
  153. (++) ADC clock disable
  154. using the equivalent macro/functions as configuration step.
  155. (+++) Example:
  156. Into HAL_ADC_MspDeInit() (recommended code location) or with
  157. other device clock parameters configuration:
  158. (+++) RCC_OscInitStructure.OscillatorType = RCC_OSCILLATORTYPE_HSI14;
  159. (+++) RCC_OscInitStructure.HSI14State = RCC_HSI14_OFF; (if not used for system clock)
  160. (+++) HAL_RCC_OscConfig(&RCC_OscInitStructure);
  161. (#) ADC pins configuration
  162. (++) Disable the clock for the ADC GPIOs
  163. using macro __HAL_RCC_GPIOx_CLK_DISABLE()
  164. (#) Optionally, in case of usage of ADC with interruptions:
  165. (++) Disable the NVIC for ADC
  166. using function HAL_NVIC_EnableIRQ(ADCx_IRQn)
  167. (#) Optionally, in case of usage of DMA:
  168. (++) Deinitialize the DMA
  169. using function HAL_DMA_Init().
  170. (++) Disable the NVIC for DMA
  171. using function HAL_NVIC_EnableIRQ(DMAx_Channelx_IRQn)
  172. [..]
  173. *** Callback registration ***
  174. =============================================
  175. [..]
  176. The compilation flag USE_HAL_ADC_REGISTER_CALLBACKS, when set to 1,
  177. allows the user to configure dynamically the driver callbacks.
  178. Use Functions HAL_ADC_RegisterCallback()
  179. to register an interrupt callback.
  180. [..]
  181. Function HAL_ADC_RegisterCallback() allows to register following callbacks:
  182. (+) ConvCpltCallback : ADC conversion complete callback
  183. (+) ConvHalfCpltCallback : ADC conversion DMA half-transfer callback
  184. (+) LevelOutOfWindowCallback : ADC analog watchdog 1 callback
  185. (+) ErrorCallback : ADC error callback
  186. (+) InjectedConvCpltCallback : ADC group injected conversion complete callback
  187. (+) InjectedQueueOverflowCallback : ADC group injected context queue overflow callback
  188. (+) LevelOutOfWindow2Callback : ADC analog watchdog 2 callback
  189. (+) LevelOutOfWindow3Callback : ADC analog watchdog 3 callback
  190. (+) EndOfSamplingCallback : ADC end of sampling callback
  191. (+) MspInitCallback : ADC Msp Init callback
  192. (+) MspDeInitCallback : ADC Msp DeInit callback
  193. This function takes as parameters the HAL peripheral handle, the Callback ID
  194. and a pointer to the user callback function.
  195. [..]
  196. Use function HAL_ADC_UnRegisterCallback to reset a callback to the default
  197. weak function.
  198. [..]
  199. HAL_ADC_UnRegisterCallback takes as parameters the HAL peripheral handle,
  200. and the Callback ID.
  201. This function allows to reset following callbacks:
  202. (+) ConvCpltCallback : ADC conversion complete callback
  203. (+) ConvHalfCpltCallback : ADC conversion DMA half-transfer callback
  204. (+) LevelOutOfWindowCallback : ADC analog watchdog 1 callback
  205. (+) ErrorCallback : ADC error callback
  206. (+) InjectedConvCpltCallback : ADC group injected conversion complete callback
  207. (+) InjectedQueueOverflowCallback : ADC group injected context queue overflow callback
  208. (+) LevelOutOfWindow2Callback : ADC analog watchdog 2 callback
  209. (+) LevelOutOfWindow3Callback : ADC analog watchdog 3 callback
  210. (+) EndOfSamplingCallback : ADC end of sampling callback
  211. (+) MspInitCallback : ADC Msp Init callback
  212. (+) MspDeInitCallback : ADC Msp DeInit callback
  213. [..]
  214. By default, after the HAL_ADC_Init() and when the state is HAL_ADC_STATE_RESET
  215. all callbacks are set to the corresponding weak functions:
  216. examples HAL_ADC_ConvCpltCallback(), HAL_ADC_ErrorCallback().
  217. Exception done for MspInit and MspDeInit functions that are
  218. reset to the legacy weak functions in the HAL_ADC_Init()/ HAL_ADC_DeInit() only when
  219. these callbacks are null (not registered beforehand).
  220. [..]
  221. If MspInit or MspDeInit are not null, the HAL_ADC_Init()/ HAL_ADC_DeInit()
  222. keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state.
  223. [..]
  224. Callbacks can be registered/unregistered in HAL_ADC_STATE_READY state only.
  225. Exception done MspInit/MspDeInit functions that can be registered/unregistered
  226. in HAL_ADC_STATE_READY or HAL_ADC_STATE_RESET state,
  227. thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit.
  228. [..]
  229. Then, the user first registers the MspInit/MspDeInit user callbacks
  230. using HAL_ADC_RegisterCallback() before calling HAL_ADC_DeInit()
  231. or HAL_ADC_Init() function.
  232. [..]
  233. When the compilation flag USE_HAL_ADC_REGISTER_CALLBACKS is set to 0 or
  234. not defined, the callback registration feature is not available and all callbacks
  235. are set to the corresponding weak functions.
  236. @endverbatim
  237. ******************************************************************************
  238. */
  239. /* Includes ------------------------------------------------------------------*/
  240. #include "stm32l4xx_hal.h"
  241. /** @addtogroup STM32L4xx_HAL_Driver
  242. * @{
  243. */
  244. /** @defgroup ADC ADC
  245. * @brief ADC HAL module driver
  246. * @{
  247. */
  248. #ifdef HAL_ADC_MODULE_ENABLED
  249. /* Private typedef -----------------------------------------------------------*/
  250. /* Private define ------------------------------------------------------------*/
  251. /** @defgroup ADC_Private_Constants ADC Private Constants
  252. * @{
  253. */
  254. #define ADC_CFGR_FIELDS_1 ((ADC_CFGR_RES | ADC_CFGR_ALIGN |\
  255. ADC_CFGR_CONT | ADC_CFGR_OVRMOD |\
  256. ADC_CFGR_DISCEN | ADC_CFGR_DISCNUM |\
  257. ADC_CFGR_EXTEN | ADC_CFGR_EXTSEL)) /*!< ADC_CFGR fields of parameters that can be updated when no regular conversion is on-going */
  258. /* Timeout values for ADC operations (enable settling time, */
  259. /* disable settling time, ...). */
  260. /* Values defined to be higher than worst cases: low clock frequency, */
  261. /* maximum prescalers. */
  262. #define ADC_ENABLE_TIMEOUT (2UL) /*!< ADC enable time-out value */
  263. #define ADC_DISABLE_TIMEOUT (2UL) /*!< ADC disable time-out value */
  264. /* Timeout to wait for current conversion on going to be completed. */
  265. /* Timeout fixed to longest ADC conversion possible, for 1 channel: */
  266. /* - maximum sampling time (640.5 adc_clk) */
  267. /* - ADC resolution (Tsar 12 bits= 12.5 adc_clk) */
  268. /* - System clock / ADC clock <= 4096 (hypothesis of maximum clock ratio) */
  269. /* - ADC oversampling ratio 256 */
  270. /* Calculation: 653 * 4096 * 256 CPU clock cycles max */
  271. /* Unit: cycles of CPU clock. */
  272. #define ADC_CONVERSION_TIME_MAX_CPU_CYCLES (653UL * 4096UL * 256UL) /*!< ADC conversion completion time-out value */
  273. /**
  274. * @}
  275. */
  276. /* Private macro -------------------------------------------------------------*/
  277. /* Private variables ---------------------------------------------------------*/
  278. /* Private function prototypes -----------------------------------------------*/
  279. /* Exported functions --------------------------------------------------------*/
  280. /** @defgroup ADC_Exported_Functions ADC Exported Functions
  281. * @{
  282. */
  283. /** @defgroup ADC_Exported_Functions_Group1 Initialization and de-initialization functions
  284. * @brief ADC Initialization and Configuration functions
  285. *
  286. @verbatim
  287. ===============================================================================
  288. ##### Initialization and de-initialization functions #####
  289. ===============================================================================
  290. [..] This section provides functions allowing to:
  291. (+) Initialize and configure the ADC.
  292. (+) De-initialize the ADC.
  293. @endverbatim
  294. * @{
  295. */
  296. /**
  297. * @brief Initialize the ADC peripheral and regular group according to
  298. * parameters specified in structure "ADC_InitTypeDef".
  299. * @note As prerequisite, ADC clock must be configured at RCC top level
  300. * (refer to description of RCC configuration for ADC
  301. * in header of this file).
  302. * @note Possibility to update parameters on the fly:
  303. * This function initializes the ADC MSP (HAL_ADC_MspInit()) only when
  304. * coming from ADC state reset. Following calls to this function can
  305. * be used to reconfigure some parameters of ADC_InitTypeDef
  306. * structure on the fly, without modifying MSP configuration. If ADC
  307. * MSP has to be modified again, HAL_ADC_DeInit() must be called
  308. * before HAL_ADC_Init().
  309. * The setting of these parameters is conditioned to ADC state.
  310. * For parameters constraints, see comments of structure
  311. * "ADC_InitTypeDef".
  312. * @note This function configures the ADC within 2 scopes: scope of entire
  313. * ADC and scope of regular group. For parameters details, see comments
  314. * of structure "ADC_InitTypeDef".
  315. * @note Parameters related to common ADC registers (ADC clock mode) are set
  316. * only if all ADCs are disabled.
  317. * If this is not the case, these common parameters setting are
  318. * bypassed without error reporting: it can be the intended behaviour in
  319. * case of update of a parameter of ADC_InitTypeDef on the fly,
  320. * without disabling the other ADCs.
  321. * @param hadc ADC handle
  322. * @retval HAL status
  323. */
  324. HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef *hadc)
  325. {
  326. HAL_StatusTypeDef tmp_hal_status = HAL_OK;
  327. uint32_t tmpCFGR;
  328. uint32_t tmp_adc_reg_is_conversion_on_going;
  329. __IO uint32_t wait_loop_index = 0UL;
  330. uint32_t tmp_adc_is_conversion_on_going_regular;
  331. uint32_t tmp_adc_is_conversion_on_going_injected;
  332. /* Check ADC handle */
  333. if (hadc == NULL)
  334. {
  335. return HAL_ERROR;
  336. }
  337. /* Check the parameters */
  338. assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  339. assert_param(IS_ADC_CLOCKPRESCALER(hadc->Init.ClockPrescaler));
  340. assert_param(IS_ADC_RESOLUTION(hadc->Init.Resolution));
  341. #if defined(ADC_CFGR_DFSDMCFG) &&defined(DFSDM1_Channel0)
  342. assert_param(IS_ADC_DFSDMCFG_MODE(hadc));
  343. #endif
  344. assert_param(IS_ADC_DATA_ALIGN(hadc->Init.DataAlign));
  345. assert_param(IS_ADC_SCAN_MODE(hadc->Init.ScanConvMode));
  346. assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode));
  347. assert_param(IS_ADC_EXTTRIG_EDGE(hadc->Init.ExternalTrigConvEdge));
  348. assert_param(IS_ADC_EXTTRIG(hadc, hadc->Init.ExternalTrigConv));
  349. assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DMAContinuousRequests));
  350. assert_param(IS_ADC_EOC_SELECTION(hadc->Init.EOCSelection));
  351. assert_param(IS_ADC_OVERRUN(hadc->Init.Overrun));
  352. assert_param(IS_FUNCTIONAL_STATE(hadc->Init.LowPowerAutoWait));
  353. assert_param(IS_FUNCTIONAL_STATE(hadc->Init.OversamplingMode));
  354. if (hadc->Init.ScanConvMode != ADC_SCAN_DISABLE)
  355. {
  356. assert_param(IS_ADC_REGULAR_NB_CONV(hadc->Init.NbrOfConversion));
  357. assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DiscontinuousConvMode));
  358. if (hadc->Init.DiscontinuousConvMode == ENABLE)
  359. {
  360. assert_param(IS_ADC_REGULAR_DISCONT_NUMBER(hadc->Init.NbrOfDiscConversion));
  361. }
  362. }
  363. /* DISCEN and CONT bits cannot be set at the same time */
  364. assert_param(!((hadc->Init.DiscontinuousConvMode == ENABLE) && (hadc->Init.ContinuousConvMode == ENABLE)));
  365. /* Actions performed only if ADC is coming from state reset: */
  366. /* - Initialization of ADC MSP */
  367. if (hadc->State == HAL_ADC_STATE_RESET)
  368. {
  369. #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
  370. /* Init the ADC Callback settings */
  371. hadc->ConvCpltCallback = HAL_ADC_ConvCpltCallback; /* Legacy weak callback */
  372. hadc->ConvHalfCpltCallback = HAL_ADC_ConvHalfCpltCallback; /* Legacy weak callback */
  373. hadc->LevelOutOfWindowCallback = HAL_ADC_LevelOutOfWindowCallback; /* Legacy weak callback */
  374. hadc->ErrorCallback = HAL_ADC_ErrorCallback; /* Legacy weak callback */
  375. hadc->InjectedConvCpltCallback = HAL_ADCEx_InjectedConvCpltCallback; /* Legacy weak callback */
  376. hadc->InjectedQueueOverflowCallback = HAL_ADCEx_InjectedQueueOverflowCallback; /* Legacy weak callback */
  377. hadc->LevelOutOfWindow2Callback = HAL_ADCEx_LevelOutOfWindow2Callback; /* Legacy weak callback */
  378. hadc->LevelOutOfWindow3Callback = HAL_ADCEx_LevelOutOfWindow3Callback; /* Legacy weak callback */
  379. hadc->EndOfSamplingCallback = HAL_ADCEx_EndOfSamplingCallback; /* Legacy weak callback */
  380. if (hadc->MspInitCallback == NULL)
  381. {
  382. hadc->MspInitCallback = HAL_ADC_MspInit; /* Legacy weak MspInit */
  383. }
  384. /* Init the low level hardware */
  385. hadc->MspInitCallback(hadc);
  386. #else
  387. /* Init the low level hardware */
  388. HAL_ADC_MspInit(hadc);
  389. #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
  390. /* Set ADC error code to none */
  391. ADC_CLEAR_ERRORCODE(hadc);
  392. /* Initialize Lock */
  393. hadc->Lock = HAL_UNLOCKED;
  394. }
  395. /* - Exit from deep-power-down mode and ADC voltage regulator enable */
  396. if (LL_ADC_IsDeepPowerDownEnabled(hadc->Instance) != 0UL)
  397. {
  398. /* Disable ADC deep power down mode */
  399. LL_ADC_DisableDeepPowerDown(hadc->Instance);
  400. /* System was in deep power down mode, calibration must
  401. be relaunched or a previously saved calibration factor
  402. re-applied once the ADC voltage regulator is enabled */
  403. }
  404. if (LL_ADC_IsInternalRegulatorEnabled(hadc->Instance) == 0UL)
  405. {
  406. /* Enable ADC internal voltage regulator */
  407. LL_ADC_EnableInternalRegulator(hadc->Instance);
  408. /* Note: Variable divided by 2 to compensate partially */
  409. /* CPU processing cycles, scaling in us split to not */
  410. /* exceed 32 bits register capacity and handle low frequency. */
  411. wait_loop_index = ((LL_ADC_DELAY_INTERNAL_REGUL_STAB_US / 10UL) * ((SystemCoreClock / (100000UL * 2UL)) + 1UL));
  412. while (wait_loop_index != 0UL)
  413. {
  414. wait_loop_index--;
  415. }
  416. }
  417. /* Verification that ADC voltage regulator is correctly enabled, whether */
  418. /* or not ADC is coming from state reset (if any potential problem of */
  419. /* clocking, voltage regulator would not be enabled). */
  420. if (LL_ADC_IsInternalRegulatorEnabled(hadc->Instance) == 0UL)
  421. {
  422. /* Update ADC state machine to error */
  423. SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
  424. /* Set ADC error code to ADC peripheral internal error */
  425. SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
  426. tmp_hal_status = HAL_ERROR;
  427. }
  428. /* Configuration of ADC parameters if previous preliminary actions are */
  429. /* correctly completed and if there is no conversion on going on regular */
  430. /* group (ADC may already be enabled at this point if HAL_ADC_Init() is */
  431. /* called to update a parameter on the fly). */
  432. tmp_adc_reg_is_conversion_on_going = LL_ADC_REG_IsConversionOngoing(hadc->Instance);
  433. if (((hadc->State & HAL_ADC_STATE_ERROR_INTERNAL) == 0UL)
  434. && (tmp_adc_reg_is_conversion_on_going == 0UL)
  435. )
  436. {
  437. /* Set ADC state */
  438. ADC_STATE_CLR_SET(hadc->State,
  439. HAL_ADC_STATE_REG_BUSY,
  440. HAL_ADC_STATE_BUSY_INTERNAL);
  441. /* Configuration of common ADC parameters */
  442. /* Parameters update conditioned to ADC state: */
  443. /* Parameters that can be updated only when ADC is disabled: */
  444. /* - clock configuration */
  445. if (LL_ADC_IsEnabled(hadc->Instance) == 0UL)
  446. {
  447. if (__LL_ADC_IS_ENABLED_ALL_COMMON_INSTANCE(__LL_ADC_COMMON_INSTANCE(hadc->Instance)) == 0UL)
  448. {
  449. /* Reset configuration of ADC common register CCR: */
  450. /* */
  451. /* - ADC clock mode and ACC prescaler (CKMODE and PRESC bits)are set */
  452. /* according to adc->Init.ClockPrescaler. It selects the clock */
  453. /* source and sets the clock division factor. */
  454. /* */
  455. /* Some parameters of this register are not reset, since they are set */
  456. /* by other functions and must be kept in case of usage of this */
  457. /* function on the fly (update of a parameter of ADC_InitTypeDef */
  458. /* without needing to reconfigure all other ADC groups/channels */
  459. /* parameters): */
  460. /* - when multimode feature is available, multimode-related */
  461. /* parameters: MDMA, DMACFG, DELAY, DUAL (set by API */
  462. /* HAL_ADCEx_MultiModeConfigChannel() ) */
  463. /* - internal measurement paths: Vbat, temperature sensor, Vref */
  464. /* (set into HAL_ADC_ConfigChannel() or */
  465. /* HAL_ADCEx_InjectedConfigChannel() ) */
  466. LL_ADC_SetCommonClock(__LL_ADC_COMMON_INSTANCE(hadc->Instance), hadc->Init.ClockPrescaler);
  467. }
  468. }
  469. /* Configuration of ADC: */
  470. /* - resolution Init.Resolution */
  471. /* - data alignment Init.DataAlign */
  472. /* - external trigger to start conversion Init.ExternalTrigConv */
  473. /* - external trigger polarity Init.ExternalTrigConvEdge */
  474. /* - continuous conversion mode Init.ContinuousConvMode */
  475. /* - overrun Init.Overrun */
  476. /* - discontinuous mode Init.DiscontinuousConvMode */
  477. /* - discontinuous mode channel count Init.NbrOfDiscConversion */
  478. tmpCFGR = (ADC_CFGR_CONTINUOUS((uint32_t)hadc->Init.ContinuousConvMode) |
  479. hadc->Init.Overrun |
  480. hadc->Init.DataAlign |
  481. hadc->Init.Resolution |
  482. ADC_CFGR_REG_DISCONTINUOUS((uint32_t)hadc->Init.DiscontinuousConvMode));
  483. if (hadc->Init.DiscontinuousConvMode == ENABLE)
  484. {
  485. tmpCFGR |= ADC_CFGR_DISCONTINUOUS_NUM(hadc->Init.NbrOfDiscConversion);
  486. }
  487. /* Enable external trigger if trigger selection is different of software */
  488. /* start. */
  489. /* Note: This configuration keeps the hardware feature of parameter */
  490. /* ExternalTrigConvEdge "trigger edge none" equivalent to */
  491. /* software start. */
  492. if (hadc->Init.ExternalTrigConv != ADC_SOFTWARE_START)
  493. {
  494. tmpCFGR |= ((hadc->Init.ExternalTrigConv & ADC_CFGR_EXTSEL)
  495. | hadc->Init.ExternalTrigConvEdge
  496. );
  497. }
  498. /* Update Configuration Register CFGR */
  499. MODIFY_REG(hadc->Instance->CFGR, ADC_CFGR_FIELDS_1, tmpCFGR);
  500. /* Parameters update conditioned to ADC state: */
  501. /* Parameters that can be updated when ADC is disabled or enabled without */
  502. /* conversion on going on regular and injected groups: */
  503. /* - DMA continuous request Init.DMAContinuousRequests */
  504. /* - LowPowerAutoWait feature Init.LowPowerAutoWait */
  505. /* - Oversampling parameters Init.Oversampling */
  506. tmp_adc_is_conversion_on_going_regular = LL_ADC_REG_IsConversionOngoing(hadc->Instance);
  507. tmp_adc_is_conversion_on_going_injected = LL_ADC_INJ_IsConversionOngoing(hadc->Instance);
  508. if ((tmp_adc_is_conversion_on_going_regular == 0UL)
  509. && (tmp_adc_is_conversion_on_going_injected == 0UL)
  510. )
  511. {
  512. tmpCFGR = (ADC_CFGR_DFSDM(hadc) |
  513. ADC_CFGR_AUTOWAIT((uint32_t)hadc->Init.LowPowerAutoWait) |
  514. ADC_CFGR_DMACONTREQ((uint32_t)hadc->Init.DMAContinuousRequests));
  515. MODIFY_REG(hadc->Instance->CFGR, ADC_CFGR_FIELDS_2, tmpCFGR);
  516. if (hadc->Init.OversamplingMode == ENABLE)
  517. {
  518. assert_param(IS_ADC_OVERSAMPLING_RATIO(hadc->Init.Oversampling.Ratio));
  519. assert_param(IS_ADC_RIGHT_BIT_SHIFT(hadc->Init.Oversampling.RightBitShift));
  520. assert_param(IS_ADC_TRIGGERED_OVERSAMPLING_MODE(hadc->Init.Oversampling.TriggeredMode));
  521. assert_param(IS_ADC_REGOVERSAMPLING_MODE(hadc->Init.Oversampling.OversamplingStopReset));
  522. /* Configuration of Oversampler: */
  523. /* - Oversampling Ratio */
  524. /* - Right bit shift */
  525. /* - Triggered mode */
  526. /* - Oversampling mode (continued/resumed) */
  527. MODIFY_REG(hadc->Instance->CFGR2,
  528. ADC_CFGR2_OVSR |
  529. ADC_CFGR2_OVSS |
  530. ADC_CFGR2_TROVS |
  531. ADC_CFGR2_ROVSM,
  532. ADC_CFGR2_ROVSE |
  533. hadc->Init.Oversampling.Ratio |
  534. hadc->Init.Oversampling.RightBitShift |
  535. hadc->Init.Oversampling.TriggeredMode |
  536. hadc->Init.Oversampling.OversamplingStopReset
  537. );
  538. }
  539. else
  540. {
  541. /* Disable ADC oversampling scope on ADC group regular */
  542. CLEAR_BIT(hadc->Instance->CFGR2, ADC_CFGR2_ROVSE);
  543. }
  544. }
  545. /* Configuration of regular group sequencer: */
  546. /* - if scan mode is disabled, regular channels sequence length is set to */
  547. /* 0x00: 1 channel converted (channel on regular rank 1) */
  548. /* Parameter "NbrOfConversion" is discarded. */
  549. /* Note: Scan mode is not present by hardware on this device, but */
  550. /* emulated by software for alignment over all STM32 devices. */
  551. /* - if scan mode is enabled, regular channels sequence length is set to */
  552. /* parameter "NbrOfConversion". */
  553. if (hadc->Init.ScanConvMode == ADC_SCAN_ENABLE)
  554. {
  555. /* Set number of ranks in regular group sequencer */
  556. MODIFY_REG(hadc->Instance->SQR1, ADC_SQR1_L, (hadc->Init.NbrOfConversion - (uint8_t)1));
  557. }
  558. else
  559. {
  560. CLEAR_BIT(hadc->Instance->SQR1, ADC_SQR1_L);
  561. }
  562. /* Initialize the ADC state */
  563. /* Clear HAL_ADC_STATE_BUSY_INTERNAL bit, set HAL_ADC_STATE_READY bit */
  564. ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_BUSY_INTERNAL, HAL_ADC_STATE_READY);
  565. }
  566. else
  567. {
  568. /* Update ADC state machine to error */
  569. SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
  570. tmp_hal_status = HAL_ERROR;
  571. }
  572. /* Return function status */
  573. return tmp_hal_status;
  574. }
  575. /**
  576. * @brief Deinitialize the ADC peripheral registers to their default reset
  577. * values, with deinitialization of the ADC MSP.
  578. * @note For devices with several ADCs: reset of ADC common registers is done
  579. * only if all ADCs sharing the same common group are disabled.
  580. * (function "HAL_ADC_MspDeInit()" is also called under the same conditions:
  581. * all ADC instances use the same core clock at RCC level, disabling
  582. * the core clock reset all ADC instances).
  583. * If this is not the case, reset of these common parameters reset is
  584. * bypassed without error reporting: it can be the intended behavior in
  585. * case of reset of a single ADC while the other ADCs sharing the same
  586. * common group is still running.
  587. * @note By default, HAL_ADC_DeInit() set ADC in mode deep power-down:
  588. * this saves more power by reducing leakage currents
  589. * and is particularly interesting before entering MCU low-power modes.
  590. * @param hadc ADC handle
  591. * @retval HAL status
  592. */
  593. HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef *hadc)
  594. {
  595. HAL_StatusTypeDef tmp_hal_status;
  596. /* Check ADC handle */
  597. if (hadc == NULL)
  598. {
  599. return HAL_ERROR;
  600. }
  601. /* Check the parameters */
  602. assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  603. /* Set ADC state */
  604. SET_BIT(hadc->State, HAL_ADC_STATE_BUSY_INTERNAL);
  605. /* Stop potential conversion on going */
  606. tmp_hal_status = ADC_ConversionStop(hadc, ADC_REGULAR_INJECTED_GROUP);
  607. /* Disable ADC peripheral if conversions are effectively stopped */
  608. /* Flush register JSQR: reset the queue sequencer when injected */
  609. /* queue sequencer is enabled and ADC disabled. */
  610. /* The software and hardware triggers of the injected sequence are both */
  611. /* internally disabled just after the completion of the last valid */
  612. /* injected sequence. */
  613. SET_BIT(hadc->Instance->CFGR, ADC_CFGR_JQM);
  614. /* Disable ADC peripheral if conversions are effectively stopped */
  615. if (tmp_hal_status == HAL_OK)
  616. {
  617. /* Disable the ADC peripheral */
  618. tmp_hal_status = ADC_Disable(hadc);
  619. /* Check if ADC is effectively disabled */
  620. if (tmp_hal_status == HAL_OK)
  621. {
  622. /* Change ADC state */
  623. hadc->State = HAL_ADC_STATE_READY;
  624. }
  625. }
  626. /* Note: HAL ADC deInit is done independently of ADC conversion stop */
  627. /* and disable return status. In case of status fail, attempt to */
  628. /* perform deinitialization anyway and it is up user code in */
  629. /* in HAL_ADC_MspDeInit() to reset the ADC peripheral using */
  630. /* system RCC hard reset. */
  631. /* ========== Reset ADC registers ========== */
  632. /* Reset register IER */
  633. __HAL_ADC_DISABLE_IT(hadc, (ADC_IT_AWD3 | ADC_IT_AWD2 | ADC_IT_AWD1 |
  634. ADC_IT_JQOVF | ADC_IT_OVR |
  635. ADC_IT_JEOS | ADC_IT_JEOC |
  636. ADC_IT_EOS | ADC_IT_EOC |
  637. ADC_IT_EOSMP | ADC_IT_RDY));
  638. /* Reset register ISR */
  639. __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_AWD3 | ADC_FLAG_AWD2 | ADC_FLAG_AWD1 |
  640. ADC_FLAG_JQOVF | ADC_FLAG_OVR |
  641. ADC_FLAG_JEOS | ADC_FLAG_JEOC |
  642. ADC_FLAG_EOS | ADC_FLAG_EOC |
  643. ADC_FLAG_EOSMP | ADC_FLAG_RDY));
  644. /* Reset register CR */
  645. /* Bits ADC_CR_JADSTP, ADC_CR_ADSTP, ADC_CR_JADSTART, ADC_CR_ADSTART,
  646. ADC_CR_ADCAL, ADC_CR_ADDIS and ADC_CR_ADEN are in access mode "read-set":
  647. no direct reset applicable.
  648. Update CR register to reset value where doable by software */
  649. CLEAR_BIT(hadc->Instance->CR, ADC_CR_ADVREGEN | ADC_CR_ADCALDIF);
  650. SET_BIT(hadc->Instance->CR, ADC_CR_DEEPPWD);
  651. /* Reset register CFGR */
  652. CLEAR_BIT(hadc->Instance->CFGR, ADC_CFGR_FIELDS);
  653. SET_BIT(hadc->Instance->CFGR, ADC_CFGR_JQDIS);
  654. /* Reset register CFGR2 */
  655. CLEAR_BIT(hadc->Instance->CFGR2, ADC_CFGR2_ROVSM | ADC_CFGR2_TROVS | ADC_CFGR2_OVSS |
  656. ADC_CFGR2_OVSR | ADC_CFGR2_JOVSE | ADC_CFGR2_ROVSE);
  657. /* Reset register SMPR1 */
  658. CLEAR_BIT(hadc->Instance->SMPR1, ADC_SMPR1_FIELDS);
  659. /* Reset register SMPR2 */
  660. CLEAR_BIT(hadc->Instance->SMPR2, ADC_SMPR2_SMP18 | ADC_SMPR2_SMP17 | ADC_SMPR2_SMP16 |
  661. ADC_SMPR2_SMP15 | ADC_SMPR2_SMP14 | ADC_SMPR2_SMP13 |
  662. ADC_SMPR2_SMP12 | ADC_SMPR2_SMP11 | ADC_SMPR2_SMP10);
  663. /* Reset register TR1 */
  664. CLEAR_BIT(hadc->Instance->TR1, ADC_TR1_HT1 | ADC_TR1_LT1);
  665. /* Reset register TR2 */
  666. CLEAR_BIT(hadc->Instance->TR2, ADC_TR2_HT2 | ADC_TR2_LT2);
  667. /* Reset register TR3 */
  668. CLEAR_BIT(hadc->Instance->TR3, ADC_TR3_HT3 | ADC_TR3_LT3);
  669. /* Reset register SQR1 */
  670. CLEAR_BIT(hadc->Instance->SQR1, ADC_SQR1_SQ4 | ADC_SQR1_SQ3 | ADC_SQR1_SQ2 |
  671. ADC_SQR1_SQ1 | ADC_SQR1_L);
  672. /* Reset register SQR2 */
  673. CLEAR_BIT(hadc->Instance->SQR2, ADC_SQR2_SQ9 | ADC_SQR2_SQ8 | ADC_SQR2_SQ7 |
  674. ADC_SQR2_SQ6 | ADC_SQR2_SQ5);
  675. /* Reset register SQR3 */
  676. CLEAR_BIT(hadc->Instance->SQR3, ADC_SQR3_SQ14 | ADC_SQR3_SQ13 | ADC_SQR3_SQ12 |
  677. ADC_SQR3_SQ11 | ADC_SQR3_SQ10);
  678. /* Reset register SQR4 */
  679. CLEAR_BIT(hadc->Instance->SQR4, ADC_SQR4_SQ16 | ADC_SQR4_SQ15);
  680. /* Register JSQR was reset when the ADC was disabled */
  681. /* Reset register DR */
  682. /* bits in access mode read only, no direct reset applicable*/
  683. /* Reset register OFR1 */
  684. CLEAR_BIT(hadc->Instance->OFR1, ADC_OFR1_OFFSET1_EN | ADC_OFR1_OFFSET1_CH | ADC_OFR1_OFFSET1);
  685. /* Reset register OFR2 */
  686. CLEAR_BIT(hadc->Instance->OFR2, ADC_OFR2_OFFSET2_EN | ADC_OFR2_OFFSET2_CH | ADC_OFR2_OFFSET2);
  687. /* Reset register OFR3 */
  688. CLEAR_BIT(hadc->Instance->OFR3, ADC_OFR3_OFFSET3_EN | ADC_OFR3_OFFSET3_CH | ADC_OFR3_OFFSET3);
  689. /* Reset register OFR4 */
  690. CLEAR_BIT(hadc->Instance->OFR4, ADC_OFR4_OFFSET4_EN | ADC_OFR4_OFFSET4_CH | ADC_OFR4_OFFSET4);
  691. /* Reset registers JDR1, JDR2, JDR3, JDR4 */
  692. /* bits in access mode read only, no direct reset applicable*/
  693. /* Reset register AWD2CR */
  694. CLEAR_BIT(hadc->Instance->AWD2CR, ADC_AWD2CR_AWD2CH);
  695. /* Reset register AWD3CR */
  696. CLEAR_BIT(hadc->Instance->AWD3CR, ADC_AWD3CR_AWD3CH);
  697. /* Reset register DIFSEL */
  698. CLEAR_BIT(hadc->Instance->DIFSEL, ADC_DIFSEL_DIFSEL);
  699. /* Reset register CALFACT */
  700. CLEAR_BIT(hadc->Instance->CALFACT, ADC_CALFACT_CALFACT_D | ADC_CALFACT_CALFACT_S);
  701. /* ========== Reset common ADC registers ========== */
  702. /* Software is allowed to change common parameters only when all the other
  703. ADCs are disabled. */
  704. if (__LL_ADC_IS_ENABLED_ALL_COMMON_INSTANCE(__LL_ADC_COMMON_INSTANCE(hadc->Instance)) == 0UL)
  705. {
  706. /* Reset configuration of ADC common register CCR:
  707. - clock mode: CKMODE, PRESCEN
  708. - multimode related parameters (when this feature is available): MDMA,
  709. DMACFG, DELAY, DUAL (set by HAL_ADCEx_MultiModeConfigChannel() API)
  710. - internal measurement paths: Vbat, temperature sensor, Vref (set into
  711. HAL_ADC_ConfigChannel() or HAL_ADCEx_InjectedConfigChannel() )
  712. */
  713. ADC_CLEAR_COMMON_CONTROL_REGISTER(hadc);
  714. /* ========== Hard reset ADC peripheral ========== */
  715. /* Performs a global reset of the entire ADC peripherals instances */
  716. /* sharing the same common ADC instance: ADC state is forced to */
  717. /* a similar state as after device power-on. */
  718. /* Note: A possible implementation is to add RCC bus reset of ADC */
  719. /* (for example, using macro */
  720. /* __HAL_RCC_ADC..._FORCE_RESET()/..._RELEASE_RESET()/..._CLK_DISABLE()) */
  721. /* in function "void HAL_ADC_MspDeInit(ADC_HandleTypeDef *hadc)": */
  722. #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
  723. if (hadc->MspDeInitCallback == NULL)
  724. {
  725. hadc->MspDeInitCallback = HAL_ADC_MspDeInit; /* Legacy weak MspDeInit */
  726. }
  727. /* DeInit the low level hardware */
  728. hadc->MspDeInitCallback(hadc);
  729. #else
  730. /* DeInit the low level hardware */
  731. HAL_ADC_MspDeInit(hadc);
  732. #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
  733. }
  734. /* Set ADC error code to none */
  735. ADC_CLEAR_ERRORCODE(hadc);
  736. /* Reset injected channel configuration parameters */
  737. hadc->InjectionConfig.ContextQueue = 0;
  738. hadc->InjectionConfig.ChannelCount = 0;
  739. /* Set ADC state */
  740. hadc->State = HAL_ADC_STATE_RESET;
  741. /* Process unlocked */
  742. __HAL_UNLOCK(hadc);
  743. /* Return function status */
  744. return tmp_hal_status;
  745. }
  746. /**
  747. * @brief Initialize the ADC MSP.
  748. * @param hadc ADC handle
  749. * @retval None
  750. */
  751. __weak void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
  752. {
  753. /* Prevent unused argument(s) compilation warning */
  754. UNUSED(hadc);
  755. /* NOTE : This function should not be modified. When the callback is needed,
  756. function HAL_ADC_MspInit must be implemented in the user file.
  757. */
  758. }
  759. /**
  760. * @brief DeInitialize the ADC MSP.
  761. * @param hadc ADC handle
  762. * @note All ADC instances use the same core clock at RCC level, disabling
  763. * the core clock reset all ADC instances).
  764. * @retval None
  765. */
  766. __weak void HAL_ADC_MspDeInit(ADC_HandleTypeDef *hadc)
  767. {
  768. /* Prevent unused argument(s) compilation warning */
  769. UNUSED(hadc);
  770. /* NOTE : This function should not be modified. When the callback is needed,
  771. function HAL_ADC_MspDeInit must be implemented in the user file.
  772. */
  773. }
  774. #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
  775. /**
  776. * @brief Register a User ADC Callback
  777. * To be used instead of the weak predefined callback
  778. * @param hadc Pointer to a ADC_HandleTypeDef structure that contains
  779. * the configuration information for the specified ADC.
  780. * @param CallbackID ID of the callback to be registered
  781. * This parameter can be one of the following values:
  782. * @arg @ref HAL_ADC_CONVERSION_COMPLETE_CB_ID ADC conversion complete callback ID
  783. * @arg @ref HAL_ADC_CONVERSION_HALF_CB_ID ADC conversion DMA half-transfer callback ID
  784. * @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID ADC analog watchdog 1 callback ID
  785. * @arg @ref HAL_ADC_ERROR_CB_ID ADC error callback ID
  786. * @arg @ref HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID ADC group injected conversion complete callback ID
  787. * @arg @ref HAL_ADC_INJ_QUEUE_OVEFLOW_CB_ID ADC group injected context queue overflow callback ID
  788. * @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_2_CB_ID ADC analog watchdog 2 callback ID
  789. * @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_3_CB_ID ADC analog watchdog 3 callback ID
  790. * @arg @ref HAL_ADC_END_OF_SAMPLING_CB_ID ADC end of sampling callback ID
  791. * @arg @ref HAL_ADC_MSPINIT_CB_ID ADC Msp Init callback ID
  792. * @arg @ref HAL_ADC_MSPDEINIT_CB_ID ADC Msp DeInit callback ID
  793. * @arg @ref HAL_ADC_MSPINIT_CB_ID MspInit callback ID
  794. * @arg @ref HAL_ADC_MSPDEINIT_CB_ID MspDeInit callback ID
  795. * @param pCallback pointer to the Callback function
  796. * @retval HAL status
  797. */
  798. HAL_StatusTypeDef HAL_ADC_RegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID,
  799. pADC_CallbackTypeDef pCallback)
  800. {
  801. HAL_StatusTypeDef status = HAL_OK;
  802. if (pCallback == NULL)
  803. {
  804. /* Update the error code */
  805. hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
  806. return HAL_ERROR;
  807. }
  808. if ((hadc->State & HAL_ADC_STATE_READY) != 0UL)
  809. {
  810. switch (CallbackID)
  811. {
  812. case HAL_ADC_CONVERSION_COMPLETE_CB_ID :
  813. hadc->ConvCpltCallback = pCallback;
  814. break;
  815. case HAL_ADC_CONVERSION_HALF_CB_ID :
  816. hadc->ConvHalfCpltCallback = pCallback;
  817. break;
  818. case HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID :
  819. hadc->LevelOutOfWindowCallback = pCallback;
  820. break;
  821. case HAL_ADC_ERROR_CB_ID :
  822. hadc->ErrorCallback = pCallback;
  823. break;
  824. case HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID :
  825. hadc->InjectedConvCpltCallback = pCallback;
  826. break;
  827. case HAL_ADC_INJ_QUEUE_OVEFLOW_CB_ID :
  828. hadc->InjectedQueueOverflowCallback = pCallback;
  829. break;
  830. case HAL_ADC_LEVEL_OUT_OF_WINDOW_2_CB_ID :
  831. hadc->LevelOutOfWindow2Callback = pCallback;
  832. break;
  833. case HAL_ADC_LEVEL_OUT_OF_WINDOW_3_CB_ID :
  834. hadc->LevelOutOfWindow3Callback = pCallback;
  835. break;
  836. case HAL_ADC_END_OF_SAMPLING_CB_ID :
  837. hadc->EndOfSamplingCallback = pCallback;
  838. break;
  839. case HAL_ADC_MSPINIT_CB_ID :
  840. hadc->MspInitCallback = pCallback;
  841. break;
  842. case HAL_ADC_MSPDEINIT_CB_ID :
  843. hadc->MspDeInitCallback = pCallback;
  844. break;
  845. default :
  846. /* Update the error code */
  847. hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
  848. /* Return error status */
  849. status = HAL_ERROR;
  850. break;
  851. }
  852. }
  853. else if (HAL_ADC_STATE_RESET == hadc->State)
  854. {
  855. switch (CallbackID)
  856. {
  857. case HAL_ADC_MSPINIT_CB_ID :
  858. hadc->MspInitCallback = pCallback;
  859. break;
  860. case HAL_ADC_MSPDEINIT_CB_ID :
  861. hadc->MspDeInitCallback = pCallback;
  862. break;
  863. default :
  864. /* Update the error code */
  865. hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
  866. /* Return error status */
  867. status = HAL_ERROR;
  868. break;
  869. }
  870. }
  871. else
  872. {
  873. /* Update the error code */
  874. hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
  875. /* Return error status */
  876. status = HAL_ERROR;
  877. }
  878. return status;
  879. }
  880. /**
  881. * @brief Unregister a ADC Callback
  882. * ADC callback is redirected to the weak predefined callback
  883. * @param hadc Pointer to a ADC_HandleTypeDef structure that contains
  884. * the configuration information for the specified ADC.
  885. * @param CallbackID ID of the callback to be unregistered
  886. * This parameter can be one of the following values:
  887. * @arg @ref HAL_ADC_CONVERSION_COMPLETE_CB_ID ADC conversion complete callback ID
  888. * @arg @ref HAL_ADC_CONVERSION_HALF_CB_ID ADC conversion DMA half-transfer callback ID
  889. * @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID ADC analog watchdog 1 callback ID
  890. * @arg @ref HAL_ADC_ERROR_CB_ID ADC error callback ID
  891. * @arg @ref HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID ADC group injected conversion complete callback ID
  892. * @arg @ref HAL_ADC_INJ_QUEUE_OVEFLOW_CB_ID ADC group injected context queue overflow callback ID
  893. * @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_2_CB_ID ADC analog watchdog 2 callback ID
  894. * @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_3_CB_ID ADC analog watchdog 3 callback ID
  895. * @arg @ref HAL_ADC_END_OF_SAMPLING_CB_ID ADC end of sampling callback ID
  896. * @arg @ref HAL_ADC_MSPINIT_CB_ID ADC Msp Init callback ID
  897. * @arg @ref HAL_ADC_MSPDEINIT_CB_ID ADC Msp DeInit callback ID
  898. * @arg @ref HAL_ADC_MSPINIT_CB_ID MspInit callback ID
  899. * @arg @ref HAL_ADC_MSPDEINIT_CB_ID MspDeInit callback ID
  900. * @retval HAL status
  901. */
  902. HAL_StatusTypeDef HAL_ADC_UnRegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID)
  903. {
  904. HAL_StatusTypeDef status = HAL_OK;
  905. if ((hadc->State & HAL_ADC_STATE_READY) != 0UL)
  906. {
  907. switch (CallbackID)
  908. {
  909. case HAL_ADC_CONVERSION_COMPLETE_CB_ID :
  910. hadc->ConvCpltCallback = HAL_ADC_ConvCpltCallback;
  911. break;
  912. case HAL_ADC_CONVERSION_HALF_CB_ID :
  913. hadc->ConvHalfCpltCallback = HAL_ADC_ConvHalfCpltCallback;
  914. break;
  915. case HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID :
  916. hadc->LevelOutOfWindowCallback = HAL_ADC_LevelOutOfWindowCallback;
  917. break;
  918. case HAL_ADC_ERROR_CB_ID :
  919. hadc->ErrorCallback = HAL_ADC_ErrorCallback;
  920. break;
  921. case HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID :
  922. hadc->InjectedConvCpltCallback = HAL_ADCEx_InjectedConvCpltCallback;
  923. break;
  924. case HAL_ADC_INJ_QUEUE_OVEFLOW_CB_ID :
  925. hadc->InjectedQueueOverflowCallback = HAL_ADCEx_InjectedQueueOverflowCallback;
  926. break;
  927. case HAL_ADC_LEVEL_OUT_OF_WINDOW_2_CB_ID :
  928. hadc->LevelOutOfWindow2Callback = HAL_ADCEx_LevelOutOfWindow2Callback;
  929. break;
  930. case HAL_ADC_LEVEL_OUT_OF_WINDOW_3_CB_ID :
  931. hadc->LevelOutOfWindow3Callback = HAL_ADCEx_LevelOutOfWindow3Callback;
  932. break;
  933. case HAL_ADC_END_OF_SAMPLING_CB_ID :
  934. hadc->EndOfSamplingCallback = HAL_ADCEx_EndOfSamplingCallback;
  935. break;
  936. case HAL_ADC_MSPINIT_CB_ID :
  937. hadc->MspInitCallback = HAL_ADC_MspInit; /* Legacy weak MspInit */
  938. break;
  939. case HAL_ADC_MSPDEINIT_CB_ID :
  940. hadc->MspDeInitCallback = HAL_ADC_MspDeInit; /* Legacy weak MspDeInit */
  941. break;
  942. default :
  943. /* Update the error code */
  944. hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
  945. /* Return error status */
  946. status = HAL_ERROR;
  947. break;
  948. }
  949. }
  950. else if (HAL_ADC_STATE_RESET == hadc->State)
  951. {
  952. switch (CallbackID)
  953. {
  954. case HAL_ADC_MSPINIT_CB_ID :
  955. hadc->MspInitCallback = HAL_ADC_MspInit; /* Legacy weak MspInit */
  956. break;
  957. case HAL_ADC_MSPDEINIT_CB_ID :
  958. hadc->MspDeInitCallback = HAL_ADC_MspDeInit; /* Legacy weak MspDeInit */
  959. break;
  960. default :
  961. /* Update the error code */
  962. hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
  963. /* Return error status */
  964. status = HAL_ERROR;
  965. break;
  966. }
  967. }
  968. else
  969. {
  970. /* Update the error code */
  971. hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
  972. /* Return error status */
  973. status = HAL_ERROR;
  974. }
  975. return status;
  976. }
  977. #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
  978. /**
  979. * @}
  980. */
  981. /** @defgroup ADC_Exported_Functions_Group2 ADC Input and Output operation functions
  982. * @brief ADC IO operation functions
  983. *
  984. @verbatim
  985. ===============================================================================
  986. ##### IO operation functions #####
  987. ===============================================================================
  988. [..] This section provides functions allowing to:
  989. (+) Start conversion of regular group.
  990. (+) Stop conversion of regular group.
  991. (+) Poll for conversion complete on regular group.
  992. (+) Poll for conversion event.
  993. (+) Get result of regular channel conversion.
  994. (+) Start conversion of regular group and enable interruptions.
  995. (+) Stop conversion of regular group and disable interruptions.
  996. (+) Handle ADC interrupt request
  997. (+) Start conversion of regular group and enable DMA transfer.
  998. (+) Stop conversion of regular group and disable ADC DMA transfer.
  999. @endverbatim
  1000. * @{
  1001. */
  1002. /**
  1003. * @brief Enable ADC, start conversion of regular group.
  1004. * @note Interruptions enabled in this function: None.
  1005. * @note Case of multimode enabled (when multimode feature is available):
  1006. * if ADC is Slave, ADC is enabled but conversion is not started,
  1007. * if ADC is master, ADC is enabled and multimode conversion is started.
  1008. * @param hadc ADC handle
  1009. * @retval HAL status
  1010. */
  1011. HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef *hadc)
  1012. {
  1013. HAL_StatusTypeDef tmp_hal_status;
  1014. #if defined(ADC_MULTIMODE_SUPPORT)
  1015. const ADC_TypeDef *tmpADC_Master;
  1016. uint32_t tmp_multimode_config = LL_ADC_GetMultimode(__LL_ADC_COMMON_INSTANCE(hadc->Instance));
  1017. #endif
  1018. /* Check the parameters */
  1019. assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  1020. /* Perform ADC enable and conversion start if no conversion is on going */
  1021. if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
  1022. {
  1023. /* Process locked */
  1024. __HAL_LOCK(hadc);
  1025. /* Enable the ADC peripheral */
  1026. tmp_hal_status = ADC_Enable(hadc);
  1027. /* Start conversion if ADC is effectively enabled */
  1028. if (tmp_hal_status == HAL_OK)
  1029. {
  1030. /* Set ADC state */
  1031. /* - Clear state bitfield related to regular group conversion results */
  1032. /* - Set state bitfield related to regular operation */
  1033. ADC_STATE_CLR_SET(hadc->State,
  1034. HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR | HAL_ADC_STATE_REG_EOSMP,
  1035. HAL_ADC_STATE_REG_BUSY);
  1036. #if defined(ADC_MULTIMODE_SUPPORT)
  1037. /* Reset HAL_ADC_STATE_MULTIMODE_SLAVE bit
  1038. - if ADC instance is master or if multimode feature is not available
  1039. - if multimode setting is disabled (ADC instance slave in independent mode) */
  1040. if ((__LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance) == hadc->Instance)
  1041. || (tmp_multimode_config == LL_ADC_MULTI_INDEPENDENT)
  1042. )
  1043. {
  1044. CLEAR_BIT(hadc->State, HAL_ADC_STATE_MULTIMODE_SLAVE);
  1045. }
  1046. #endif
  1047. /* Set ADC error code */
  1048. /* Check if a conversion is on going on ADC group injected */
  1049. if (HAL_IS_BIT_SET(hadc->State, HAL_ADC_STATE_INJ_BUSY))
  1050. {
  1051. /* Reset ADC error code fields related to regular conversions only */
  1052. CLEAR_BIT(hadc->ErrorCode, (HAL_ADC_ERROR_OVR | HAL_ADC_ERROR_DMA));
  1053. }
  1054. else
  1055. {
  1056. /* Reset all ADC error code fields */
  1057. ADC_CLEAR_ERRORCODE(hadc);
  1058. }
  1059. /* Clear ADC group regular conversion flag and overrun flag */
  1060. /* (To ensure of no unknown state from potential previous ADC operations) */
  1061. __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR));
  1062. /* Process unlocked */
  1063. /* Unlock before starting ADC conversions: in case of potential */
  1064. /* interruption, to let the process to ADC IRQ Handler. */
  1065. __HAL_UNLOCK(hadc);
  1066. /* Enable conversion of regular group. */
  1067. /* If software start has been selected, conversion starts immediately. */
  1068. /* If external trigger has been selected, conversion will start at next */
  1069. /* trigger event. */
  1070. /* Case of multimode enabled (when multimode feature is available): */
  1071. /* - if ADC is slave and dual regular conversions are enabled, ADC is */
  1072. /* enabled only (conversion is not started), */
  1073. /* - if ADC is master, ADC is enabled and conversion is started. */
  1074. #if defined(ADC_MULTIMODE_SUPPORT)
  1075. if ((__LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance) == hadc->Instance)
  1076. || (tmp_multimode_config == LL_ADC_MULTI_INDEPENDENT)
  1077. || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_SIMULT)
  1078. || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_ALTERN)
  1079. )
  1080. {
  1081. /* ADC instance is not a multimode slave instance with multimode regular conversions enabled */
  1082. if (READ_BIT(hadc->Instance->CFGR, ADC_CFGR_JAUTO) != 0UL)
  1083. {
  1084. ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY);
  1085. }
  1086. /* Start ADC group regular conversion */
  1087. LL_ADC_REG_StartConversion(hadc->Instance);
  1088. }
  1089. else
  1090. {
  1091. /* ADC instance is a multimode slave instance with multimode regular conversions enabled */
  1092. SET_BIT(hadc->State, HAL_ADC_STATE_MULTIMODE_SLAVE);
  1093. /* if Master ADC JAUTO bit is set, update Slave State in setting
  1094. HAL_ADC_STATE_INJ_BUSY bit and in resetting HAL_ADC_STATE_INJ_EOC bit */
  1095. tmpADC_Master = __LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance);
  1096. if (READ_BIT(tmpADC_Master->CFGR, ADC_CFGR_JAUTO) != 0UL)
  1097. {
  1098. ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY);
  1099. }
  1100. }
  1101. #else
  1102. if (READ_BIT(hadc->Instance->CFGR, ADC_CFGR_JAUTO) != 0UL)
  1103. {
  1104. ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY);
  1105. }
  1106. /* Start ADC group regular conversion */
  1107. LL_ADC_REG_StartConversion(hadc->Instance);
  1108. #endif
  1109. }
  1110. else
  1111. {
  1112. /* Process unlocked */
  1113. __HAL_UNLOCK(hadc);
  1114. }
  1115. }
  1116. else
  1117. {
  1118. tmp_hal_status = HAL_BUSY;
  1119. }
  1120. /* Return function status */
  1121. return tmp_hal_status;
  1122. }
  1123. /**
  1124. * @brief Stop ADC conversion of regular group (and injected channels in
  1125. * case of auto_injection mode), disable ADC peripheral.
  1126. * @note: ADC peripheral disable is forcing stop of potential
  1127. * conversion on injected group. If injected group is under use, it
  1128. * should be preliminarily stopped using HAL_ADCEx_InjectedStop function.
  1129. * @param hadc ADC handle
  1130. * @retval HAL status.
  1131. */
  1132. HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef *hadc)
  1133. {
  1134. HAL_StatusTypeDef tmp_hal_status;
  1135. /* Check the parameters */
  1136. assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  1137. /* Process locked */
  1138. __HAL_LOCK(hadc);
  1139. /* 1. Stop potential conversion on going, on ADC groups regular and injected */
  1140. tmp_hal_status = ADC_ConversionStop(hadc, ADC_REGULAR_INJECTED_GROUP);
  1141. /* Disable ADC peripheral if conversions are effectively stopped */
  1142. if (tmp_hal_status == HAL_OK)
  1143. {
  1144. /* 2. Disable the ADC peripheral */
  1145. tmp_hal_status = ADC_Disable(hadc);
  1146. /* Check if ADC is effectively disabled */
  1147. if (tmp_hal_status == HAL_OK)
  1148. {
  1149. /* Set ADC state */
  1150. ADC_STATE_CLR_SET(hadc->State,
  1151. HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY,
  1152. HAL_ADC_STATE_READY);
  1153. }
  1154. }
  1155. /* Process unlocked */
  1156. __HAL_UNLOCK(hadc);
  1157. /* Return function status */
  1158. return tmp_hal_status;
  1159. }
  1160. /**
  1161. * @brief Wait for regular group conversion to be completed.
  1162. * @note ADC conversion flags EOS (end of sequence) and EOC (end of
  1163. * conversion) are cleared by this function, with an exception:
  1164. * if low power feature "LowPowerAutoWait" is enabled, flags are
  1165. * not cleared to not interfere with this feature until data register
  1166. * is read using function HAL_ADC_GetValue().
  1167. * @note This function cannot be used in a particular setup: ADC configured
  1168. * in DMA mode and polling for end of each conversion (ADC init
  1169. * parameter "EOCSelection" set to ADC_EOC_SINGLE_CONV).
  1170. * In this case, DMA resets the flag EOC and polling cannot be
  1171. * performed on each conversion. Nevertheless, polling can still
  1172. * be performed on the complete sequence (ADC init
  1173. * parameter "EOCSelection" set to ADC_EOC_SEQ_CONV).
  1174. * @param hadc ADC handle
  1175. * @param Timeout Timeout value in millisecond.
  1176. * @retval HAL status
  1177. */
  1178. HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef *hadc, uint32_t Timeout)
  1179. {
  1180. uint32_t tickstart;
  1181. uint32_t tmp_Flag_End;
  1182. uint32_t tmp_cfgr;
  1183. #if defined(ADC_MULTIMODE_SUPPORT)
  1184. const ADC_TypeDef *tmpADC_Master;
  1185. uint32_t tmp_multimode_config = LL_ADC_GetMultimode(__LL_ADC_COMMON_INSTANCE(hadc->Instance));
  1186. #endif
  1187. /* Check the parameters */
  1188. assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  1189. /* If end of conversion selected to end of sequence conversions */
  1190. if (hadc->Init.EOCSelection == ADC_EOC_SEQ_CONV)
  1191. {
  1192. tmp_Flag_End = ADC_FLAG_EOS;
  1193. }
  1194. /* If end of conversion selected to end of unitary conversion */
  1195. else /* ADC_EOC_SINGLE_CONV */
  1196. {
  1197. /* Verification that ADC configuration is compliant with polling for */
  1198. /* each conversion: */
  1199. /* Particular case is ADC configured in DMA mode and ADC sequencer with */
  1200. /* several ranks and polling for end of each conversion. */
  1201. /* For code simplicity sake, this particular case is generalized to */
  1202. /* ADC configured in DMA mode and and polling for end of each conversion. */
  1203. #if defined(ADC_MULTIMODE_SUPPORT)
  1204. if ((tmp_multimode_config == LL_ADC_MULTI_INDEPENDENT)
  1205. || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_SIMULT)
  1206. || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_ALTERN)
  1207. )
  1208. {
  1209. /* Check ADC DMA mode in independent mode on ADC group regular */
  1210. if (READ_BIT(hadc->Instance->CFGR, ADC_CFGR_DMAEN) != 0UL)
  1211. {
  1212. SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
  1213. return HAL_ERROR;
  1214. }
  1215. else
  1216. {
  1217. tmp_Flag_End = (ADC_FLAG_EOC);
  1218. }
  1219. }
  1220. else
  1221. {
  1222. /* Check ADC DMA mode in multimode on ADC group regular */
  1223. if (LL_ADC_GetMultiDMATransfer(__LL_ADC_COMMON_INSTANCE(hadc->Instance)) != LL_ADC_MULTI_REG_DMA_EACH_ADC)
  1224. {
  1225. SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
  1226. return HAL_ERROR;
  1227. }
  1228. else
  1229. {
  1230. tmp_Flag_End = (ADC_FLAG_EOC);
  1231. }
  1232. }
  1233. #else
  1234. /* Check ADC DMA mode */
  1235. if (READ_BIT(hadc->Instance->CFGR, ADC_CFGR_DMAEN) != 0UL)
  1236. {
  1237. SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
  1238. return HAL_ERROR;
  1239. }
  1240. else
  1241. {
  1242. tmp_Flag_End = (ADC_FLAG_EOC);
  1243. }
  1244. #endif
  1245. }
  1246. /* Get tick count */
  1247. tickstart = HAL_GetTick();
  1248. /* Wait until End of unitary conversion or sequence conversions flag is raised */
  1249. while ((hadc->Instance->ISR & tmp_Flag_End) == 0UL)
  1250. {
  1251. /* Check if timeout is disabled (set to infinite wait) */
  1252. if (Timeout != HAL_MAX_DELAY)
  1253. {
  1254. if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0UL))
  1255. {
  1256. /* New check to avoid false timeout detection in case of preemption */
  1257. if ((hadc->Instance->ISR & tmp_Flag_End) == 0UL)
  1258. {
  1259. /* Update ADC state machine to timeout */
  1260. SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT);
  1261. /* Process unlocked */
  1262. __HAL_UNLOCK(hadc);
  1263. return HAL_TIMEOUT;
  1264. }
  1265. }
  1266. }
  1267. }
  1268. /* Update ADC state machine */
  1269. SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
  1270. /* Determine whether any further conversion upcoming on group regular */
  1271. /* by external trigger, continuous mode or scan sequence on going. */
  1272. if ((LL_ADC_REG_IsTriggerSourceSWStart(hadc->Instance) != 0UL)
  1273. && (hadc->Init.ContinuousConvMode == DISABLE)
  1274. )
  1275. {
  1276. /* Check whether end of sequence is reached */
  1277. if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOS))
  1278. {
  1279. /* Set ADC state */
  1280. CLEAR_BIT(hadc->State, HAL_ADC_STATE_REG_BUSY);
  1281. if ((hadc->State & HAL_ADC_STATE_INJ_BUSY) == 0UL)
  1282. {
  1283. SET_BIT(hadc->State, HAL_ADC_STATE_READY);
  1284. }
  1285. }
  1286. }
  1287. /* Get relevant register CFGR in ADC instance of ADC master or slave */
  1288. /* in function of multimode state (for devices with multimode */
  1289. /* available). */
  1290. #if defined(ADC_MULTIMODE_SUPPORT)
  1291. if ((__LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance) == hadc->Instance)
  1292. || (tmp_multimode_config == LL_ADC_MULTI_INDEPENDENT)
  1293. || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_SIMULT)
  1294. || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_ALTERN)
  1295. )
  1296. {
  1297. /* Retrieve handle ADC CFGR register */
  1298. tmp_cfgr = READ_REG(hadc->Instance->CFGR);
  1299. }
  1300. else
  1301. {
  1302. /* Retrieve Master ADC CFGR register */
  1303. tmpADC_Master = __LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance);
  1304. tmp_cfgr = READ_REG(tmpADC_Master->CFGR);
  1305. }
  1306. #else
  1307. /* Retrieve handle ADC CFGR register */
  1308. tmp_cfgr = READ_REG(hadc->Instance->CFGR);
  1309. #endif
  1310. /* Clear polled flag */
  1311. if (tmp_Flag_End == ADC_FLAG_EOS)
  1312. {
  1313. __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOS);
  1314. }
  1315. else
  1316. {
  1317. /* Clear end of conversion EOC flag of regular group if low power feature */
  1318. /* "LowPowerAutoWait " is disabled, to not interfere with this feature */
  1319. /* until data register is read using function HAL_ADC_GetValue(). */
  1320. if (READ_BIT(tmp_cfgr, ADC_CFGR_AUTDLY) == 0UL)
  1321. {
  1322. __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS));
  1323. }
  1324. }
  1325. /* Return function status */
  1326. return HAL_OK;
  1327. }
  1328. /**
  1329. * @brief Poll for ADC event.
  1330. * @param hadc ADC handle
  1331. * @param EventType the ADC event type.
  1332. * This parameter can be one of the following values:
  1333. * @arg @ref ADC_EOSMP_EVENT ADC End of Sampling event
  1334. * @arg @ref ADC_AWD1_EVENT ADC Analog watchdog 1 event (main analog watchdog, present on all STM32 devices)
  1335. * @arg @ref ADC_AWD2_EVENT ADC Analog watchdog 2 event (additional analog watchdog, not present on all STM32 families)
  1336. * @arg @ref ADC_AWD3_EVENT ADC Analog watchdog 3 event (additional analog watchdog, not present on all STM32 families)
  1337. * @arg @ref ADC_OVR_EVENT ADC Overrun event
  1338. * @arg @ref ADC_JQOVF_EVENT ADC Injected context queue overflow event
  1339. * @param Timeout Timeout value in millisecond.
  1340. * @note The relevant flag is cleared if found to be set, except for ADC_FLAG_OVR.
  1341. * Indeed, the latter is reset only if hadc->Init.Overrun field is set
  1342. * to ADC_OVR_DATA_OVERWRITTEN. Otherwise, data register may be potentially overwritten
  1343. * by a new converted data as soon as OVR is cleared.
  1344. * To reset OVR flag once the preserved data is retrieved, the user can resort
  1345. * to macro __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
  1346. * @retval HAL status
  1347. */
  1348. HAL_StatusTypeDef HAL_ADC_PollForEvent(ADC_HandleTypeDef *hadc, uint32_t EventType, uint32_t Timeout)
  1349. {
  1350. uint32_t tickstart;
  1351. /* Check the parameters */
  1352. assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  1353. assert_param(IS_ADC_EVENT_TYPE(EventType));
  1354. /* Get tick count */
  1355. tickstart = HAL_GetTick();
  1356. /* Check selected event flag */
  1357. while (__HAL_ADC_GET_FLAG(hadc, EventType) == 0UL)
  1358. {
  1359. /* Check if timeout is disabled (set to infinite wait) */
  1360. if (Timeout != HAL_MAX_DELAY)
  1361. {
  1362. if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0UL))
  1363. {
  1364. /* New check to avoid false timeout detection in case of preemption */
  1365. if (__HAL_ADC_GET_FLAG(hadc, EventType) == 0UL)
  1366. {
  1367. /* Update ADC state machine to timeout */
  1368. SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT);
  1369. /* Process unlocked */
  1370. __HAL_UNLOCK(hadc);
  1371. return HAL_TIMEOUT;
  1372. }
  1373. }
  1374. }
  1375. }
  1376. switch (EventType)
  1377. {
  1378. /* End Of Sampling event */
  1379. case ADC_EOSMP_EVENT:
  1380. /* Set ADC state */
  1381. SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOSMP);
  1382. /* Clear the End Of Sampling flag */
  1383. __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOSMP);
  1384. break;
  1385. /* Analog watchdog (level out of window) event */
  1386. /* Note: In case of several analog watchdog enabled, if needed to know */
  1387. /* which one triggered and on which ADCx, test ADC state of analog watchdog */
  1388. /* flags HAL_ADC_STATE_AWD1/2/3 using function "HAL_ADC_GetState()". */
  1389. /* For example: */
  1390. /* " if ((HAL_ADC_GetState(hadc1) & HAL_ADC_STATE_AWD1) != 0UL) " */
  1391. /* " if ((HAL_ADC_GetState(hadc1) & HAL_ADC_STATE_AWD2) != 0UL) " */
  1392. /* " if ((HAL_ADC_GetState(hadc1) & HAL_ADC_STATE_AWD3) != 0UL) " */
  1393. /* Check analog watchdog 1 flag */
  1394. case ADC_AWD_EVENT:
  1395. /* Set ADC state */
  1396. SET_BIT(hadc->State, HAL_ADC_STATE_AWD1);
  1397. /* Clear ADC analog watchdog flag */
  1398. __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD1);
  1399. break;
  1400. /* Check analog watchdog 2 flag */
  1401. case ADC_AWD2_EVENT:
  1402. /* Set ADC state */
  1403. SET_BIT(hadc->State, HAL_ADC_STATE_AWD2);
  1404. /* Clear ADC analog watchdog flag */
  1405. __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD2);
  1406. break;
  1407. /* Check analog watchdog 3 flag */
  1408. case ADC_AWD3_EVENT:
  1409. /* Set ADC state */
  1410. SET_BIT(hadc->State, HAL_ADC_STATE_AWD3);
  1411. /* Clear ADC analog watchdog flag */
  1412. __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD3);
  1413. break;
  1414. /* Injected context queue overflow event */
  1415. case ADC_JQOVF_EVENT:
  1416. /* Set ADC state */
  1417. SET_BIT(hadc->State, HAL_ADC_STATE_INJ_JQOVF);
  1418. /* Set ADC error code to Injected context queue overflow */
  1419. SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_JQOVF);
  1420. /* Clear ADC Injected context queue overflow flag */
  1421. __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JQOVF);
  1422. break;
  1423. /* Overrun event */
  1424. default: /* Case ADC_OVR_EVENT */
  1425. /* If overrun is set to overwrite previous data, overrun event is not */
  1426. /* considered as an error. */
  1427. /* (cf ref manual "Managing conversions without using the DMA and without */
  1428. /* overrun ") */
  1429. if (hadc->Init.Overrun == ADC_OVR_DATA_PRESERVED)
  1430. {
  1431. /* Set ADC state */
  1432. SET_BIT(hadc->State, HAL_ADC_STATE_REG_OVR);
  1433. /* Set ADC error code to overrun */
  1434. SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_OVR);
  1435. }
  1436. else
  1437. {
  1438. /* Clear ADC Overrun flag only if Overrun is set to ADC_OVR_DATA_OVERWRITTEN
  1439. otherwise, data register is potentially overwritten by new converted data as soon
  1440. as OVR is cleared. */
  1441. __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
  1442. }
  1443. break;
  1444. }
  1445. /* Return function status */
  1446. return HAL_OK;
  1447. }
  1448. /**
  1449. * @brief Enable ADC, start conversion of regular group with interruption.
  1450. * @note Interruptions enabled in this function according to initialization
  1451. * setting : EOC (end of conversion), EOS (end of sequence),
  1452. * OVR overrun.
  1453. * Each of these interruptions has its dedicated callback function.
  1454. * @note Case of multimode enabled (when multimode feature is available):
  1455. * HAL_ADC_Start_IT() must be called for ADC Slave first, then for
  1456. * ADC Master.
  1457. * For ADC Slave, ADC is enabled only (conversion is not started).
  1458. * For ADC Master, ADC is enabled and multimode conversion is started.
  1459. * @note To guarantee a proper reset of all interruptions once all the needed
  1460. * conversions are obtained, HAL_ADC_Stop_IT() must be called to ensure
  1461. * a correct stop of the IT-based conversions.
  1462. * @note By default, HAL_ADC_Start_IT() does not enable the End Of Sampling
  1463. * interruption. If required (e.g. in case of oversampling with trigger
  1464. * mode), the user must:
  1465. * 1. first clear the EOSMP flag if set with macro __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOSMP)
  1466. * 2. then enable the EOSMP interrupt with macro __HAL_ADC_ENABLE_IT(hadc, ADC_IT_EOSMP)
  1467. * before calling HAL_ADC_Start_IT().
  1468. * @param hadc ADC handle
  1469. * @retval HAL status
  1470. */
  1471. HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef *hadc)
  1472. {
  1473. HAL_StatusTypeDef tmp_hal_status;
  1474. #if defined(ADC_MULTIMODE_SUPPORT)
  1475. const ADC_TypeDef *tmpADC_Master;
  1476. uint32_t tmp_multimode_config = LL_ADC_GetMultimode(__LL_ADC_COMMON_INSTANCE(hadc->Instance));
  1477. #endif
  1478. /* Check the parameters */
  1479. assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  1480. /* Perform ADC enable and conversion start if no conversion is on going */
  1481. if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
  1482. {
  1483. /* Process locked */
  1484. __HAL_LOCK(hadc);
  1485. /* Enable the ADC peripheral */
  1486. tmp_hal_status = ADC_Enable(hadc);
  1487. /* Start conversion if ADC is effectively enabled */
  1488. if (tmp_hal_status == HAL_OK)
  1489. {
  1490. /* Set ADC state */
  1491. /* - Clear state bitfield related to regular group conversion results */
  1492. /* - Set state bitfield related to regular operation */
  1493. ADC_STATE_CLR_SET(hadc->State,
  1494. HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR | HAL_ADC_STATE_REG_EOSMP,
  1495. HAL_ADC_STATE_REG_BUSY);
  1496. #if defined(ADC_MULTIMODE_SUPPORT)
  1497. /* Reset HAL_ADC_STATE_MULTIMODE_SLAVE bit
  1498. - if ADC instance is master or if multimode feature is not available
  1499. - if multimode setting is disabled (ADC instance slave in independent mode) */
  1500. if ((__LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance) == hadc->Instance)
  1501. || (tmp_multimode_config == LL_ADC_MULTI_INDEPENDENT)
  1502. )
  1503. {
  1504. CLEAR_BIT(hadc->State, HAL_ADC_STATE_MULTIMODE_SLAVE);
  1505. }
  1506. #endif
  1507. /* Set ADC error code */
  1508. /* Check if a conversion is on going on ADC group injected */
  1509. if ((hadc->State & HAL_ADC_STATE_INJ_BUSY) != 0UL)
  1510. {
  1511. /* Reset ADC error code fields related to regular conversions only */
  1512. CLEAR_BIT(hadc->ErrorCode, (HAL_ADC_ERROR_OVR | HAL_ADC_ERROR_DMA));
  1513. }
  1514. else
  1515. {
  1516. /* Reset all ADC error code fields */
  1517. ADC_CLEAR_ERRORCODE(hadc);
  1518. }
  1519. /* Clear ADC group regular conversion flag and overrun flag */
  1520. /* (To ensure of no unknown state from potential previous ADC operations) */
  1521. __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR));
  1522. /* Process unlocked */
  1523. /* Unlock before starting ADC conversions: in case of potential */
  1524. /* interruption, to let the process to ADC IRQ Handler. */
  1525. __HAL_UNLOCK(hadc);
  1526. /* Disable all interruptions before enabling the desired ones */
  1527. __HAL_ADC_DISABLE_IT(hadc, (ADC_IT_EOC | ADC_IT_EOS | ADC_IT_OVR));
  1528. /* Enable ADC end of conversion interrupt */
  1529. switch (hadc->Init.EOCSelection)
  1530. {
  1531. case ADC_EOC_SEQ_CONV:
  1532. __HAL_ADC_ENABLE_IT(hadc, ADC_IT_EOS);
  1533. break;
  1534. /* case ADC_EOC_SINGLE_CONV */
  1535. default:
  1536. __HAL_ADC_ENABLE_IT(hadc, ADC_IT_EOC);
  1537. break;
  1538. }
  1539. /* Enable ADC overrun interrupt */
  1540. /* If hadc->Init.Overrun is set to ADC_OVR_DATA_PRESERVED, only then is
  1541. ADC_IT_OVR enabled; otherwise data overwrite is considered as normal
  1542. behavior and no CPU time is lost for a non-processed interruption */
  1543. if (hadc->Init.Overrun == ADC_OVR_DATA_PRESERVED)
  1544. {
  1545. __HAL_ADC_ENABLE_IT(hadc, ADC_IT_OVR);
  1546. }
  1547. /* Enable conversion of regular group. */
  1548. /* If software start has been selected, conversion starts immediately. */
  1549. /* If external trigger has been selected, conversion will start at next */
  1550. /* trigger event. */
  1551. /* Case of multimode enabled (when multimode feature is available): */
  1552. /* - if ADC is slave and dual regular conversions are enabled, ADC is */
  1553. /* enabled only (conversion is not started), */
  1554. /* - if ADC is master, ADC is enabled and conversion is started. */
  1555. #if defined(ADC_MULTIMODE_SUPPORT)
  1556. if ((__LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance) == hadc->Instance)
  1557. || (tmp_multimode_config == LL_ADC_MULTI_INDEPENDENT)
  1558. || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_SIMULT)
  1559. || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_ALTERN)
  1560. )
  1561. {
  1562. /* ADC instance is not a multimode slave instance with multimode regular conversions enabled */
  1563. if (READ_BIT(hadc->Instance->CFGR, ADC_CFGR_JAUTO) != 0UL)
  1564. {
  1565. ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY);
  1566. /* Enable as well injected interruptions in case
  1567. HAL_ADCEx_InjectedStart_IT() has not been called beforehand. This
  1568. allows to start regular and injected conversions when JAUTO is
  1569. set with a single call to HAL_ADC_Start_IT() */
  1570. switch (hadc->Init.EOCSelection)
  1571. {
  1572. case ADC_EOC_SEQ_CONV:
  1573. __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOC);
  1574. __HAL_ADC_ENABLE_IT(hadc, ADC_IT_JEOS);
  1575. break;
  1576. /* case ADC_EOC_SINGLE_CONV */
  1577. default:
  1578. __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOS);
  1579. __HAL_ADC_ENABLE_IT(hadc, ADC_IT_JEOC);
  1580. break;
  1581. }
  1582. }
  1583. /* Start ADC group regular conversion */
  1584. LL_ADC_REG_StartConversion(hadc->Instance);
  1585. }
  1586. else
  1587. {
  1588. /* ADC instance is a multimode slave instance with multimode regular conversions enabled */
  1589. SET_BIT(hadc->State, HAL_ADC_STATE_MULTIMODE_SLAVE);
  1590. /* if Master ADC JAUTO bit is set, Slave injected interruptions
  1591. are enabled nevertheless (for same reason as above) */
  1592. tmpADC_Master = __LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance);
  1593. if (READ_BIT(tmpADC_Master->CFGR, ADC_CFGR_JAUTO) != 0UL)
  1594. {
  1595. /* First, update Slave State in setting HAL_ADC_STATE_INJ_BUSY bit
  1596. and in resetting HAL_ADC_STATE_INJ_EOC bit */
  1597. ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY);
  1598. /* Next, set Slave injected interruptions */
  1599. switch (hadc->Init.EOCSelection)
  1600. {
  1601. case ADC_EOC_SEQ_CONV:
  1602. __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOC);
  1603. __HAL_ADC_ENABLE_IT(hadc, ADC_IT_JEOS);
  1604. break;
  1605. /* case ADC_EOC_SINGLE_CONV */
  1606. default:
  1607. __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOS);
  1608. __HAL_ADC_ENABLE_IT(hadc, ADC_IT_JEOC);
  1609. break;
  1610. }
  1611. }
  1612. }
  1613. #else
  1614. /* ADC instance is not a multimode slave instance with multimode regular conversions enabled */
  1615. if (READ_BIT(hadc->Instance->CFGR, ADC_CFGR_JAUTO) != 0UL)
  1616. {
  1617. ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY);
  1618. /* Enable as well injected interruptions in case
  1619. HAL_ADCEx_InjectedStart_IT() has not been called beforehand. This
  1620. allows to start regular and injected conversions when JAUTO is
  1621. set with a single call to HAL_ADC_Start_IT() */
  1622. switch (hadc->Init.EOCSelection)
  1623. {
  1624. case ADC_EOC_SEQ_CONV:
  1625. __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOC);
  1626. __HAL_ADC_ENABLE_IT(hadc, ADC_IT_JEOS);
  1627. break;
  1628. /* case ADC_EOC_SINGLE_CONV */
  1629. default:
  1630. __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOS);
  1631. __HAL_ADC_ENABLE_IT(hadc, ADC_IT_JEOC);
  1632. break;
  1633. }
  1634. }
  1635. /* Start ADC group regular conversion */
  1636. LL_ADC_REG_StartConversion(hadc->Instance);
  1637. #endif
  1638. }
  1639. else
  1640. {
  1641. /* Process unlocked */
  1642. __HAL_UNLOCK(hadc);
  1643. }
  1644. }
  1645. else
  1646. {
  1647. tmp_hal_status = HAL_BUSY;
  1648. }
  1649. /* Return function status */
  1650. return tmp_hal_status;
  1651. }
  1652. /**
  1653. * @brief Stop ADC conversion of regular group (and injected group in
  1654. * case of auto_injection mode), disable interrution of
  1655. * end-of-conversion, disable ADC peripheral.
  1656. * @param hadc ADC handle
  1657. * @retval HAL status.
  1658. */
  1659. HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef *hadc)
  1660. {
  1661. HAL_StatusTypeDef tmp_hal_status;
  1662. /* Check the parameters */
  1663. assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  1664. /* Process locked */
  1665. __HAL_LOCK(hadc);
  1666. /* 1. Stop potential conversion on going, on ADC groups regular and injected */
  1667. tmp_hal_status = ADC_ConversionStop(hadc, ADC_REGULAR_INJECTED_GROUP);
  1668. /* Disable ADC peripheral if conversions are effectively stopped */
  1669. if (tmp_hal_status == HAL_OK)
  1670. {
  1671. /* Disable ADC end of conversion interrupt for regular group */
  1672. /* Disable ADC overrun interrupt */
  1673. __HAL_ADC_DISABLE_IT(hadc, (ADC_IT_EOC | ADC_IT_EOS | ADC_IT_OVR));
  1674. /* 2. Disable the ADC peripheral */
  1675. tmp_hal_status = ADC_Disable(hadc);
  1676. /* Check if ADC is effectively disabled */
  1677. if (tmp_hal_status == HAL_OK)
  1678. {
  1679. /* Set ADC state */
  1680. ADC_STATE_CLR_SET(hadc->State,
  1681. HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY,
  1682. HAL_ADC_STATE_READY);
  1683. }
  1684. }
  1685. /* Process unlocked */
  1686. __HAL_UNLOCK(hadc);
  1687. /* Return function status */
  1688. return tmp_hal_status;
  1689. }
  1690. /**
  1691. * @brief Enable ADC, start conversion of regular group and transfer result through DMA.
  1692. * @note Interruptions enabled in this function:
  1693. * overrun (if applicable), DMA half transfer, DMA transfer complete.
  1694. * Each of these interruptions has its dedicated callback function.
  1695. * @note Case of multimode enabled (when multimode feature is available): HAL_ADC_Start_DMA()
  1696. * is designed for single-ADC mode only. For multimode, the dedicated
  1697. * HAL_ADCEx_MultiModeStart_DMA() function must be used.
  1698. * @param hadc ADC handle
  1699. * @param pData Destination Buffer address.
  1700. * @param Length Number of data to be transferred from ADC peripheral to memory
  1701. * @retval HAL status.
  1702. */
  1703. HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef *hadc, uint32_t *pData, uint32_t Length)
  1704. {
  1705. HAL_StatusTypeDef tmp_hal_status;
  1706. #if defined(ADC_MULTIMODE_SUPPORT)
  1707. uint32_t tmp_multimode_config = LL_ADC_GetMultimode(__LL_ADC_COMMON_INSTANCE(hadc->Instance));
  1708. #endif
  1709. /* Check the parameters */
  1710. assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  1711. /* Perform ADC enable and conversion start if no conversion is on going */
  1712. if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
  1713. {
  1714. /* Process locked */
  1715. __HAL_LOCK(hadc);
  1716. #if defined(ADC_MULTIMODE_SUPPORT)
  1717. /* Ensure that multimode regular conversions are not enabled. */
  1718. /* Otherwise, dedicated API HAL_ADCEx_MultiModeStart_DMA() must be used. */
  1719. if ((ADC_IS_INDEPENDENT(hadc) != RESET)
  1720. || (tmp_multimode_config == LL_ADC_MULTI_INDEPENDENT)
  1721. || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_SIMULT)
  1722. || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_ALTERN)
  1723. )
  1724. #endif /* ADC_MULTIMODE_SUPPORT */
  1725. {
  1726. /* Enable the ADC peripheral */
  1727. tmp_hal_status = ADC_Enable(hadc);
  1728. /* Start conversion if ADC is effectively enabled */
  1729. if (tmp_hal_status == HAL_OK)
  1730. {
  1731. /* Set ADC state */
  1732. /* - Clear state bitfield related to regular group conversion results */
  1733. /* - Set state bitfield related to regular operation */
  1734. ADC_STATE_CLR_SET(hadc->State,
  1735. HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR | HAL_ADC_STATE_REG_EOSMP,
  1736. HAL_ADC_STATE_REG_BUSY);
  1737. #if defined(ADC_MULTIMODE_SUPPORT)
  1738. /* Reset HAL_ADC_STATE_MULTIMODE_SLAVE bit
  1739. - if ADC instance is master or if multimode feature is not available
  1740. - if multimode setting is disabled (ADC instance slave in independent mode) */
  1741. if ((__LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance) == hadc->Instance)
  1742. || (tmp_multimode_config == LL_ADC_MULTI_INDEPENDENT)
  1743. )
  1744. {
  1745. CLEAR_BIT(hadc->State, HAL_ADC_STATE_MULTIMODE_SLAVE);
  1746. }
  1747. #endif
  1748. /* Check if a conversion is on going on ADC group injected */
  1749. if ((hadc->State & HAL_ADC_STATE_INJ_BUSY) != 0UL)
  1750. {
  1751. /* Reset ADC error code fields related to regular conversions only */
  1752. CLEAR_BIT(hadc->ErrorCode, (HAL_ADC_ERROR_OVR | HAL_ADC_ERROR_DMA));
  1753. }
  1754. else
  1755. {
  1756. /* Reset all ADC error code fields */
  1757. ADC_CLEAR_ERRORCODE(hadc);
  1758. }
  1759. /* Set the DMA transfer complete callback */
  1760. hadc->DMA_Handle->XferCpltCallback = ADC_DMAConvCplt;
  1761. /* Set the DMA half transfer complete callback */
  1762. hadc->DMA_Handle->XferHalfCpltCallback = ADC_DMAHalfConvCplt;
  1763. /* Set the DMA error callback */
  1764. hadc->DMA_Handle->XferErrorCallback = ADC_DMAError;
  1765. /* Manage ADC and DMA start: ADC overrun interruption, DMA start, */
  1766. /* ADC start (in case of SW start): */
  1767. /* Clear regular group conversion flag and overrun flag */
  1768. /* (To ensure of no unknown state from potential previous ADC */
  1769. /* operations) */
  1770. __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR));
  1771. /* Process unlocked */
  1772. /* Unlock before starting ADC conversions: in case of potential */
  1773. /* interruption, to let the process to ADC IRQ Handler. */
  1774. __HAL_UNLOCK(hadc);
  1775. /* With DMA, overrun event is always considered as an error even if
  1776. hadc->Init.Overrun is set to ADC_OVR_DATA_OVERWRITTEN. Therefore,
  1777. ADC_IT_OVR is enabled. */
  1778. __HAL_ADC_ENABLE_IT(hadc, ADC_IT_OVR);
  1779. /* Enable ADC DMA mode */
  1780. SET_BIT(hadc->Instance->CFGR, ADC_CFGR_DMAEN);
  1781. /* Start the DMA channel */
  1782. tmp_hal_status = HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&hadc->Instance->DR, (uint32_t)pData, Length);
  1783. /* Enable conversion of regular group. */
  1784. /* If software start has been selected, conversion starts immediately. */
  1785. /* If external trigger has been selected, conversion will start at next */
  1786. /* trigger event. */
  1787. /* Start ADC group regular conversion */
  1788. LL_ADC_REG_StartConversion(hadc->Instance);
  1789. }
  1790. else
  1791. {
  1792. /* Process unlocked */
  1793. __HAL_UNLOCK(hadc);
  1794. }
  1795. }
  1796. #if defined(ADC_MULTIMODE_SUPPORT)
  1797. else
  1798. {
  1799. tmp_hal_status = HAL_ERROR;
  1800. /* Process unlocked */
  1801. __HAL_UNLOCK(hadc);
  1802. }
  1803. #endif
  1804. }
  1805. else
  1806. {
  1807. tmp_hal_status = HAL_BUSY;
  1808. }
  1809. /* Return function status */
  1810. return tmp_hal_status;
  1811. }
  1812. /**
  1813. * @brief Stop ADC conversion of regular group (and injected group in
  1814. * case of auto_injection mode), disable ADC DMA transfer, disable
  1815. * ADC peripheral.
  1816. * @note: ADC peripheral disable is forcing stop of potential
  1817. * conversion on ADC group injected. If ADC group injected is under use, it
  1818. * should be preliminarily stopped using HAL_ADCEx_InjectedStop function.
  1819. * @note Case of multimode enabled (when multimode feature is available):
  1820. * HAL_ADC_Stop_DMA() function is dedicated to single-ADC mode only.
  1821. * For multimode, the dedicated HAL_ADCEx_MultiModeStop_DMA() API must be used.
  1822. * @param hadc ADC handle
  1823. * @retval HAL status.
  1824. */
  1825. HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef *hadc)
  1826. {
  1827. HAL_StatusTypeDef tmp_hal_status;
  1828. /* Check the parameters */
  1829. assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  1830. /* Process locked */
  1831. __HAL_LOCK(hadc);
  1832. /* 1. Stop potential ADC group regular conversion on going */
  1833. tmp_hal_status = ADC_ConversionStop(hadc, ADC_REGULAR_INJECTED_GROUP);
  1834. /* Disable ADC peripheral if conversions are effectively stopped */
  1835. if (tmp_hal_status == HAL_OK)
  1836. {
  1837. /* Disable ADC DMA (ADC DMA configuration of continuous requests is kept) */
  1838. CLEAR_BIT(hadc->Instance->CFGR, ADC_CFGR_DMAEN);
  1839. /* Disable the DMA channel (in case of DMA in circular mode or stop */
  1840. /* while DMA transfer is on going) */
  1841. if (hadc->DMA_Handle->State == HAL_DMA_STATE_BUSY)
  1842. {
  1843. tmp_hal_status = HAL_DMA_Abort(hadc->DMA_Handle);
  1844. /* Check if DMA channel effectively disabled */
  1845. if (tmp_hal_status != HAL_OK)
  1846. {
  1847. /* Update ADC state machine to error */
  1848. SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_DMA);
  1849. }
  1850. }
  1851. /* Disable ADC overrun interrupt */
  1852. __HAL_ADC_DISABLE_IT(hadc, ADC_IT_OVR);
  1853. /* 2. Disable the ADC peripheral */
  1854. /* Update "tmp_hal_status" only if DMA channel disabling passed, */
  1855. /* to keep in memory a potential failing status. */
  1856. if (tmp_hal_status == HAL_OK)
  1857. {
  1858. tmp_hal_status = ADC_Disable(hadc);
  1859. }
  1860. else
  1861. {
  1862. (void)ADC_Disable(hadc);
  1863. }
  1864. /* Check if ADC is effectively disabled */
  1865. if (tmp_hal_status == HAL_OK)
  1866. {
  1867. /* Set ADC state */
  1868. ADC_STATE_CLR_SET(hadc->State,
  1869. HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY,
  1870. HAL_ADC_STATE_READY);
  1871. }
  1872. }
  1873. /* Process unlocked */
  1874. __HAL_UNLOCK(hadc);
  1875. /* Return function status */
  1876. return tmp_hal_status;
  1877. }
  1878. /**
  1879. * @brief Get ADC regular group conversion result.
  1880. * @note Reading register DR automatically clears ADC flag EOC
  1881. * (ADC group regular end of unitary conversion).
  1882. * @note This function does not clear ADC flag EOS
  1883. * (ADC group regular end of sequence conversion).
  1884. * Occurrence of flag EOS rising:
  1885. * - If sequencer is composed of 1 rank, flag EOS is equivalent
  1886. * to flag EOC.
  1887. * - If sequencer is composed of several ranks, during the scan
  1888. * sequence flag EOC only is raised, at the end of the scan sequence
  1889. * both flags EOC and EOS are raised.
  1890. * To clear this flag, either use function:
  1891. * in programming model IT: @ref HAL_ADC_IRQHandler(), in programming
  1892. * model polling: @ref HAL_ADC_PollForConversion()
  1893. * or @ref __HAL_ADC_CLEAR_FLAG(&hadc, ADC_FLAG_EOS).
  1894. * @param hadc ADC handle
  1895. * @retval ADC group regular conversion data
  1896. */
  1897. uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef *hadc)
  1898. {
  1899. /* Check the parameters */
  1900. assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  1901. /* Note: EOC flag is not cleared here by software because automatically */
  1902. /* cleared by hardware when reading register DR. */
  1903. /* Return ADC converted value */
  1904. return hadc->Instance->DR;
  1905. }
  1906. /**
  1907. * @brief Handle ADC interrupt request.
  1908. * @param hadc ADC handle
  1909. * @retval None
  1910. */
  1911. void HAL_ADC_IRQHandler(ADC_HandleTypeDef *hadc)
  1912. {
  1913. uint32_t overrun_error = 0UL; /* flag set if overrun occurrence has to be considered as an error */
  1914. uint32_t tmp_isr = hadc->Instance->ISR;
  1915. uint32_t tmp_ier = hadc->Instance->IER;
  1916. uint32_t tmp_adc_inj_is_trigger_source_sw_start;
  1917. uint32_t tmp_adc_reg_is_trigger_source_sw_start;
  1918. uint32_t tmp_cfgr;
  1919. #if defined(ADC_MULTIMODE_SUPPORT)
  1920. const ADC_TypeDef *tmpADC_Master;
  1921. uint32_t tmp_multimode_config = LL_ADC_GetMultimode(__LL_ADC_COMMON_INSTANCE(hadc->Instance));
  1922. #endif
  1923. /* Check the parameters */
  1924. assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  1925. assert_param(IS_ADC_EOC_SELECTION(hadc->Init.EOCSelection));
  1926. /* ========== Check End of Sampling flag for ADC group regular ========== */
  1927. if (((tmp_isr & ADC_FLAG_EOSMP) == ADC_FLAG_EOSMP) && ((tmp_ier & ADC_IT_EOSMP) == ADC_IT_EOSMP))
  1928. {
  1929. /* Update state machine on end of sampling status if not in error state */
  1930. if ((hadc->State & HAL_ADC_STATE_ERROR_INTERNAL) == 0UL)
  1931. {
  1932. /* Set ADC state */
  1933. SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOSMP);
  1934. }
  1935. /* End Of Sampling callback */
  1936. #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
  1937. hadc->EndOfSamplingCallback(hadc);
  1938. #else
  1939. HAL_ADCEx_EndOfSamplingCallback(hadc);
  1940. #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
  1941. /* Clear regular group conversion flag */
  1942. __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOSMP);
  1943. }
  1944. /* ====== Check ADC group regular end of unitary conversion sequence conversions ===== */
  1945. if ((((tmp_isr & ADC_FLAG_EOC) == ADC_FLAG_EOC) && ((tmp_ier & ADC_IT_EOC) == ADC_IT_EOC)) ||
  1946. (((tmp_isr & ADC_FLAG_EOS) == ADC_FLAG_EOS) && ((tmp_ier & ADC_IT_EOS) == ADC_IT_EOS)))
  1947. {
  1948. /* Update state machine on conversion status if not in error state */
  1949. if ((hadc->State & HAL_ADC_STATE_ERROR_INTERNAL) == 0UL)
  1950. {
  1951. /* Set ADC state */
  1952. SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
  1953. }
  1954. /* Determine whether any further conversion upcoming on group regular */
  1955. /* by external trigger, continuous mode or scan sequence on going */
  1956. /* to disable interruption. */
  1957. if (LL_ADC_REG_IsTriggerSourceSWStart(hadc->Instance) != 0UL)
  1958. {
  1959. /* Get relevant register CFGR in ADC instance of ADC master or slave */
  1960. /* in function of multimode state (for devices with multimode */
  1961. /* available). */
  1962. #if defined(ADC_MULTIMODE_SUPPORT)
  1963. if ((__LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance) == hadc->Instance)
  1964. || (tmp_multimode_config == LL_ADC_MULTI_INDEPENDENT)
  1965. || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_SIMULT)
  1966. || (tmp_multimode_config == LL_ADC_MULTI_DUAL_INJ_ALTERN)
  1967. )
  1968. {
  1969. /* check CONT bit directly in handle ADC CFGR register */
  1970. tmp_cfgr = READ_REG(hadc->Instance->CFGR);
  1971. }
  1972. else
  1973. {
  1974. /* else need to check Master ADC CONT bit */
  1975. tmpADC_Master = __LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance);
  1976. tmp_cfgr = READ_REG(tmpADC_Master->CFGR);
  1977. }
  1978. #else
  1979. tmp_cfgr = READ_REG(hadc->Instance->CFGR);
  1980. #endif
  1981. /* Carry on if continuous mode is disabled */
  1982. if (READ_BIT(tmp_cfgr, ADC_CFGR_CONT) != ADC_CFGR_CONT)
  1983. {
  1984. /* If End of Sequence is reached, disable interrupts */
  1985. if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOS))
  1986. {
  1987. /* Allowed to modify bits ADC_IT_EOC/ADC_IT_EOS only if bit */
  1988. /* ADSTART==0 (no conversion on going) */
  1989. if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
  1990. {
  1991. /* Disable ADC end of sequence conversion interrupt */
  1992. /* Note: Overrun interrupt was enabled with EOC interrupt in */
  1993. /* HAL_Start_IT(), but is not disabled here because can be used */
  1994. /* by overrun IRQ process below. */
  1995. __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC | ADC_IT_EOS);
  1996. /* Set ADC state */
  1997. CLEAR_BIT(hadc->State, HAL_ADC_STATE_REG_BUSY);
  1998. if ((hadc->State & HAL_ADC_STATE_INJ_BUSY) == 0UL)
  1999. {
  2000. SET_BIT(hadc->State, HAL_ADC_STATE_READY);
  2001. }
  2002. }
  2003. else
  2004. {
  2005. /* Change ADC state to error state */
  2006. SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
  2007. /* Set ADC error code to ADC peripheral internal error */
  2008. SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
  2009. }
  2010. }
  2011. }
  2012. }
  2013. /* Conversion complete callback */
  2014. /* Note: Into callback function "HAL_ADC_ConvCpltCallback()", */
  2015. /* to determine if conversion has been triggered from EOC or EOS, */
  2016. /* possibility to use: */
  2017. /* " if ( __HAL_ADC_GET_FLAG(&hadc, ADC_FLAG_EOS)) " */
  2018. #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
  2019. hadc->ConvCpltCallback(hadc);
  2020. #else
  2021. HAL_ADC_ConvCpltCallback(hadc);
  2022. #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
  2023. /* Clear regular group conversion flag */
  2024. /* Note: in case of overrun set to ADC_OVR_DATA_PRESERVED, end of */
  2025. /* conversion flags clear induces the release of the preserved data.*/
  2026. /* Therefore, if the preserved data value is needed, it must be */
  2027. /* read preliminarily into HAL_ADC_ConvCpltCallback(). */
  2028. __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS));
  2029. }
  2030. /* ====== Check ADC group injected end of unitary conversion sequence conversions ===== */
  2031. if ((((tmp_isr & ADC_FLAG_JEOC) == ADC_FLAG_JEOC) && ((tmp_ier & ADC_IT_JEOC) == ADC_IT_JEOC)) ||
  2032. (((tmp_isr & ADC_FLAG_JEOS) == ADC_FLAG_JEOS) && ((tmp_ier & ADC_IT_JEOS) == ADC_IT_JEOS)))
  2033. {
  2034. /* Update state machine on conversion status if not in error state */
  2035. if ((hadc->State & HAL_ADC_STATE_ERROR_INTERNAL) == 0UL)
  2036. {
  2037. /* Set ADC state */
  2038. SET_BIT(hadc->State, HAL_ADC_STATE_INJ_EOC);
  2039. }
  2040. /* Retrieve ADC configuration */
  2041. tmp_adc_inj_is_trigger_source_sw_start = LL_ADC_INJ_IsTriggerSourceSWStart(hadc->Instance);
  2042. tmp_adc_reg_is_trigger_source_sw_start = LL_ADC_REG_IsTriggerSourceSWStart(hadc->Instance);
  2043. /* Get relevant register CFGR in ADC instance of ADC master or slave */
  2044. /* in function of multimode state (for devices with multimode */
  2045. /* available). */
  2046. #if defined(ADC_MULTIMODE_SUPPORT)
  2047. if ((__LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance) == hadc->Instance)
  2048. || (tmp_multimode_config == LL_ADC_MULTI_INDEPENDENT)
  2049. || (tmp_multimode_config == LL_ADC_MULTI_DUAL_REG_SIMULT)
  2050. || (tmp_multimode_config == LL_ADC_MULTI_DUAL_REG_INTERL)
  2051. )
  2052. {
  2053. tmp_cfgr = READ_REG(hadc->Instance->CFGR);
  2054. }
  2055. else
  2056. {
  2057. tmpADC_Master = __LL_ADC_MULTI_INSTANCE_MASTER(hadc->Instance);
  2058. tmp_cfgr = READ_REG(tmpADC_Master->CFGR);
  2059. }
  2060. #else
  2061. tmp_cfgr = READ_REG(hadc->Instance->CFGR);
  2062. #endif
  2063. /* Disable interruption if no further conversion upcoming by injected */
  2064. /* external trigger or by automatic injected conversion with regular */
  2065. /* group having no further conversion upcoming (same conditions as */
  2066. /* regular group interruption disabling above), */
  2067. /* and if injected scan sequence is completed. */
  2068. if (tmp_adc_inj_is_trigger_source_sw_start != 0UL)
  2069. {
  2070. if ((READ_BIT(tmp_cfgr, ADC_CFGR_JAUTO) == 0UL) ||
  2071. ((tmp_adc_reg_is_trigger_source_sw_start != 0UL) &&
  2072. (READ_BIT(tmp_cfgr, ADC_CFGR_CONT) == 0UL)))
  2073. {
  2074. /* If End of Sequence is reached, disable interrupts */
  2075. if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_JEOS))
  2076. {
  2077. /* Particular case if injected contexts queue is enabled: */
  2078. /* when the last context has been fully processed, JSQR is reset */
  2079. /* by the hardware. Even if no injected conversion is planned to come */
  2080. /* (queue empty, triggers are ignored), it can start again */
  2081. /* immediately after setting a new context (JADSTART is still set). */
  2082. /* Therefore, state of HAL ADC injected group is kept to busy. */
  2083. if (READ_BIT(tmp_cfgr, ADC_CFGR_JQM) == 0UL)
  2084. {
  2085. /* Allowed to modify bits ADC_IT_JEOC/ADC_IT_JEOS only if bit */
  2086. /* JADSTART==0 (no conversion on going) */
  2087. if (LL_ADC_INJ_IsConversionOngoing(hadc->Instance) == 0UL)
  2088. {
  2089. /* Disable ADC end of sequence conversion interrupt */
  2090. __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOC | ADC_IT_JEOS);
  2091. /* Set ADC state */
  2092. CLEAR_BIT(hadc->State, HAL_ADC_STATE_INJ_BUSY);
  2093. if ((hadc->State & HAL_ADC_STATE_REG_BUSY) == 0UL)
  2094. {
  2095. SET_BIT(hadc->State, HAL_ADC_STATE_READY);
  2096. }
  2097. }
  2098. else
  2099. {
  2100. /* Update ADC state machine to error */
  2101. SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
  2102. /* Set ADC error code to ADC peripheral internal error */
  2103. SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
  2104. }
  2105. }
  2106. }
  2107. }
  2108. }
  2109. /* Injected Conversion complete callback */
  2110. /* Note: HAL_ADCEx_InjectedConvCpltCallback can resort to
  2111. if (__HAL_ADC_GET_FLAG(&hadc, ADC_FLAG_JEOS)) or
  2112. if (__HAL_ADC_GET_FLAG(&hadc, ADC_FLAG_JEOC)) to determine whether
  2113. interruption has been triggered by end of conversion or end of
  2114. sequence. */
  2115. #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
  2116. hadc->InjectedConvCpltCallback(hadc);
  2117. #else
  2118. HAL_ADCEx_InjectedConvCpltCallback(hadc);
  2119. #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
  2120. /* Clear injected group conversion flag */
  2121. __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JEOC | ADC_FLAG_JEOS);
  2122. }
  2123. /* ========== Check Analog watchdog 1 flag ========== */
  2124. if (((tmp_isr & ADC_FLAG_AWD1) == ADC_FLAG_AWD1) && ((tmp_ier & ADC_IT_AWD1) == ADC_IT_AWD1))
  2125. {
  2126. /* Set ADC state */
  2127. SET_BIT(hadc->State, HAL_ADC_STATE_AWD1);
  2128. /* Level out of window 1 callback */
  2129. #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
  2130. hadc->LevelOutOfWindowCallback(hadc);
  2131. #else
  2132. HAL_ADC_LevelOutOfWindowCallback(hadc);
  2133. #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
  2134. /* Clear ADC analog watchdog flag */
  2135. __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD1);
  2136. }
  2137. /* ========== Check analog watchdog 2 flag ========== */
  2138. if (((tmp_isr & ADC_FLAG_AWD2) == ADC_FLAG_AWD2) && ((tmp_ier & ADC_IT_AWD2) == ADC_IT_AWD2))
  2139. {
  2140. /* Set ADC state */
  2141. SET_BIT(hadc->State, HAL_ADC_STATE_AWD2);
  2142. /* Level out of window 2 callback */
  2143. #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
  2144. hadc->LevelOutOfWindow2Callback(hadc);
  2145. #else
  2146. HAL_ADCEx_LevelOutOfWindow2Callback(hadc);
  2147. #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
  2148. /* Clear ADC analog watchdog flag */
  2149. __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD2);
  2150. }
  2151. /* ========== Check analog watchdog 3 flag ========== */
  2152. if (((tmp_isr & ADC_FLAG_AWD3) == ADC_FLAG_AWD3) && ((tmp_ier & ADC_IT_AWD3) == ADC_IT_AWD3))
  2153. {
  2154. /* Set ADC state */
  2155. SET_BIT(hadc->State, HAL_ADC_STATE_AWD3);
  2156. /* Level out of window 3 callback */
  2157. #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
  2158. hadc->LevelOutOfWindow3Callback(hadc);
  2159. #else
  2160. HAL_ADCEx_LevelOutOfWindow3Callback(hadc);
  2161. #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
  2162. /* Clear ADC analog watchdog flag */
  2163. __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD3);
  2164. }
  2165. /* ========== Check Overrun flag ========== */
  2166. if (((tmp_isr & ADC_FLAG_OVR) == ADC_FLAG_OVR) && ((tmp_ier & ADC_IT_OVR) == ADC_IT_OVR))
  2167. {
  2168. /* If overrun is set to overwrite previous data (default setting), */
  2169. /* overrun event is not considered as an error. */
  2170. /* (cf ref manual "Managing conversions without using the DMA and without */
  2171. /* overrun ") */
  2172. /* Exception for usage with DMA overrun event always considered as an */
  2173. /* error. */
  2174. if (hadc->Init.Overrun == ADC_OVR_DATA_PRESERVED)
  2175. {
  2176. overrun_error = 1UL;
  2177. }
  2178. else
  2179. {
  2180. /* Check DMA configuration */
  2181. #if defined(ADC_MULTIMODE_SUPPORT)
  2182. if (tmp_multimode_config != LL_ADC_MULTI_INDEPENDENT)
  2183. {
  2184. /* Multimode (when feature is available) is enabled,
  2185. Common Control Register MDMA bits must be checked. */
  2186. if (LL_ADC_GetMultiDMATransfer(__LL_ADC_COMMON_INSTANCE(hadc->Instance)) != LL_ADC_MULTI_REG_DMA_EACH_ADC)
  2187. {
  2188. overrun_error = 1UL;
  2189. }
  2190. }
  2191. else
  2192. #endif
  2193. {
  2194. /* Multimode not set or feature not available or ADC independent */
  2195. if ((hadc->Instance->CFGR & ADC_CFGR_DMAEN) != 0UL)
  2196. {
  2197. overrun_error = 1UL;
  2198. }
  2199. }
  2200. }
  2201. if (overrun_error == 1UL)
  2202. {
  2203. /* Change ADC state to error state */
  2204. SET_BIT(hadc->State, HAL_ADC_STATE_REG_OVR);
  2205. /* Set ADC error code to overrun */
  2206. SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_OVR);
  2207. /* Error callback */
  2208. /* Note: In case of overrun, ADC conversion data is preserved until */
  2209. /* flag OVR is reset. */
  2210. /* Therefore, old ADC conversion data can be retrieved in */
  2211. /* function "HAL_ADC_ErrorCallback()". */
  2212. #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
  2213. hadc->ErrorCallback(hadc);
  2214. #else
  2215. HAL_ADC_ErrorCallback(hadc);
  2216. #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
  2217. }
  2218. /* Clear ADC overrun flag */
  2219. __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
  2220. }
  2221. /* ========== Check Injected context queue overflow flag ========== */
  2222. if (((tmp_isr & ADC_FLAG_JQOVF) == ADC_FLAG_JQOVF) && ((tmp_ier & ADC_IT_JQOVF) == ADC_IT_JQOVF))
  2223. {
  2224. /* Change ADC state to overrun state */
  2225. SET_BIT(hadc->State, HAL_ADC_STATE_INJ_JQOVF);
  2226. /* Set ADC error code to Injected context queue overflow */
  2227. SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_JQOVF);
  2228. /* Clear the Injected context queue overflow flag */
  2229. __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JQOVF);
  2230. /* Injected context queue overflow callback */
  2231. #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
  2232. hadc->InjectedQueueOverflowCallback(hadc);
  2233. #else
  2234. HAL_ADCEx_InjectedQueueOverflowCallback(hadc);
  2235. #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
  2236. }
  2237. }
  2238. /**
  2239. * @brief Conversion complete callback in non-blocking mode.
  2240. * @param hadc ADC handle
  2241. * @retval None
  2242. */
  2243. __weak void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
  2244. {
  2245. /* Prevent unused argument(s) compilation warning */
  2246. UNUSED(hadc);
  2247. /* NOTE : This function should not be modified. When the callback is needed,
  2248. function HAL_ADC_ConvCpltCallback must be implemented in the user file.
  2249. */
  2250. }
  2251. /**
  2252. * @brief Conversion DMA half-transfer callback in non-blocking mode.
  2253. * @param hadc ADC handle
  2254. * @retval None
  2255. */
  2256. __weak void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef *hadc)
  2257. {
  2258. /* Prevent unused argument(s) compilation warning */
  2259. UNUSED(hadc);
  2260. /* NOTE : This function should not be modified. When the callback is needed,
  2261. function HAL_ADC_ConvHalfCpltCallback must be implemented in the user file.
  2262. */
  2263. }
  2264. /**
  2265. * @brief Analog watchdog 1 callback in non-blocking mode.
  2266. * @param hadc ADC handle
  2267. * @retval None
  2268. */
  2269. __weak void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef *hadc)
  2270. {
  2271. /* Prevent unused argument(s) compilation warning */
  2272. UNUSED(hadc);
  2273. /* NOTE : This function should not be modified. When the callback is needed,
  2274. function HAL_ADC_LevelOutOfWindowCallback must be implemented in the user file.
  2275. */
  2276. }
  2277. /**
  2278. * @brief ADC error callback in non-blocking mode
  2279. * (ADC conversion with interruption or transfer by DMA).
  2280. * @note In case of error due to overrun when using ADC with DMA transfer
  2281. * (HAL ADC handle parameter "ErrorCode" to state "HAL_ADC_ERROR_OVR"):
  2282. * - Reinitialize the DMA using function "HAL_ADC_Stop_DMA()".
  2283. * - If needed, restart a new ADC conversion using function
  2284. * "HAL_ADC_Start_DMA()"
  2285. * (this function is also clearing overrun flag)
  2286. * @param hadc ADC handle
  2287. * @retval None
  2288. */
  2289. __weak void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc)
  2290. {
  2291. /* Prevent unused argument(s) compilation warning */
  2292. UNUSED(hadc);
  2293. /* NOTE : This function should not be modified. When the callback is needed,
  2294. function HAL_ADC_ErrorCallback must be implemented in the user file.
  2295. */
  2296. }
  2297. /**
  2298. * @}
  2299. */
  2300. /** @defgroup ADC_Exported_Functions_Group3 Peripheral Control functions
  2301. * @brief Peripheral Control functions
  2302. *
  2303. @verbatim
  2304. ===============================================================================
  2305. ##### Peripheral Control functions #####
  2306. ===============================================================================
  2307. [..] This section provides functions allowing to:
  2308. (+) Configure channels on regular group
  2309. (+) Configure the analog watchdog
  2310. @endverbatim
  2311. * @{
  2312. */
  2313. /**
  2314. * @brief Configure a channel to be assigned to ADC group regular.
  2315. * @note In case of usage of internal measurement channels:
  2316. * Vbat/VrefInt/TempSensor.
  2317. * These internal paths can be disabled using function
  2318. * HAL_ADC_DeInit().
  2319. * @note Possibility to update parameters on the fly:
  2320. * This function initializes channel into ADC group regular,
  2321. * following calls to this function can be used to reconfigure
  2322. * some parameters of structure "ADC_ChannelConfTypeDef" on the fly,
  2323. * without resetting the ADC.
  2324. * The setting of these parameters is conditioned to ADC state:
  2325. * Refer to comments of structure "ADC_ChannelConfTypeDef".
  2326. * @param hadc ADC handle
  2327. * @param sConfig Structure of ADC channel assigned to ADC group regular.
  2328. * @retval HAL status
  2329. */
  2330. HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef *hadc, ADC_ChannelConfTypeDef *sConfig)
  2331. {
  2332. HAL_StatusTypeDef tmp_hal_status = HAL_OK;
  2333. uint32_t tmpOffsetShifted;
  2334. uint32_t tmp_config_internal_channel;
  2335. __IO uint32_t wait_loop_index = 0UL;
  2336. uint32_t tmp_adc_is_conversion_on_going_regular;
  2337. uint32_t tmp_adc_is_conversion_on_going_injected;
  2338. /* Check the parameters */
  2339. assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  2340. assert_param(IS_ADC_REGULAR_RANK(sConfig->Rank));
  2341. assert_param(IS_ADC_SAMPLE_TIME(sConfig->SamplingTime));
  2342. assert_param(IS_ADC_SINGLE_DIFFERENTIAL(sConfig->SingleDiff));
  2343. assert_param(IS_ADC_OFFSET_NUMBER(sConfig->OffsetNumber));
  2344. assert_param(IS_ADC_RANGE(ADC_GET_RESOLUTION(hadc), sConfig->Offset));
  2345. /* if ROVSE is set, the value of the OFFSETy_EN bit in ADCx_OFRy register is
  2346. ignored (considered as reset) */
  2347. assert_param(!((sConfig->OffsetNumber != ADC_OFFSET_NONE) && (hadc->Init.OversamplingMode == ENABLE)));
  2348. /* Verification of channel number */
  2349. if (sConfig->SingleDiff != ADC_DIFFERENTIAL_ENDED)
  2350. {
  2351. assert_param(IS_ADC_CHANNEL(hadc, sConfig->Channel));
  2352. }
  2353. else
  2354. {
  2355. assert_param(IS_ADC_DIFF_CHANNEL(hadc, sConfig->Channel));
  2356. }
  2357. /* Process locked */
  2358. __HAL_LOCK(hadc);
  2359. /* Parameters update conditioned to ADC state: */
  2360. /* Parameters that can be updated when ADC is disabled or enabled without */
  2361. /* conversion on going on regular group: */
  2362. /* - Channel number */
  2363. /* - Channel rank */
  2364. if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
  2365. {
  2366. #if !defined (USE_FULL_ASSERT)
  2367. /* Correspondence for compatibility with legacy definition of */
  2368. /* sequencer ranks in direct number format. This correspondence can */
  2369. /* be done only on ranks 1 to 5 due to literal values. */
  2370. /* Note: Sequencer ranks in direct number format are no more used */
  2371. /* and are detected by activating USE_FULL_ASSERT feature. */
  2372. if (sConfig->Rank <= 5U)
  2373. {
  2374. switch (sConfig->Rank)
  2375. {
  2376. case 2U:
  2377. sConfig->Rank = ADC_REGULAR_RANK_2;
  2378. break;
  2379. case 3U:
  2380. sConfig->Rank = ADC_REGULAR_RANK_3;
  2381. break;
  2382. case 4U:
  2383. sConfig->Rank = ADC_REGULAR_RANK_4;
  2384. break;
  2385. case 5U:
  2386. sConfig->Rank = ADC_REGULAR_RANK_5;
  2387. break;
  2388. /* case 1U */
  2389. default:
  2390. sConfig->Rank = ADC_REGULAR_RANK_1;
  2391. break;
  2392. }
  2393. }
  2394. #endif
  2395. /* Set ADC group regular sequence: channel on the selected scan sequence rank */
  2396. LL_ADC_REG_SetSequencerRanks(hadc->Instance, sConfig->Rank, sConfig->Channel);
  2397. /* Parameters update conditioned to ADC state: */
  2398. /* Parameters that can be updated when ADC is disabled or enabled without */
  2399. /* conversion on going on regular group: */
  2400. /* - Channel sampling time */
  2401. /* - Channel offset */
  2402. tmp_adc_is_conversion_on_going_regular = LL_ADC_REG_IsConversionOngoing(hadc->Instance);
  2403. tmp_adc_is_conversion_on_going_injected = LL_ADC_INJ_IsConversionOngoing(hadc->Instance);
  2404. if ((tmp_adc_is_conversion_on_going_regular == 0UL)
  2405. && (tmp_adc_is_conversion_on_going_injected == 0UL)
  2406. )
  2407. {
  2408. #if defined(ADC_SMPR1_SMPPLUS)
  2409. /* Manage specific case of sampling time 3.5 cycles replacing 2.5 cyles */
  2410. if (sConfig->SamplingTime == ADC_SAMPLETIME_3CYCLES_5)
  2411. {
  2412. /* Set sampling time of the selected ADC channel */
  2413. LL_ADC_SetChannelSamplingTime(hadc->Instance, sConfig->Channel, LL_ADC_SAMPLINGTIME_2CYCLES_5);
  2414. /* Set ADC sampling time common configuration */
  2415. LL_ADC_SetSamplingTimeCommonConfig(hadc->Instance, LL_ADC_SAMPLINGTIME_COMMON_3C5_REPL_2C5);
  2416. }
  2417. else
  2418. {
  2419. /* Set sampling time of the selected ADC channel */
  2420. LL_ADC_SetChannelSamplingTime(hadc->Instance, sConfig->Channel, sConfig->SamplingTime);
  2421. /* Set ADC sampling time common configuration */
  2422. LL_ADC_SetSamplingTimeCommonConfig(hadc->Instance, LL_ADC_SAMPLINGTIME_COMMON_DEFAULT);
  2423. }
  2424. #else
  2425. /* Set sampling time of the selected ADC channel */
  2426. LL_ADC_SetChannelSamplingTime(hadc->Instance, sConfig->Channel, sConfig->SamplingTime);
  2427. #endif
  2428. /* Configure the offset: offset enable/disable, channel, offset value */
  2429. /* Shift the offset with respect to the selected ADC resolution. */
  2430. /* Offset has to be left-aligned on bit 11, the LSB (right bits) are set to 0 */
  2431. tmpOffsetShifted = ADC_OFFSET_SHIFT_RESOLUTION(hadc, (uint32_t)sConfig->Offset);
  2432. if (sConfig->OffsetNumber != ADC_OFFSET_NONE)
  2433. {
  2434. /* Set ADC selected offset number */
  2435. LL_ADC_SetOffset(hadc->Instance, sConfig->OffsetNumber, sConfig->Channel, tmpOffsetShifted);
  2436. }
  2437. else
  2438. {
  2439. /* Scan each offset register to check if the selected channel is targeted. */
  2440. /* If this is the case, the corresponding offset number is disabled. */
  2441. if (__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_GetOffsetChannel(hadc->Instance, LL_ADC_OFFSET_1))
  2442. == __LL_ADC_CHANNEL_TO_DECIMAL_NB(sConfig->Channel))
  2443. {
  2444. LL_ADC_SetOffsetState(hadc->Instance, LL_ADC_OFFSET_1, LL_ADC_OFFSET_DISABLE);
  2445. }
  2446. if (__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_GetOffsetChannel(hadc->Instance, LL_ADC_OFFSET_2))
  2447. == __LL_ADC_CHANNEL_TO_DECIMAL_NB(sConfig->Channel))
  2448. {
  2449. LL_ADC_SetOffsetState(hadc->Instance, LL_ADC_OFFSET_2, LL_ADC_OFFSET_DISABLE);
  2450. }
  2451. if (__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_GetOffsetChannel(hadc->Instance, LL_ADC_OFFSET_3))
  2452. == __LL_ADC_CHANNEL_TO_DECIMAL_NB(sConfig->Channel))
  2453. {
  2454. LL_ADC_SetOffsetState(hadc->Instance, LL_ADC_OFFSET_3, LL_ADC_OFFSET_DISABLE);
  2455. }
  2456. if (__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_GetOffsetChannel(hadc->Instance, LL_ADC_OFFSET_4))
  2457. == __LL_ADC_CHANNEL_TO_DECIMAL_NB(sConfig->Channel))
  2458. {
  2459. LL_ADC_SetOffsetState(hadc->Instance, LL_ADC_OFFSET_4, LL_ADC_OFFSET_DISABLE);
  2460. }
  2461. }
  2462. }
  2463. /* Parameters update conditioned to ADC state: */
  2464. /* Parameters that can be updated only when ADC is disabled: */
  2465. /* - Single or differential mode */
  2466. if (LL_ADC_IsEnabled(hadc->Instance) == 0UL)
  2467. {
  2468. /* Set mode single-ended or differential input of the selected ADC channel */
  2469. LL_ADC_SetChannelSingleDiff(hadc->Instance, sConfig->Channel, sConfig->SingleDiff);
  2470. /* Configuration of differential mode */
  2471. if (sConfig->SingleDiff == ADC_DIFFERENTIAL_ENDED)
  2472. {
  2473. /* Set sampling time of the selected ADC channel */
  2474. /* Note: ADC channel number masked with value "0x1F" to ensure shift value within 32 bits range */
  2475. LL_ADC_SetChannelSamplingTime(hadc->Instance,
  2476. (uint32_t)(__LL_ADC_DECIMAL_NB_TO_CHANNEL((__LL_ADC_CHANNEL_TO_DECIMAL_NB((uint32_t)sConfig->Channel) + 1UL) & 0x1FUL)),
  2477. sConfig->SamplingTime);
  2478. }
  2479. }
  2480. /* Management of internal measurement channels: Vbat/VrefInt/TempSensor. */
  2481. /* If internal channel selected, enable dedicated internal buffers and */
  2482. /* paths. */
  2483. /* Note: these internal measurement paths can be disabled using */
  2484. /* HAL_ADC_DeInit(). */
  2485. if (__LL_ADC_IS_CHANNEL_INTERNAL(sConfig->Channel))
  2486. {
  2487. tmp_config_internal_channel = LL_ADC_GetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance));
  2488. /* If the requested internal measurement path has already been enabled, */
  2489. /* bypass the configuration processing. */
  2490. if ((sConfig->Channel == ADC_CHANNEL_TEMPSENSOR)
  2491. && ((tmp_config_internal_channel & LL_ADC_PATH_INTERNAL_TEMPSENSOR) == 0UL))
  2492. {
  2493. if (ADC_TEMPERATURE_SENSOR_INSTANCE(hadc))
  2494. {
  2495. LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance),
  2496. LL_ADC_PATH_INTERNAL_TEMPSENSOR | tmp_config_internal_channel);
  2497. /* Delay for temperature sensor stabilization time */
  2498. /* Wait loop initialization and execution */
  2499. /* Note: Variable divided by 2 to compensate partially */
  2500. /* CPU processing cycles, scaling in us split to not */
  2501. /* exceed 32 bits register capacity and handle low frequency. */
  2502. wait_loop_index = ((LL_ADC_DELAY_TEMPSENSOR_STAB_US / 10UL) * ((SystemCoreClock / (100000UL * 2UL)) + 1UL));
  2503. while (wait_loop_index != 0UL)
  2504. {
  2505. wait_loop_index--;
  2506. }
  2507. }
  2508. }
  2509. else if ((sConfig->Channel == ADC_CHANNEL_VBAT) && ((tmp_config_internal_channel & LL_ADC_PATH_INTERNAL_VBAT) == 0UL))
  2510. {
  2511. if (ADC_BATTERY_VOLTAGE_INSTANCE(hadc))
  2512. {
  2513. LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance),
  2514. LL_ADC_PATH_INTERNAL_VBAT | tmp_config_internal_channel);
  2515. }
  2516. }
  2517. else if ((sConfig->Channel == ADC_CHANNEL_VREFINT)
  2518. && ((tmp_config_internal_channel & LL_ADC_PATH_INTERNAL_VREFINT) == 0UL))
  2519. {
  2520. if (ADC_VREFINT_INSTANCE(hadc))
  2521. {
  2522. LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance),
  2523. LL_ADC_PATH_INTERNAL_VREFINT | tmp_config_internal_channel);
  2524. }
  2525. }
  2526. else
  2527. {
  2528. /* nothing to do */
  2529. }
  2530. }
  2531. }
  2532. /* If a conversion is on going on regular group, no update on regular */
  2533. /* channel could be done on neither of the channel configuration structure */
  2534. /* parameters. */
  2535. else
  2536. {
  2537. /* Update ADC state machine to error */
  2538. SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
  2539. tmp_hal_status = HAL_ERROR;
  2540. }
  2541. /* Process unlocked */
  2542. __HAL_UNLOCK(hadc);
  2543. /* Return function status */
  2544. return tmp_hal_status;
  2545. }
  2546. /**
  2547. * @brief Configure the analog watchdog.
  2548. * @note Possibility to update parameters on the fly:
  2549. * This function initializes the selected analog watchdog, successive
  2550. * calls to this function can be used to reconfigure some parameters
  2551. * of structure "ADC_AnalogWDGConfTypeDef" on the fly, without resetting
  2552. * the ADC.
  2553. * The setting of these parameters is conditioned to ADC state.
  2554. * For parameters constraints, see comments of structure
  2555. * "ADC_AnalogWDGConfTypeDef".
  2556. * @note On this STM32 series, analog watchdog thresholds cannot be modified
  2557. * while ADC conversion is on going.
  2558. * @param hadc ADC handle
  2559. * @param AnalogWDGConfig Structure of ADC analog watchdog configuration
  2560. * @retval HAL status
  2561. */
  2562. HAL_StatusTypeDef HAL_ADC_AnalogWDGConfig(ADC_HandleTypeDef *hadc, ADC_AnalogWDGConfTypeDef *AnalogWDGConfig)
  2563. {
  2564. HAL_StatusTypeDef tmp_hal_status = HAL_OK;
  2565. uint32_t tmpAWDHighThresholdShifted;
  2566. uint32_t tmpAWDLowThresholdShifted;
  2567. uint32_t tmp_adc_is_conversion_on_going_regular;
  2568. uint32_t tmp_adc_is_conversion_on_going_injected;
  2569. /* Check the parameters */
  2570. assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  2571. assert_param(IS_ADC_ANALOG_WATCHDOG_NUMBER(AnalogWDGConfig->WatchdogNumber));
  2572. assert_param(IS_ADC_ANALOG_WATCHDOG_MODE(AnalogWDGConfig->WatchdogMode));
  2573. assert_param(IS_FUNCTIONAL_STATE(AnalogWDGConfig->ITMode));
  2574. if ((AnalogWDGConfig->WatchdogMode == ADC_ANALOGWATCHDOG_SINGLE_REG) ||
  2575. (AnalogWDGConfig->WatchdogMode == ADC_ANALOGWATCHDOG_SINGLE_INJEC) ||
  2576. (AnalogWDGConfig->WatchdogMode == ADC_ANALOGWATCHDOG_SINGLE_REGINJEC))
  2577. {
  2578. assert_param(IS_ADC_CHANNEL(hadc, AnalogWDGConfig->Channel));
  2579. }
  2580. /* Verify thresholds range */
  2581. if (hadc->Init.OversamplingMode == ENABLE)
  2582. {
  2583. /* Case of oversampling enabled: depending on ratio and shift configuration,
  2584. analog watchdog thresholds can be higher than ADC resolution.
  2585. Verify if thresholds are within maximum thresholds range. */
  2586. assert_param(IS_ADC_RANGE(ADC_RESOLUTION_12B, AnalogWDGConfig->HighThreshold));
  2587. assert_param(IS_ADC_RANGE(ADC_RESOLUTION_12B, AnalogWDGConfig->LowThreshold));
  2588. }
  2589. else
  2590. {
  2591. /* Verify if thresholds are within the selected ADC resolution */
  2592. assert_param(IS_ADC_RANGE(ADC_GET_RESOLUTION(hadc), AnalogWDGConfig->HighThreshold));
  2593. assert_param(IS_ADC_RANGE(ADC_GET_RESOLUTION(hadc), AnalogWDGConfig->LowThreshold));
  2594. }
  2595. /* Process locked */
  2596. __HAL_LOCK(hadc);
  2597. /* Parameters update conditioned to ADC state: */
  2598. /* Parameters that can be updated when ADC is disabled or enabled without */
  2599. /* conversion on going on ADC groups regular and injected: */
  2600. /* - Analog watchdog channels */
  2601. /* - Analog watchdog thresholds */
  2602. tmp_adc_is_conversion_on_going_regular = LL_ADC_REG_IsConversionOngoing(hadc->Instance);
  2603. tmp_adc_is_conversion_on_going_injected = LL_ADC_INJ_IsConversionOngoing(hadc->Instance);
  2604. if ((tmp_adc_is_conversion_on_going_regular == 0UL)
  2605. && (tmp_adc_is_conversion_on_going_injected == 0UL)
  2606. )
  2607. {
  2608. /* Analog watchdog configuration */
  2609. if (AnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_1)
  2610. {
  2611. /* Configuration of analog watchdog: */
  2612. /* - Set the analog watchdog enable mode: one or overall group of */
  2613. /* channels, on groups regular and-or injected. */
  2614. switch (AnalogWDGConfig->WatchdogMode)
  2615. {
  2616. case ADC_ANALOGWATCHDOG_SINGLE_REG:
  2617. LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, LL_ADC_AWD1, __LL_ADC_ANALOGWD_CHANNEL_GROUP(AnalogWDGConfig->Channel,
  2618. LL_ADC_GROUP_REGULAR));
  2619. break;
  2620. case ADC_ANALOGWATCHDOG_SINGLE_INJEC:
  2621. LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, LL_ADC_AWD1, __LL_ADC_ANALOGWD_CHANNEL_GROUP(AnalogWDGConfig->Channel,
  2622. LL_ADC_GROUP_INJECTED));
  2623. break;
  2624. case ADC_ANALOGWATCHDOG_SINGLE_REGINJEC:
  2625. LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, LL_ADC_AWD1, __LL_ADC_ANALOGWD_CHANNEL_GROUP(AnalogWDGConfig->Channel,
  2626. LL_ADC_GROUP_REGULAR_INJECTED));
  2627. break;
  2628. case ADC_ANALOGWATCHDOG_ALL_REG:
  2629. LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, LL_ADC_AWD1, LL_ADC_AWD_ALL_CHANNELS_REG);
  2630. break;
  2631. case ADC_ANALOGWATCHDOG_ALL_INJEC:
  2632. LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, LL_ADC_AWD1, LL_ADC_AWD_ALL_CHANNELS_INJ);
  2633. break;
  2634. case ADC_ANALOGWATCHDOG_ALL_REGINJEC:
  2635. LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, LL_ADC_AWD1, LL_ADC_AWD_ALL_CHANNELS_REG_INJ);
  2636. break;
  2637. default: /* ADC_ANALOGWATCHDOG_NONE */
  2638. LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, LL_ADC_AWD1, LL_ADC_AWD_DISABLE);
  2639. break;
  2640. }
  2641. /* Shift the offset in function of the selected ADC resolution: */
  2642. /* Thresholds have to be left-aligned on bit 11, the LSB (right bits) */
  2643. /* are set to 0 */
  2644. tmpAWDHighThresholdShifted = ADC_AWD1THRESHOLD_SHIFT_RESOLUTION(hadc, AnalogWDGConfig->HighThreshold);
  2645. tmpAWDLowThresholdShifted = ADC_AWD1THRESHOLD_SHIFT_RESOLUTION(hadc, AnalogWDGConfig->LowThreshold);
  2646. /* Set ADC analog watchdog thresholds value of both thresholds high and low */
  2647. LL_ADC_ConfigAnalogWDThresholds(hadc->Instance, AnalogWDGConfig->WatchdogNumber, tmpAWDHighThresholdShifted,
  2648. tmpAWDLowThresholdShifted);
  2649. /* Update state, clear previous result related to AWD1 */
  2650. CLEAR_BIT(hadc->State, HAL_ADC_STATE_AWD1);
  2651. /* Clear flag ADC analog watchdog */
  2652. /* Note: Flag cleared Clear the ADC Analog watchdog flag to be ready */
  2653. /* to use for HAL_ADC_IRQHandler() or HAL_ADC_PollForEvent() */
  2654. /* (in case left enabled by previous ADC operations). */
  2655. LL_ADC_ClearFlag_AWD1(hadc->Instance);
  2656. /* Configure ADC analog watchdog interrupt */
  2657. if (AnalogWDGConfig->ITMode == ENABLE)
  2658. {
  2659. LL_ADC_EnableIT_AWD1(hadc->Instance);
  2660. }
  2661. else
  2662. {
  2663. LL_ADC_DisableIT_AWD1(hadc->Instance);
  2664. }
  2665. }
  2666. /* Case of ADC_ANALOGWATCHDOG_2 or ADC_ANALOGWATCHDOG_3 */
  2667. else
  2668. {
  2669. switch (AnalogWDGConfig->WatchdogMode)
  2670. {
  2671. case ADC_ANALOGWATCHDOG_SINGLE_REG:
  2672. case ADC_ANALOGWATCHDOG_SINGLE_INJEC:
  2673. case ADC_ANALOGWATCHDOG_SINGLE_REGINJEC:
  2674. /* Update AWD by bitfield to keep the possibility to monitor */
  2675. /* several channels by successive calls of this function. */
  2676. if (AnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_2)
  2677. {
  2678. SET_BIT(hadc->Instance->AWD2CR, (1UL << (__LL_ADC_CHANNEL_TO_DECIMAL_NB(AnalogWDGConfig->Channel) & 0x1FUL)));
  2679. }
  2680. else
  2681. {
  2682. SET_BIT(hadc->Instance->AWD3CR, (1UL << (__LL_ADC_CHANNEL_TO_DECIMAL_NB(AnalogWDGConfig->Channel) & 0x1FUL)));
  2683. }
  2684. break;
  2685. case ADC_ANALOGWATCHDOG_ALL_REG:
  2686. case ADC_ANALOGWATCHDOG_ALL_INJEC:
  2687. case ADC_ANALOGWATCHDOG_ALL_REGINJEC:
  2688. LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, AnalogWDGConfig->WatchdogNumber, LL_ADC_AWD_ALL_CHANNELS_REG_INJ);
  2689. break;
  2690. default: /* ADC_ANALOGWATCHDOG_NONE */
  2691. LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, AnalogWDGConfig->WatchdogNumber, LL_ADC_AWD_DISABLE);
  2692. break;
  2693. }
  2694. /* Shift the thresholds in function of the selected ADC resolution */
  2695. /* have to be left-aligned on bit 7, the LSB (right bits) are set to 0 */
  2696. tmpAWDHighThresholdShifted = ADC_AWD23THRESHOLD_SHIFT_RESOLUTION(hadc, AnalogWDGConfig->HighThreshold);
  2697. tmpAWDLowThresholdShifted = ADC_AWD23THRESHOLD_SHIFT_RESOLUTION(hadc, AnalogWDGConfig->LowThreshold);
  2698. /* Set ADC analog watchdog thresholds value of both thresholds high and low */
  2699. LL_ADC_ConfigAnalogWDThresholds(hadc->Instance, AnalogWDGConfig->WatchdogNumber, tmpAWDHighThresholdShifted,
  2700. tmpAWDLowThresholdShifted);
  2701. if (AnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_2)
  2702. {
  2703. /* Update state, clear previous result related to AWD2 */
  2704. CLEAR_BIT(hadc->State, HAL_ADC_STATE_AWD2);
  2705. /* Clear flag ADC analog watchdog */
  2706. /* Note: Flag cleared Clear the ADC Analog watchdog flag to be ready */
  2707. /* to use for HAL_ADC_IRQHandler() or HAL_ADC_PollForEvent() */
  2708. /* (in case left enabled by previous ADC operations). */
  2709. LL_ADC_ClearFlag_AWD2(hadc->Instance);
  2710. /* Configure ADC analog watchdog interrupt */
  2711. if (AnalogWDGConfig->ITMode == ENABLE)
  2712. {
  2713. LL_ADC_EnableIT_AWD2(hadc->Instance);
  2714. }
  2715. else
  2716. {
  2717. LL_ADC_DisableIT_AWD2(hadc->Instance);
  2718. }
  2719. }
  2720. /* (AnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_3) */
  2721. else
  2722. {
  2723. /* Update state, clear previous result related to AWD3 */
  2724. CLEAR_BIT(hadc->State, HAL_ADC_STATE_AWD3);
  2725. /* Clear flag ADC analog watchdog */
  2726. /* Note: Flag cleared Clear the ADC Analog watchdog flag to be ready */
  2727. /* to use for HAL_ADC_IRQHandler() or HAL_ADC_PollForEvent() */
  2728. /* (in case left enabled by previous ADC operations). */
  2729. LL_ADC_ClearFlag_AWD3(hadc->Instance);
  2730. /* Configure ADC analog watchdog interrupt */
  2731. if (AnalogWDGConfig->ITMode == ENABLE)
  2732. {
  2733. LL_ADC_EnableIT_AWD3(hadc->Instance);
  2734. }
  2735. else
  2736. {
  2737. LL_ADC_DisableIT_AWD3(hadc->Instance);
  2738. }
  2739. }
  2740. }
  2741. }
  2742. /* If a conversion is on going on ADC group regular or injected, no update */
  2743. /* could be done on neither of the AWD configuration structure parameters. */
  2744. else
  2745. {
  2746. /* Update ADC state machine to error */
  2747. SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
  2748. tmp_hal_status = HAL_ERROR;
  2749. }
  2750. /* Process unlocked */
  2751. __HAL_UNLOCK(hadc);
  2752. /* Return function status */
  2753. return tmp_hal_status;
  2754. }
  2755. /**
  2756. * @}
  2757. */
  2758. /** @defgroup ADC_Exported_Functions_Group4 Peripheral State functions
  2759. * @brief ADC Peripheral State functions
  2760. *
  2761. @verbatim
  2762. ===============================================================================
  2763. ##### Peripheral state and errors functions #####
  2764. ===============================================================================
  2765. [..]
  2766. This subsection provides functions to get in run-time the status of the
  2767. peripheral.
  2768. (+) Check the ADC state
  2769. (+) Check the ADC error code
  2770. @endverbatim
  2771. * @{
  2772. */
  2773. /**
  2774. * @brief Return the ADC handle state.
  2775. * @note ADC state machine is managed by bitfields, ADC status must be
  2776. * compared with states bits.
  2777. * For example:
  2778. * " if ((HAL_ADC_GetState(hadc1) & HAL_ADC_STATE_REG_BUSY) != 0UL) "
  2779. * " if ((HAL_ADC_GetState(hadc1) & HAL_ADC_STATE_AWD1) != 0UL) "
  2780. * @param hadc ADC handle
  2781. * @retval ADC handle state (bitfield on 32 bits)
  2782. */
  2783. uint32_t HAL_ADC_GetState(ADC_HandleTypeDef *hadc)
  2784. {
  2785. /* Check the parameters */
  2786. assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  2787. /* Return ADC handle state */
  2788. return hadc->State;
  2789. }
  2790. /**
  2791. * @brief Return the ADC error code.
  2792. * @param hadc ADC handle
  2793. * @retval ADC error code (bitfield on 32 bits)
  2794. */
  2795. uint32_t HAL_ADC_GetError(ADC_HandleTypeDef *hadc)
  2796. {
  2797. /* Check the parameters */
  2798. assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  2799. return hadc->ErrorCode;
  2800. }
  2801. /**
  2802. * @}
  2803. */
  2804. /**
  2805. * @}
  2806. */
  2807. /** @defgroup ADC_Private_Functions ADC Private Functions
  2808. * @{
  2809. */
  2810. /**
  2811. * @brief Stop ADC conversion.
  2812. * @param hadc ADC handle
  2813. * @param ConversionGroup ADC group regular and/or injected.
  2814. * This parameter can be one of the following values:
  2815. * @arg @ref ADC_REGULAR_GROUP ADC regular conversion type.
  2816. * @arg @ref ADC_INJECTED_GROUP ADC injected conversion type.
  2817. * @arg @ref ADC_REGULAR_INJECTED_GROUP ADC regular and injected conversion type.
  2818. * @retval HAL status.
  2819. */
  2820. HAL_StatusTypeDef ADC_ConversionStop(ADC_HandleTypeDef *hadc, uint32_t ConversionGroup)
  2821. {
  2822. uint32_t tickstart;
  2823. uint32_t Conversion_Timeout_CPU_cycles = 0UL;
  2824. uint32_t conversion_group_reassigned = ConversionGroup;
  2825. uint32_t tmp_ADC_CR_ADSTART_JADSTART;
  2826. uint32_t tmp_adc_is_conversion_on_going_regular;
  2827. uint32_t tmp_adc_is_conversion_on_going_injected;
  2828. /* Check the parameters */
  2829. assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
  2830. assert_param(IS_ADC_CONVERSION_GROUP(ConversionGroup));
  2831. /* Verification if ADC is not already stopped (on regular and injected */
  2832. /* groups) to bypass this function if not needed. */
  2833. tmp_adc_is_conversion_on_going_regular = LL_ADC_REG_IsConversionOngoing(hadc->Instance);
  2834. tmp_adc_is_conversion_on_going_injected = LL_ADC_INJ_IsConversionOngoing(hadc->Instance);
  2835. if ((tmp_adc_is_conversion_on_going_regular != 0UL)
  2836. || (tmp_adc_is_conversion_on_going_injected != 0UL)
  2837. )
  2838. {
  2839. /* Particular case of continuous auto-injection mode combined with */
  2840. /* auto-delay mode. */
  2841. /* In auto-injection mode, regular group stop ADC_CR_ADSTP is used (not */
  2842. /* injected group stop ADC_CR_JADSTP). */
  2843. /* Procedure to be followed: Wait until JEOS=1, clear JEOS, set ADSTP=1 */
  2844. /* (see reference manual). */
  2845. if (((hadc->Instance->CFGR & ADC_CFGR_JAUTO) != 0UL)
  2846. && (hadc->Init.ContinuousConvMode == ENABLE)
  2847. && (hadc->Init.LowPowerAutoWait == ENABLE)
  2848. )
  2849. {
  2850. /* Use stop of regular group */
  2851. conversion_group_reassigned = ADC_REGULAR_GROUP;
  2852. /* Wait until JEOS=1 (maximum Timeout: 4 injected conversions) */
  2853. while (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_JEOS) == 0UL)
  2854. {
  2855. if (Conversion_Timeout_CPU_cycles >= (ADC_CONVERSION_TIME_MAX_CPU_CYCLES * 4UL))
  2856. {
  2857. /* Update ADC state machine to error */
  2858. SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
  2859. /* Set ADC error code to ADC peripheral internal error */
  2860. SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
  2861. return HAL_ERROR;
  2862. }
  2863. Conversion_Timeout_CPU_cycles ++;
  2864. }
  2865. /* Clear JEOS */
  2866. __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JEOS);
  2867. }
  2868. /* Stop potential conversion on going on ADC group regular */
  2869. if (conversion_group_reassigned != ADC_INJECTED_GROUP)
  2870. {
  2871. /* Software is allowed to set ADSTP only when ADSTART=1 and ADDIS=0 */
  2872. if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) != 0UL)
  2873. {
  2874. if (LL_ADC_IsDisableOngoing(hadc->Instance) == 0UL)
  2875. {
  2876. /* Stop ADC group regular conversion */
  2877. LL_ADC_REG_StopConversion(hadc->Instance);
  2878. }
  2879. }
  2880. }
  2881. /* Stop potential conversion on going on ADC group injected */
  2882. if (conversion_group_reassigned != ADC_REGULAR_GROUP)
  2883. {
  2884. /* Software is allowed to set JADSTP only when JADSTART=1 and ADDIS=0 */
  2885. if (LL_ADC_INJ_IsConversionOngoing(hadc->Instance) != 0UL)
  2886. {
  2887. if (LL_ADC_IsDisableOngoing(hadc->Instance) == 0UL)
  2888. {
  2889. /* Stop ADC group injected conversion */
  2890. LL_ADC_INJ_StopConversion(hadc->Instance);
  2891. }
  2892. }
  2893. }
  2894. /* Selection of start and stop bits with respect to the regular or injected group */
  2895. switch (conversion_group_reassigned)
  2896. {
  2897. case ADC_REGULAR_INJECTED_GROUP:
  2898. tmp_ADC_CR_ADSTART_JADSTART = (ADC_CR_ADSTART | ADC_CR_JADSTART);
  2899. break;
  2900. case ADC_INJECTED_GROUP:
  2901. tmp_ADC_CR_ADSTART_JADSTART = ADC_CR_JADSTART;
  2902. break;
  2903. /* Case ADC_REGULAR_GROUP only*/
  2904. default:
  2905. tmp_ADC_CR_ADSTART_JADSTART = ADC_CR_ADSTART;
  2906. break;
  2907. }
  2908. /* Wait for conversion effectively stopped */
  2909. tickstart = HAL_GetTick();
  2910. while ((hadc->Instance->CR & tmp_ADC_CR_ADSTART_JADSTART) != 0UL)
  2911. {
  2912. if ((HAL_GetTick() - tickstart) > ADC_STOP_CONVERSION_TIMEOUT)
  2913. {
  2914. /* New check to avoid false timeout detection in case of preemption */
  2915. if ((hadc->Instance->CR & tmp_ADC_CR_ADSTART_JADSTART) != 0UL)
  2916. {
  2917. /* Update ADC state machine to error */
  2918. SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
  2919. /* Set ADC error code to ADC peripheral internal error */
  2920. SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
  2921. return HAL_ERROR;
  2922. }
  2923. }
  2924. }
  2925. }
  2926. /* Return HAL status */
  2927. return HAL_OK;
  2928. }
  2929. /**
  2930. * @brief Enable the selected ADC.
  2931. * @note Prerequisite condition to use this function: ADC must be disabled
  2932. * and voltage regulator must be enabled (done into HAL_ADC_Init()).
  2933. * @param hadc ADC handle
  2934. * @retval HAL status.
  2935. */
  2936. HAL_StatusTypeDef ADC_Enable(ADC_HandleTypeDef *hadc)
  2937. {
  2938. uint32_t tickstart;
  2939. __IO uint32_t wait_loop_index = 0UL;
  2940. /* ADC enable and wait for ADC ready (in case of ADC is disabled or */
  2941. /* enabling phase not yet completed: flag ADC ready not yet set). */
  2942. /* Timeout implemented to not be stuck if ADC cannot be enabled (possible */
  2943. /* causes: ADC clock not running, ...). */
  2944. if (LL_ADC_IsEnabled(hadc->Instance) == 0UL)
  2945. {
  2946. /* Check if conditions to enable the ADC are fulfilled */
  2947. if ((hadc->Instance->CR & (ADC_CR_ADCAL | ADC_CR_JADSTP | ADC_CR_ADSTP | ADC_CR_JADSTART | ADC_CR_ADSTART
  2948. | ADC_CR_ADDIS | ADC_CR_ADEN)) != 0UL)
  2949. {
  2950. /* Update ADC state machine to error */
  2951. SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
  2952. /* Set ADC error code to ADC peripheral internal error */
  2953. SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
  2954. return HAL_ERROR;
  2955. }
  2956. /* Enable the ADC peripheral */
  2957. LL_ADC_Enable(hadc->Instance);
  2958. if((LL_ADC_GetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance)) & LL_ADC_PATH_INTERNAL_TEMPSENSOR) != 0UL)
  2959. {
  2960. /* Delay for temperature sensor buffer stabilization time */
  2961. /* Note: Value LL_ADC_DELAY_TEMPSENSOR_STAB_US used instead of */
  2962. /* LL_ADC_DELAY_TEMPSENSOR_BUFFER_STAB_US because needed */
  2963. /* in case of ADC enable after a system wake up */
  2964. /* from low power mode. */
  2965. /* Wait loop initialization and execution */
  2966. /* Note: Variable divided by 2 to compensate partially */
  2967. /* CPU processing cycles, scaling in us split to not */
  2968. /* exceed 32 bits register capacity and handle low frequency. */
  2969. wait_loop_index = ((LL_ADC_DELAY_TEMPSENSOR_STAB_US / 10UL) * ((SystemCoreClock / (100000UL * 2UL)) + 1UL));
  2970. while(wait_loop_index != 0UL)
  2971. {
  2972. wait_loop_index--;
  2973. }
  2974. }
  2975. /* Wait for ADC effectively enabled */
  2976. tickstart = HAL_GetTick();
  2977. while (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_RDY) == 0UL)
  2978. {
  2979. /* If ADEN bit is set less than 4 ADC clock cycles after the ADCAL bit
  2980. has been cleared (after a calibration), ADEN bit is reset by the
  2981. calibration logic.
  2982. The workaround is to continue setting ADEN until ADRDY is becomes 1.
  2983. Additionally, ADC_ENABLE_TIMEOUT is defined to encompass this
  2984. 4 ADC clock cycle duration */
  2985. /* Note: Test of ADC enabled required due to hardware constraint to */
  2986. /* not enable ADC if already enabled. */
  2987. if (LL_ADC_IsEnabled(hadc->Instance) == 0UL)
  2988. {
  2989. LL_ADC_Enable(hadc->Instance);
  2990. }
  2991. if ((HAL_GetTick() - tickstart) > ADC_ENABLE_TIMEOUT)
  2992. {
  2993. /* New check to avoid false timeout detection in case of preemption */
  2994. if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_RDY) == 0UL)
  2995. {
  2996. /* Update ADC state machine to error */
  2997. SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
  2998. /* Set ADC error code to ADC peripheral internal error */
  2999. SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
  3000. return HAL_ERROR;
  3001. }
  3002. }
  3003. }
  3004. }
  3005. /* Return HAL status */
  3006. return HAL_OK;
  3007. }
  3008. /**
  3009. * @brief Disable the selected ADC.
  3010. * @note Prerequisite condition to use this function: ADC conversions must be
  3011. * stopped.
  3012. * @param hadc ADC handle
  3013. * @retval HAL status.
  3014. */
  3015. HAL_StatusTypeDef ADC_Disable(ADC_HandleTypeDef *hadc)
  3016. {
  3017. uint32_t tickstart;
  3018. const uint32_t tmp_adc_is_disable_on_going = LL_ADC_IsDisableOngoing(hadc->Instance);
  3019. /* Verification if ADC is not already disabled: */
  3020. /* Note: forbidden to disable ADC (set bit ADC_CR_ADDIS) if ADC is already */
  3021. /* disabled. */
  3022. if ((LL_ADC_IsEnabled(hadc->Instance) != 0UL)
  3023. && (tmp_adc_is_disable_on_going == 0UL)
  3024. )
  3025. {
  3026. /* Check if conditions to disable the ADC are fulfilled */
  3027. if ((hadc->Instance->CR & (ADC_CR_JADSTART | ADC_CR_ADSTART | ADC_CR_ADEN)) == ADC_CR_ADEN)
  3028. {
  3029. /* Disable the ADC peripheral */
  3030. LL_ADC_Disable(hadc->Instance);
  3031. __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOSMP | ADC_FLAG_RDY));
  3032. }
  3033. else
  3034. {
  3035. /* Update ADC state machine to error */
  3036. SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
  3037. /* Set ADC error code to ADC peripheral internal error */
  3038. SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
  3039. return HAL_ERROR;
  3040. }
  3041. /* Wait for ADC effectively disabled */
  3042. /* Get tick count */
  3043. tickstart = HAL_GetTick();
  3044. while ((hadc->Instance->CR & ADC_CR_ADEN) != 0UL)
  3045. {
  3046. if ((HAL_GetTick() - tickstart) > ADC_DISABLE_TIMEOUT)
  3047. {
  3048. /* New check to avoid false timeout detection in case of preemption */
  3049. if ((hadc->Instance->CR & ADC_CR_ADEN) != 0UL)
  3050. {
  3051. /* Update ADC state machine to error */
  3052. SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
  3053. /* Set ADC error code to ADC peripheral internal error */
  3054. SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
  3055. return HAL_ERROR;
  3056. }
  3057. }
  3058. }
  3059. }
  3060. /* Return HAL status */
  3061. return HAL_OK;
  3062. }
  3063. /**
  3064. * @brief DMA transfer complete callback.
  3065. * @param hdma pointer to DMA handle.
  3066. * @retval None
  3067. */
  3068. void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma)
  3069. {
  3070. /* Retrieve ADC handle corresponding to current DMA handle */
  3071. ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
  3072. /* Update state machine on conversion status if not in error state */
  3073. if ((hadc->State & (HAL_ADC_STATE_ERROR_INTERNAL | HAL_ADC_STATE_ERROR_DMA)) == 0UL)
  3074. {
  3075. /* Set ADC state */
  3076. SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
  3077. /* Determine whether any further conversion upcoming on group regular */
  3078. /* by external trigger, continuous mode or scan sequence on going */
  3079. /* to disable interruption. */
  3080. /* Is it the end of the regular sequence ? */
  3081. if ((hadc->Instance->ISR & ADC_FLAG_EOS) != 0UL)
  3082. {
  3083. /* Are conversions software-triggered ? */
  3084. if (LL_ADC_REG_IsTriggerSourceSWStart(hadc->Instance) != 0UL)
  3085. {
  3086. /* Is CONT bit set ? */
  3087. if (READ_BIT(hadc->Instance->CFGR, ADC_CFGR_CONT) == 0UL)
  3088. {
  3089. /* CONT bit is not set, no more conversions expected */
  3090. CLEAR_BIT(hadc->State, HAL_ADC_STATE_REG_BUSY);
  3091. if ((hadc->State & HAL_ADC_STATE_INJ_BUSY) == 0UL)
  3092. {
  3093. SET_BIT(hadc->State, HAL_ADC_STATE_READY);
  3094. }
  3095. }
  3096. }
  3097. }
  3098. else
  3099. {
  3100. /* DMA End of Transfer interrupt was triggered but conversions sequence
  3101. is not over. If DMACFG is set to 0, conversions are stopped. */
  3102. if (READ_BIT(hadc->Instance->CFGR, ADC_CFGR_DMACFG) == 0UL)
  3103. {
  3104. /* DMACFG bit is not set, conversions are stopped. */
  3105. CLEAR_BIT(hadc->State, HAL_ADC_STATE_REG_BUSY);
  3106. if ((hadc->State & HAL_ADC_STATE_INJ_BUSY) == 0UL)
  3107. {
  3108. SET_BIT(hadc->State, HAL_ADC_STATE_READY);
  3109. }
  3110. }
  3111. }
  3112. /* Conversion complete callback */
  3113. #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
  3114. hadc->ConvCpltCallback(hadc);
  3115. #else
  3116. HAL_ADC_ConvCpltCallback(hadc);
  3117. #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
  3118. }
  3119. else /* DMA and-or internal error occurred */
  3120. {
  3121. if ((hadc->State & HAL_ADC_STATE_ERROR_INTERNAL) != 0UL)
  3122. {
  3123. /* Call HAL ADC Error Callback function */
  3124. #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
  3125. hadc->ErrorCallback(hadc);
  3126. #else
  3127. HAL_ADC_ErrorCallback(hadc);
  3128. #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
  3129. }
  3130. else
  3131. {
  3132. /* Call ADC DMA error callback */
  3133. hadc->DMA_Handle->XferErrorCallback(hdma);
  3134. }
  3135. }
  3136. }
  3137. /**
  3138. * @brief DMA half transfer complete callback.
  3139. * @param hdma pointer to DMA handle.
  3140. * @retval None
  3141. */
  3142. void ADC_DMAHalfConvCplt(DMA_HandleTypeDef *hdma)
  3143. {
  3144. /* Retrieve ADC handle corresponding to current DMA handle */
  3145. ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
  3146. /* Half conversion callback */
  3147. #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
  3148. hadc->ConvHalfCpltCallback(hadc);
  3149. #else
  3150. HAL_ADC_ConvHalfCpltCallback(hadc);
  3151. #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
  3152. }
  3153. /**
  3154. * @brief DMA error callback.
  3155. * @param hdma pointer to DMA handle.
  3156. * @retval None
  3157. */
  3158. void ADC_DMAError(DMA_HandleTypeDef *hdma)
  3159. {
  3160. /* Retrieve ADC handle corresponding to current DMA handle */
  3161. ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
  3162. /* Set ADC state */
  3163. SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_DMA);
  3164. /* Set ADC error code to DMA error */
  3165. SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_DMA);
  3166. /* Error callback */
  3167. #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
  3168. hadc->ErrorCallback(hadc);
  3169. #else
  3170. HAL_ADC_ErrorCallback(hadc);
  3171. #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
  3172. }
  3173. /**
  3174. * @}
  3175. */
  3176. #endif /* HAL_ADC_MODULE_ENABLED */
  3177. /**
  3178. * @}
  3179. */
  3180. /**
  3181. * @}
  3182. */