fm33lc0xx_fl_adc.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. /**
  2. ****************************************************************************************************
  3. * @file fm33lc0xx_fl_adc.c
  4. * @author FMSH Application Team
  5. * @brief Src file of ADC FL Module
  6. ****************************************************************************************************
  7. * @attention
  8. *
  9. * Copyright (c) [2019] [Fudan Microelectronics]
  10. * THIS SOFTWARE is licensed under the Mulan PSL v1.
  11. * can use this software according to the terms and conditions of the Mulan PSL v1.
  12. * You may obtain a copy of Mulan PSL v1 at:
  13. * http://license.coscl.org.cn/MulanPSL
  14. * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
  16. * PURPOSE.
  17. * See the Mulan PSL v1 for more details.
  18. *
  19. ****************************************************************************************************
  20. */
  21. /* Includes ------------------------------------------------------------------*/
  22. #include "fm33lc0xx_fl_adc.h"
  23. #include "fm33lc0xx_fl_rcc.h"
  24. #include "fm33lc0xx_fl_rmu.h"
  25. #include "fm33lc0xx_fl_svd.h"
  26. #include "fm33lc0xx_fl_vref.h"
  27. #include "fm33_assert.h"
  28. /** @addtogroup FM33LC0XX_FL_Driver
  29. * @{
  30. */
  31. /** @addtogroup ADC
  32. * @{
  33. */
  34. /* Private macros ------------------------------------------------------------*/
  35. /** @addtogroup ADC_FL_Private_Macros
  36. * @{
  37. */
  38. #define IS_FL_ADC_INSTANCE(INSTANCE) ((INSTANCE) == ADC)
  39. #define IS_FL_ADC_ADCCLK_SOURCE(__VALUE__) (((__VALUE__) == FL_RCC_ADC_CLK_SOURCE_RCMF_PSC)||\
  40. ((__VALUE__) == FL_RCC_ADC_CLK_SOURCE_RCHF)||\
  41. ((__VALUE__) == FL_RCC_ADC_CLK_SOURCE_XTHF)||\
  42. ((__VALUE__) == FL_RCC_ADC_CLK_SOURCE_PLL))
  43. #define IS_FL_ADC_ADCCLK_PRESCALER(__VALUE__) (((__VALUE__) == FL_RCC_ADC_PSC_DIV1)||\
  44. ((__VALUE__) == FL_RCC_ADC_PSC_DIV2)||\
  45. ((__VALUE__) == FL_RCC_ADC_PSC_DIV4)||\
  46. ((__VALUE__) == FL_RCC_ADC_PSC_DIV8)||\
  47. ((__VALUE__) == FL_RCC_ADC_PSC_DIV16)||\
  48. ((__VALUE__) == FL_RCC_ADC_PSC_DIV32))
  49. #define IS_FL_ADC_CONTINUOUSCONVMODE(__VALUE__) (((__VALUE__) == FL_ADC_CONV_MODE_SINGLE)||\
  50. ((__VALUE__) == FL_ADC_CONV_MODE_CONTINUOUS))
  51. #define IS_FL_ADC_AUTO_MODE(__VALUE__) (((__VALUE__) == FL_ADC_SINGLE_CONV_MODE_AUTO)||\
  52. ((__VALUE__) == FL_ADC_SINGLE_CONV_MODE_SEMIAUTO))
  53. #define IS_FL_ADC_SCANDIRECTION(__VALUE__) (((__VALUE__) == FL_ADC_SEQ_SCAN_DIR_FORWARD)||\
  54. ((__VALUE__) == FL_ADC_SEQ_SCAN_DIR_BACKWARD))
  55. #define IS_FL_ADC_EXTERNALTRIGCONV(__VALUE__) (((__VALUE__) == FL_ADC_TRIGGER_EDGE_NONE)||\
  56. ((__VALUE__) == FL_ADC_TRIGGER_EDGE_RISING)||\
  57. ((__VALUE__) == FL_ADC_TRIGGER_EDGE_FALLING)||\
  58. ((__VALUE__) == FL_ADC_TRIGGER_EDGE_BOTH))
  59. #define IS_FL_ADC_EXTERNALTRIGSOURCE(__VALUE__) (((__VALUE__) == FL_ADC_TRGI_PA8)||\
  60. ((__VALUE__) == FL_ADC_TRGI_PB9)||\
  61. ((__VALUE__) == FL_ADC_TRGI_ATIM)||\
  62. ((__VALUE__) == FL_ADC_TRGI_GPTIM0)||\
  63. ((__VALUE__) == FL_ADC_TRGI_GPTIM1)||\
  64. ((__VALUE__) == FL_ADC_TRGI_RTC)||\
  65. ((__VALUE__) == FL_ADC_TRGI_BSTIM1)||\
  66. ((__VALUE__) == FL_ADC_TRGI_COMP1)||\
  67. ((__VALUE__) == FL_ADC_TRGI_COMP2))
  68. #define IS_FL_ADC_CHANNEL_FAST_TIME(__VALUE__) (((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_4_ADCCLK)||\
  69. ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_6_ADCCLK)||\
  70. ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_9_ADCCLK)||\
  71. ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_10_ADCCLK)||\
  72. ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_16_ADCCLK)||\
  73. ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_24_ADCCLK)||\
  74. ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_32_ADCCLK)||\
  75. ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_48_ADCCLK)||\
  76. ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_96_ADCCLK)||\
  77. ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_128_ADCCLK)||\
  78. ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_192_ADCCLK)||\
  79. ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_256_ADCCLK)||\
  80. ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_384_ADCCLK)||\
  81. ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_SOFTWARE_CONTROL))
  82. #define IS_FL_ADC_CHANNEL_SLOW_TIME(__VALUE__) (((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_4_ADCCLK)||\
  83. ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_6_ADCCLK)||\
  84. ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_9_ADCCLK)||\
  85. ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_10_ADCCLK)||\
  86. ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_16_ADCCLK)||\
  87. ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_24_ADCCLK)||\
  88. ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_32_ADCCLK)||\
  89. ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_48_ADCCLK)||\
  90. ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_96_ADCCLK)||\
  91. ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_128_ADCCLK)||\
  92. ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_192_ADCCLK)||\
  93. ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_256_ADCCLK)||\
  94. ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_384_ADCCLK)||\
  95. ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_SOFTWARE_CONTROL))
  96. #define IS_FL_ADC_OVERSAMPCOFIG(__VALUE__) (((__VALUE__) == FL_DISABLE)||\
  97. ((__VALUE__) == FL_ENABLE))
  98. #define IS_FL_ADC_OVERSAMPINGRATIO(__VALUE__) (((__VALUE__) == FL_ADC_OVERSAMPLING_MUL_2X)||\
  99. ((__VALUE__) == FL_ADC_OVERSAMPLING_MUL_4X)||\
  100. ((__VALUE__) == FL_ADC_OVERSAMPLING_MUL_8X)||\
  101. ((__VALUE__) == FL_ADC_OVERSAMPLING_MUL_16X)||\
  102. ((__VALUE__) == FL_ADC_OVERSAMPLING_MUL_32X)||\
  103. ((__VALUE__) == FL_ADC_OVERSAMPLING_MUL_64X)||\
  104. ((__VALUE__) == FL_ADC_OVERSAMPLING_MUL_128X)||\
  105. ((__VALUE__) == FL_ADC_OVERSAMPLING_MUL_256X))
  106. #define IS_FL_ADC_OVERSAMPINGSHIFT(__VALUE__) (((__VALUE__) == FL_ADC_OVERSAMPLING_SHIFT_0B)||\
  107. ((__VALUE__) == FL_ADC_OVERSAMPLING_SHIFT_1B)||\
  108. ((__VALUE__) == FL_ADC_OVERSAMPLING_SHIFT_2B)||\
  109. ((__VALUE__) == FL_ADC_OVERSAMPLING_SHIFT_3B)||\
  110. ((__VALUE__) == FL_ADC_OVERSAMPLING_SHIFT_4B)||\
  111. ((__VALUE__) == FL_ADC_OVERSAMPLING_SHIFT_5B)||\
  112. ((__VALUE__) == FL_ADC_OVERSAMPLING_SHIFT_6B)||\
  113. ((__VALUE__) == FL_ADC_OVERSAMPLING_SHIFT_7B)||\
  114. ((__VALUE__) == FL_ADC_OVERSAMPLING_SHIFT_8B))
  115. #define ADC_CALIBRATIN_TIME_OUT (500000)
  116. /**
  117. * @}
  118. */
  119. /** @addtogroup ADC_FL_EF_Init
  120. * @{
  121. */
  122. /**
  123. * @brief ADC外设寄存器值为复位值
  124. * @param 外设入口地址
  125. * @retval 返回错误状态,可能值:
  126. * -FL_PASS 外设寄存器值恢复复位值
  127. * -FL_FAIL 未成功执行
  128. */
  129. FL_ErrorStatus FL_ADC_CommonDeInit(void)
  130. {
  131. /* 关闭总线时钟 */
  132. FL_RCC_DisableGroup2BusClock(FL_RCC_GROUP2_BUSCLK_ADC);
  133. /* 关闭操作时钟 */
  134. FL_RCC_DisableGroup2OperationClock(FL_RCC_GROUP2_OPCLK_ADC);
  135. return FL_PASS;
  136. }
  137. /**
  138. * @brief ADC共用寄存器设置以配置外设工作时钟
  139. *
  140. * @note 其中LL_LPTIM_OPERATION_MODE_EXTERNAL_ASYN_PAUSE_CNT 模式需要外部脉冲提供给LPTIM模块作为工作时钟,此时
  141. * LPTIM完全工作在异步模式下。
  142. * @param LPTIM 外设入口地址
  143. * @param LPTIM_InitStruct指向LL_LPTIM_TimeInitTypeDef类的结构体,它包含指定LPTIM外设的配置信息
  144. *
  145. * @retval ErrorStatus枚举值
  146. * -FL_FAIL 配置过程发生错误
  147. * -FL_PASS LPUART配置成功
  148. */
  149. FL_ErrorStatus FL_ADC_CommonInit(FL_ADC_CommonInitTypeDef *ADC_CommonInitStruct)
  150. {
  151. FL_ErrorStatus status = FL_PASS;
  152. /* 入口参数检查 */
  153. assert_param(IS_FL_ADC_ADCCLK_PRESCALER(ADC_CommonInitStruct->clockPrescaler));
  154. assert_param(IS_FL_ADC_ADCCLK_SOURCE(ADC_CommonInitStruct->clockSource));
  155. /* 开启总线时钟 */
  156. FL_RCC_EnableGroup2BusClock(FL_RCC_GROUP2_BUSCLK_ADC);
  157. /* 开启操作时钟 */
  158. FL_RCC_EnableGroup2OperationClock(FL_RCC_GROUP2_OPCLK_ADC);
  159. /* 配置ADCCLOCK时钟预分频 */
  160. FL_RCC_SetADCPrescaler(ADC_CommonInitStruct->clockPrescaler);
  161. /* 配置ADCCLOCK时钟模块时钟源 */
  162. FL_RCC_SetADCClockSource(ADC_CommonInitStruct->clockSource);
  163. return status;
  164. }
  165. /**
  166. * @brief 设置 ADC_CommonInitStruct 为默认配置
  167. * @param ADC_CommonInitStruct 指向需要将值设置为默认配置的结构体 @ref LL_ADC_CommonInitTypeDef 结构体
  168. *
  169. * @retval None
  170. */
  171. void FL_ADC_CommonStructInit(FL_ADC_CommonInitTypeDef *ADC_CommonInitStruct)
  172. {
  173. /*默认使用RCHF作为ADC时钟模块时钟源,预分频系数16*/
  174. ADC_CommonInitStruct->clockSource = FL_RCC_ADC_CLK_SOURCE_RCHF;
  175. ADC_CommonInitStruct->clockPrescaler = FL_RCC_ADC_PSC_DIV16;
  176. }
  177. /**
  178. * @brief 恢复对应的ADC入口地址寄存器为默认值
  179. *
  180. * @param ADCx 外设入口地址
  181. *
  182. * @retval ErrorStatus枚举值
  183. * -FL_FAIL 配置过程发生错误
  184. * -FL_PASS LPUART配置成功
  185. */
  186. FL_ErrorStatus FL_ADC_DeInit(ADC_Type *ADCx)
  187. {
  188. FL_ErrorStatus status = FL_PASS;
  189. /* 入口合法性检查 */
  190. assert_param(IS_FL_ADC_INSTANCE(ADCx));
  191. /* 外设复位使能 */
  192. FL_RCC_EnablePeripheralReset();
  193. FL_RCC_EnableResetAPB2Peripheral(FL_RCC_RSTAPB_ADC);
  194. FL_RCC_DisableResetAPB2Peripheral(FL_RCC_RSTAPB_ADC);
  195. FL_RCC_EnableResetAPB2Peripheral(FL_RCC_RSTAPB_ADCCR);
  196. FL_RCC_DisableResetAPB2Peripheral(FL_RCC_RSTAPB_ADCCR);
  197. FL_RCC_DisablePeripheralReset();
  198. return status;
  199. }
  200. /**
  201. * @brief 初始化ADCx指定的入口地址的外设寄存器
  202. *
  203. * @note 用户必须检查此函数的返回值,以确保自校准完成,否则转换结果精度无法保证,除此之外ADC使能过采样实际不会增加ADC的
  204. * 转换精度只会提高转换结果的稳定性(同时配置移位寄存器的情况下),同时过采样会降低转换速度。
  205. * @param ADCx 外设入口地址
  206. * @param ADC_InitStruct 向一FL_ADC_InitTypeDef结构体,它包含指定ADC外设的配置信息
  207. *
  208. * @retval ErrorStatus枚举值
  209. * -FL_FAIL 配置过程发生错误
  210. * -FL_PASS LPUART配置成功
  211. */
  212. FL_ErrorStatus FL_ADC_Init(ADC_Type *ADCx, FL_ADC_InitTypeDef *ADC_InitStruct)
  213. {
  214. FL_ErrorStatus status = FL_PASS;
  215. uint32_t i = 0;
  216. /* 入口合法性检查 */
  217. assert_param(IS_FL_ADC_INSTANCE(ADCx));
  218. assert_param(IS_FL_ADC_CONTINUOUSCONVMODE(ADC_InitStruct->conversionMode));
  219. assert_param(IS_FL_ADC_AUTO_MODE(ADC_InitStruct->autoMode));
  220. assert_param(IS_FL_ADC_SCANDIRECTION(ADC_InitStruct->scanDirection));
  221. assert_param(IS_FL_ADC_EXTERNALTRIGCONV(ADC_InitStruct->externalTrigConv));
  222. assert_param(IS_FL_ADC_OVERSAMPCOFIG(ADC_InitStruct->oversamplingMode));
  223. assert_param(IS_FL_ADC_OVERSAMPINGRATIO(ADC_InitStruct->overSampingMultiplier));
  224. assert_param(IS_FL_ADC_OVERSAMPINGSHIFT(ADC_InitStruct->oversamplingShift));
  225. /* 使能a工作时钟 */
  226. FL_RCC_EnableGroup1BusClock(FL_RCC_GROUP1_BUSCLK_ANAC);
  227. FL_SVD_EnableADCMonitor(SVD);
  228. if(!FL_VREF_IsEnabled(VREF))
  229. {
  230. FL_VREF_ClearFlag_Ready(VREF);
  231. FL_VREF_Enable(VREF);//置位VREF_EN寄存器,使能VREF1p2模块
  232. }
  233. FL_VREF_EnableTemperatureSensor(VREF);//置位PTAT_EN寄存器
  234. while(FL_VREF_IsActiveFlag_Ready(VREF) == 0)
  235. {
  236. if(i >= 128000)
  237. {
  238. break;
  239. }
  240. i++;
  241. }
  242. FL_ADC_Disable(ADCx);
  243. if(FL_ADC_IsEnabled(ADCx) == 0U)
  244. {
  245. /* 连续转换模式 */
  246. FL_ADC_SetConversionMode(ADCx, ADC_InitStruct->conversionMode);
  247. /* 自动转换模式 */
  248. FL_ADC_SetSingleConversionAutoMode(ADCx, ADC_InitStruct->autoMode);
  249. /* 通道等待使能 */
  250. if(ADC_InitStruct->waitMode)
  251. {
  252. FL_ADC_EnableWaitMode(ADCx);
  253. }
  254. else
  255. {
  256. FL_ADC_DisableWaitMode(ADCx);
  257. }
  258. /*数据冲突模式设置*/
  259. if(ADC_InitStruct->overrunMode)
  260. {
  261. FL_ADC_EnableOverrunMode(ADCx);
  262. }
  263. else
  264. {
  265. FL_ADC_DisableOverrunMode(ADCx);
  266. }
  267. /* 多通道扫描方向 */
  268. FL_ADC_SetSequenceScanDirection(ADCx, ADC_InitStruct->scanDirection);
  269. /* 采样控制模式*/
  270. FL_ADC_SetSamplingTimeControlMode(ADCx, FL_ADC_SAMPLING_TIME_CONTROL_BY_REG);
  271. FL_ADC_SetSamplingStartControlMode(ADCx, FL_ADC_SAMPLING_START_CONTROL_BY_REG);
  272. /* 触发模式 */
  273. FL_ADC_SetTriggerEdge(ADCx, ADC_InitStruct->externalTrigConv);
  274. /* 触发源 */
  275. FL_ADC_SetTriggerSource(ADCx, ADC_InitStruct->triggerSource);
  276. /*通道采样时间设置*/
  277. FL_ADC_SetSamplingInterval(ADCx, FL_ADC_SAMPLING_INTERVAL_11_CYCLE);
  278. FL_ADC_SetFastChannelSamplingTime(ADCx, ADC_InitStruct->fastChannelTime);
  279. FL_ADC_SetSlowChannelSamplingTime(ADCx, ADC_InitStruct->lowChannelTime);
  280. if(ADC_InitStruct->oversamplingMode)
  281. {
  282. /*使能过采样倍数后,需要配置移位寄存器进行移位,这一过程是硬件自动完成的最终最大
  283. 可输出16位的结果值(即256被采样得到的结果是20bit的,右移4bit结果就是16bit的)*/
  284. FL_ADC_SetOverSamplingMultiplier(ADCx, ADC_InitStruct->overSampingMultiplier);
  285. FL_ADC_SetOverSamplingShift(ADCx, ADC_InitStruct->oversamplingShift);
  286. /* 过采样使能 */
  287. FL_ADC_EnableOverSampling(ADCx);
  288. }
  289. else
  290. {
  291. /* 关闭过采样 */
  292. FL_ADC_DisableOverSampling(ADCx);
  293. }
  294. }
  295. else
  296. {
  297. status = FL_FAIL;
  298. }
  299. return status;
  300. }
  301. /**
  302. * @brief 设置 ADC_InitStruct 为默认配置
  303. * @param ADC_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_ADC_InitTypeDef 结构体
  304. *
  305. * @retval None
  306. */
  307. void FL_ADC_StructInit(FL_ADC_InitTypeDef *ADC_InitStruct)
  308. {
  309. ADC_InitStruct->conversionMode = FL_ADC_CONV_MODE_SINGLE;
  310. ADC_InitStruct->autoMode = FL_ADC_SINGLE_CONV_MODE_AUTO;
  311. ADC_InitStruct->scanDirection = FL_ADC_SEQ_SCAN_DIR_FORWARD;
  312. ADC_InitStruct->externalTrigConv = FL_ADC_TRIGGER_EDGE_NONE;
  313. ADC_InitStruct->overrunMode = FL_ENABLE;
  314. ADC_InitStruct->waitMode = FL_ENABLE;
  315. ADC_InitStruct->fastChannelTime = FL_ADC_FAST_CH_SAMPLING_TIME_4_ADCCLK;
  316. ADC_InitStruct->lowChannelTime = FL_ADC_SLOW_CH_SAMPLING_TIME_192_ADCCLK;
  317. ADC_InitStruct->oversamplingMode = FL_ENABLE;
  318. ADC_InitStruct->overSampingMultiplier = FL_ADC_OVERSAMPLING_MUL_16X;
  319. ADC_InitStruct->oversamplingShift = FL_ADC_OVERSAMPLING_SHIFT_4B;
  320. }
  321. /**
  322. * @}
  323. */
  324. /**
  325. * @}
  326. */
  327. /**
  328. * @}
  329. */
  330. /******************************************* END OF FILE *******************************************/