ciu32f003_std_adc(1).h 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592
  1. /************************************************************************************************/
  2. /**
  3. * @file ciu32f003_std_adc.h
  4. * @author MCU Ecosystem Development Team
  5. * @brief ADC STD库驱动头文件。
  6. * 提供ADC相关的STD库操作函数声明、数据类型以及常量的定义。
  7. *
  8. *
  9. **************************************************************************************************
  10. * @attention
  11. * Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
  12. *
  13. **************************************************************************************************
  14. */
  15. /* 避免头文件重复引用 */
  16. #ifndef CIU32F003_STD_ADC_H
  17. #define CIU32F003_STD_ADC_H
  18. /************************************************************************************************/
  19. /**
  20. * @addtogroup CIU32F003_STD_Driver
  21. * @{
  22. */
  23. /**
  24. * @defgroup ADC ADC
  25. * @brief 模数转换器的STD库驱动
  26. * @{
  27. */
  28. /************************************************************************************************/
  29. #ifdef __cplusplus
  30. extern "C" {
  31. #endif
  32. /*------------------------------------------includes--------------------------------------------*/
  33. #include "ciu32f003_std_common.h"
  34. /*--------------------------------------------define--------------------------------------------*/
  35. /************************************************************************************************/
  36. /**
  37. * @defgroup ADC_Constants ADC Constants
  38. * @brief ADC常量定义及宏定义
  39. * @{
  40. *
  41. */
  42. /************************************************************************************************/
  43. /* ADC_CK时钟分频系数 */
  44. #define ADC_CK_DIV1 ADC_CFG2_PRESC_DIV1 /**< ADC_CK时钟: 不分频 */
  45. #define ADC_CK_DIV2 ADC_CFG2_PRESC_DIV2 /**< ADC_CK时钟: 2分频 */
  46. #define ADC_CK_DIV3 ADC_CFG2_PRESC_DIV3 /**< ADC_CK时钟: 3分频 */
  47. #define ADC_CK_DIV4 ADC_CFG2_PRESC_DIV4 /**< ADC_CK时钟: 4分频 */
  48. #define ADC_CK_DIV8 ADC_CFG2_PRESC_DIV8 /**< ADC_CK时钟: 8分频 */
  49. #define ADC_CK_DIV16 ADC_CFG2_PRESC_DIV16 /**< ADC_CK时钟: 16分频 */
  50. #define ADC_CK_DIV32 ADC_CFG2_PRESC_DIV32 /**< ADC_CK时钟: 32分频 */
  51. #define ADC_CK_DIV64 ADC_CFG2_PRESC_DIV64 /**< ADC_CK时钟: 64分频 */
  52. /* ADC转换模式 */
  53. #define ADC_SINGLE_CONVER_MODE ADC_CFG1_CONV_MOD_SINGLE /**< ADC单次扫描转换 */
  54. #define ADC_CONTINUOUS_CONVER_MODE ADC_CFG1_CONV_MOD_CONTINUOUS /**< ADC循环扫描转换 */
  55. #define ADC_DISCONTINUOUS_CONVER_MODE ADC_CFG1_CONV_MOD_DISCONTINUOUS /**< ADC循环间断转换 */
  56. /* ADC通道扫描方向 */
  57. #define ADC_SCAN_DIR_FORWARD (0x00000000U) /**< ADC转换通道: 正向扫描 */
  58. #define ADC_SCAN_DIR_BACKWARD ADC_CFG1_SDIR /**< ADC转换通道: 反向扫描 */
  59. /* ADC转换触发模式: 触发沿 */
  60. #define ADC_TRIG_SW ADC_CFG1_TRIGEN_SW /**< 软件触发方式 */
  61. #define ADC_TRIG_HW_EDGE_RISING ADC_CFG1_TRIGEN_HW_EDGE_RISING /**< 外部硬件触发使能: 上升沿触发 */
  62. #define ADC_TRIG_HW_EDGE_FALLING ADC_CFG1_TRIGEN_HW_EDGE_FALLING /**< 外部硬件触发使能: 下降沿触发 */
  63. #define ADC_TRIG_HW_EDGE_BOTH ADC_CFG1_TRIGEN_HW_EDGE_BOTH /**< 外部硬件触发使能: 双沿触发 */
  64. /* ADC转换触发源 */
  65. #define ADC_EXTRIG_TIM1_TRGO ADC_CFG1_TRIG_TIM1_TRGO /**< ADC触发源: TIM1 TRGO */
  66. #define ADC_EXTRIG_TIM1_OC4_ADC ADC_CFG1_TRIG_TIM1_OC4_ADC /**< ADC触发源: TIM1 OC4 */
  67. #define ADC_EXTRIG_TIM3_TRGO ADC_CFG1_TRIG_TIM3_TRGO /**< ADC触发源: TIM3 TRGO */
  68. #define ADC_EXTRIG_EXTI7 ADC_CFG1_TRIG_EXTI7 /**< ADC触发源: 外部中断EXTI_7 */
  69. /* ADC转换溢出后ADC_DR寄存器数据存储方式 */
  70. #define ADC_OVRN_MODE_PRESERVED (0x00000000U) /**< ADC_DR寄存器保留原数据 */
  71. #define ADC_OVRN_MODE_OVERWRITTEN ADC_CFG1_OVRN_MOD /**< ADC_DR寄存器覆盖新数据 */
  72. /* ADC采样时间参数 */
  73. #define ADC_SAMPTIME_3CYCLES ADC_SAMPT_SAMPT_3CYCLES /**< 采样时间为3个时钟周期 */
  74. #define ADC_SAMPTIME_7CYCLES ADC_SAMPT_SAMPT_7CYCLES /**< 采样时间为7个时钟周期 */
  75. #define ADC_SAMPTIME_12CYCLES ADC_SAMPT_SAMPT_12CYCLES /**< 采样时间为12个时钟周期 */
  76. #define ADC_SAMPTIME_19CYCLES ADC_SAMPT_SAMPT_19CYCLES /**< 采样时间为19个时钟周期 */
  77. #define ADC_SAMPTIME_39CYCLES ADC_SAMPT_SAMPT_39CYCLES /**< 采样时间为39个时钟周期 */
  78. #define ADC_SAMPTIME_79CYCLES ADC_SAMPT_SAMPT_79CYCLES /**< 采样时间为79个时钟周期 */
  79. #define ADC_SAMPTIME_119CYCLES ADC_SAMPT_SAMPT_119CYCLES /**< 采样时间为119个时钟周期 */
  80. #define ADC_SAMPTIME_159CYCLES ADC_SAMPT_SAMPT_159CYCLES /**< 采样时间为159个时钟周期 */
  81. #define ADC_SAMPTIME_239CYCLES ADC_SAMPT_SAMPT_239CYCLES /**< 采样时间为239个时钟周期 */
  82. #define ADC_SAMPTIME_319CYCLES ADC_SAMPT_SAMPT_319CYCLES /**< 采样时间为319个时钟周期 */
  83. #define ADC_SAMPTIME_479CYCLES ADC_SAMPT_SAMPT_479CYCLES /**< 采样时间为479个时钟周期 */
  84. #define ADC_SAMPTIME_639CYCLES ADC_SAMPT_SAMPT_639CYCLES /**< 采样时间为639个时钟周期 */
  85. #define ADC_SAMPTIME_959CYCLES ADC_SAMPT_SAMPT_959CYCLES /**< 采样时间为959个时钟周期 */
  86. #define ADC_SAMPTIME_1279CYCLES ADC_SAMPT_SAMPT_1279CYCLES /**< 采样时间为1279个时钟周期 */
  87. #define ADC_SAMPTIME_1919CYCLES ADC_SAMPT_SAMPT_1919CYCLES /**< 采样时间为1919个时钟周期 */
  88. /* ADC转换通道 */
  89. #define ADC_CHANNEL_NONE (0x00000000U) /**< ADC 转换通道清除 */
  90. #define ADC_CHANNEL_0 ADC_CHCFG_CHN0 /**< ADC 转换通道IN0 */
  91. #define ADC_CHANNEL_1 ADC_CHCFG_CHN1 /**< ADC 转换通道IN1 */
  92. #define ADC_CHANNEL_2 ADC_CHCFG_CHN2 /**< ADC 转换通道IN2 */
  93. #define ADC_CHANNEL_3 ADC_CHCFG_CHN3 /**< ADC 转换通道IN3 */
  94. #define ADC_CHANNEL_4 ADC_CHCFG_CHN4 /**< ADC 转换通道IN4 */
  95. #define ADC_CHANNEL_5 ADC_CHCFG_CHN5 /**< ADC 转换通道IN5 */
  96. #define ADC_CHANNEL_6 ADC_CHCFG_CHN6 /**< ADC 转换通道IN6 */
  97. #define ADC_CHANNEL_7 ADC_CHCFG_CHN7 /**< ADC 转换通道IN7 */
  98. #define ADC_CHANNEL_8 ADC_CHCFG_CHN8 /**< ADC 转换通道IN8 */
  99. #define ADC_CHANNEL_VBGR ADC_CHCFG_CHN8 /**< ADC 内部转换通道VBGR */
  100. #define ADC_CHANNEL_ALL ADC_CHCFG_CHN /**< ADC 全部转换通道 */
  101. /* ADC模拟看门狗监测通道 */
  102. #define ADC_AWDG_CHANNEL_NONE (0x00000000U) /**< ADC 模拟看门狗监测通道清除 */
  103. #define ADC_AWDG_CHANNEL_0 ADC_AWDGCR_CHN0 /**< ADC 模拟看门狗监测通道0 */
  104. #define ADC_AWDG_CHANNEL_1 ADC_AWDGCR_CHN1 /**< ADC 模拟看门狗监测通道1 */
  105. #define ADC_AWDG_CHANNEL_2 ADC_AWDGCR_CHN2 /**< ADC 模拟看门狗监测通道2 */
  106. #define ADC_AWDG_CHANNEL_3 ADC_AWDGCR_CHN3 /**< ADC 模拟看门狗监测通道3 */
  107. #define ADC_AWDG_CHANNEL_4 ADC_AWDGCR_CHN4 /**< ADC 模拟看门狗监测通道4 */
  108. #define ADC_AWDG_CHANNEL_5 ADC_AWDGCR_CHN5 /**< ADC 模拟看门狗监测通道5 */
  109. #define ADC_AWDG_CHANNEL_6 ADC_AWDGCR_CHN6 /**< ADC 模拟看门狗监测通道6 */
  110. #define ADC_AWDG_CHANNEL_7 ADC_AWDGCR_CHN7 /**< ADC 模拟看门狗监测通道7 */
  111. #define ADC_AWDG_CHANNEL_8 ADC_AWDGCR_CHN8 /**< ADC 模拟看门狗监测通道8 */
  112. #define ADC_AWDG_CHANNEL_VBGR ADC_AWDGCR_CHN8 /**< ADC 模拟看门狗监测通道VBGR */
  113. #define ADC_AWDG_CHANNEL_ALL ADC_AWDGCR_CHN /**< ADC 全部转换通道 */
  114. /* ADC内部通道使能 */
  115. #define ADC_INTERNAL_CHANNEL_VBGREN ADC_CFG2_VBGREN /**< ADC 内部通道VBGR使能 */
  116. /* ADC中断源定义:IER中断寄存器 */
  117. #define ADC_INTERRUPT_EOSAMP ADC_IER_EOSAMPIE /**< ADC采样结束中断 */
  118. #define ADC_INTERRUPT_EOC ADC_IER_EOCIE /**< ADC单通道转换完成中断 */
  119. #define ADC_INTERRUPT_EOS ADC_IER_EOSIE /**< ADC通道序列转换完成中断 */
  120. #define ADC_INTERRUPT_OVRN ADC_IER_OVRNIE /**< ADC数据溢出中断 */
  121. #define ADC_INTERRUPT_AWDG ADC_IER_AWDGIE /**< ADC模拟看门狗电压监控中断 */
  122. #define ADC_INTERRUPT_EOCAL ADC_IER_EOCALIE /**< ADC校准结束中断 */
  123. /* ADC状态定义:ISR状态寄存器 */
  124. #define ADC_FLAG_EOSAMP ADC_ISR_EOSAMP /**< ADC采样结束状态 */
  125. #define ADC_FLAG_EOC ADC_ISR_EOC /**< ADC单通道转换完成状态 */
  126. #define ADC_FLAG_EOS ADC_ISR_EOS /**< ADC通道序列转换完成状态 */
  127. #define ADC_FLAG_OVRN ADC_ISR_OVRN /**< ADC数据溢出状态 */
  128. #define ADC_FLAG_AWDG ADC_ISR_AWDG /**< ADC模拟看门狗监控电压状态 */
  129. #define ADC_FLAG_EOCAL ADC_ISR_EOCAL /**< ADC校准状态 */
  130. #define ADC_FLAG_ALL (ADC_ISR_EOSAMP | ADC_ISR_EOC | ADC_ISR_EOS \
  131. | ADC_ISR_OVRN | ADC_ISR_AWDG | ADC_ISR_EOCAL)/**< ADC全部状态 */
  132. /* ADC工作模式定义 */
  133. #define ADC_MODE_INTERVAL (0x00000000U) /**< ADC间歇工作模式 */
  134. #define ADC_MODE_NORMAL ADC_CFG3_MODE /**< ADC正常工作模式 */
  135. /* VBGR校准参数定义 */
  136. #define VBGR_CAL_ADDR ((uint16_t *)(BGR_CAL)) /**< VBGR校准参数存储地址 */
  137. #define VBGR_CAL_VREF (3300U) /**< VBGR校准采用参考电压:3.3V */
  138. /* 等待内部通道VBGR的启动稳定。稳定时间最大值参考CIU32F003的数据手册(tADC_BUF参数) */
  139. #define ADC_VBGR_CHANNEL_DELAY (22U) /**< VBGR通道启动稳定时间:22us */
  140. /* ADC使能稳定时间,需等待1us稳定时间 */
  141. #define ADC_EN_DELAY (1U) /**< ADC使能稳定时间 */
  142. /* ADC最大采样值 */
  143. #define ADC_CONVER_SCALE (4095U) /**< ADC最大采样值,用于ADC电压转换计算 */
  144. /**
  145. * @}
  146. */
  147. /*-------------------------------------------functions------------------------------------------*/
  148. /************************************************************************************************/
  149. /**
  150. * @defgroup ADC_External_Functions ADC External Functions
  151. * @brief ADC对外函数
  152. * @{
  153. *
  154. */
  155. /************************************************************************************************/
  156. /**
  157. * @brief 使能ADC
  158. * @retval 无
  159. */
  160. __STATIC_INLINE void std_adc_enable(void)
  161. {
  162. ADC->CR = (ADC_CR_ADEN);
  163. }
  164. /**
  165. * @brief 禁止ADC
  166. * @retval 无
  167. */
  168. __STATIC_INLINE void std_adc_disable(void)
  169. {
  170. ADC->CR = (ADC_CR_ADDIS);
  171. }
  172. /**
  173. * @brief 获取ADC使能位状态
  174. * @retval uint32_t 返回逻辑表达式的判断结果
  175. * @arg 非0: 表示ADC处于使能状态
  176. * @arg 0:表示ADC处于禁止状态
  177. */
  178. __STATIC_INLINE uint32_t std_adc_get_enable_status(void)
  179. {
  180. return ((ADC->CR & ADC_CR_ADEN));
  181. }
  182. /**
  183. * @brief 使能ADC校准
  184. * @note 当ADEN=1,ADC稳定后,且START=0、STOP=0、ADDIS=0,才允许通过软件将CALEN位置1
  185. * @retval 无
  186. */
  187. __STATIC_INLINE void std_adc_calibration_enable(void)
  188. {
  189. ADC->CR = (ADC_CR_CALEN);
  190. }
  191. /**
  192. * @brief 启动ADC转换
  193. * @retval 无
  194. */
  195. __STATIC_INLINE void std_adc_start_conversion(void)
  196. {
  197. ADC->CR = (ADC_CR_START);
  198. }
  199. /**
  200. * @brief 获取ADC工作状态
  201. * @retval uint32_t 返回ADC工作状态
  202. * @arg 非0: 表示ADC正处于工作状态
  203. * @arg 0:表示ADC处于未工作状态
  204. */
  205. __STATIC_INLINE uint32_t std_adc_get_conversion_status(void)
  206. {
  207. return ((ADC->CR & ADC_CR_START));
  208. }
  209. /**
  210. * @brief ADC停止转换
  211. * @note 仅当START=1且ADDIS=0时,软件将STOP位置1生效
  212. * @retval 无
  213. */
  214. __STATIC_INLINE void std_adc_stop_conversion(void)
  215. {
  216. ADC->CR = (ADC_CR_STOP);
  217. }
  218. /**
  219. * @brief ADC中断使能
  220. * @param interrupt ADC中断源
  221. * @arg ADC_INTERRUPT_EOSAMP
  222. * @arg ADC_INTERRUPT_EOC
  223. * @arg ADC_INTERRUPT_EOS
  224. * @arg ADC_INTERRUPT_OVRN
  225. * @arg ADC_INTERRUPT_AWDG
  226. * @arg ADC_INTERRUPT_EOCAL
  227. * @retval 无
  228. */
  229. __STATIC_INLINE void std_adc_interrupt_enable(uint32_t interrupt)
  230. {
  231. ADC->IER |= (interrupt);
  232. }
  233. /**
  234. * @brief ADC中断禁止
  235. * @param interrupt ADC中断源
  236. * @arg ADC_INTERRUPT_EOSAMP
  237. * @arg ADC_INTERRUPT_EOC
  238. * @arg ADC_INTERRUPT_EOS
  239. * @arg ADC_INTERRUPT_OVRN
  240. * @arg ADC_INTERRUPT_AWDG
  241. * @arg ADC_INTERRUPT_EOCAL
  242. * @retval 无
  243. */
  244. __STATIC_INLINE void std_adc_interrupt_disable(uint32_t interrupt)
  245. {
  246. ADC->IER &= (~interrupt);
  247. }
  248. /**
  249. * @brief 获取ADC中断源使能状态
  250. * @param interrupt ADC中断源信息
  251. * @arg ADC_INTERRUPT_EOSAMP
  252. * @arg ADC_INTERRUPT_EOC
  253. * @arg ADC_INTERRUPT_EOS
  254. * @arg ADC_INTERRUPT_OVRN
  255. * @arg ADC_INTERRUPT_AWDG
  256. * @arg ADC_INTERRUPT_EOCAL
  257. * @retval uint32_t 返回中断源使能状态
  258. * @arg 非0: 表示指定的中断使能
  259. * @arg 0:表示指定的中断未使能
  260. */
  261. __STATIC_INLINE uint32_t std_adc_get_interrupt_enable(uint32_t interrupt)
  262. {
  263. return((ADC->IER & (interrupt)));
  264. }
  265. /**
  266. * @brief 获取ADC标志状态
  267. * @param flag 获取ADC标志
  268. * @arg ADC_FLAG_EOSAMP
  269. * @arg ADC_FLAG_EOC
  270. * @arg ADC_FLAG_EOS
  271. * @arg ADC_FLAG_OVRN
  272. * @arg ADC_FLAG_AWDG
  273. * @arg ADC_FLAG_EOCAL
  274. * @retval uint32_t 返回标志位状态
  275. * @arg 非0:表示当前标志为置位状态
  276. * @arg 0:表示当前标志为清除状态
  277. */
  278. __STATIC_INLINE uint32_t std_adc_get_flag(uint32_t flag)
  279. {
  280. return((ADC->ISR & (flag)));
  281. }
  282. /**
  283. * @brief 清除ADC标志
  284. * @param flag 清除ADC标志
  285. * @arg ADC_FLAG_EOSAMP
  286. * @arg ADC_FLAG_EOC
  287. * @arg ADC_FLAG_EOS
  288. * @arg ADC_FLAG_OVRN
  289. * @arg ADC_FLAG_AWDG
  290. * @arg ADC_FLAG_EOCAL
  291. * @retval 无
  292. */
  293. __STATIC_INLINE void std_adc_clear_flag(uint32_t flag)
  294. {
  295. ADC->ISR = (flag);
  296. }
  297. /**
  298. * @brief 配置ADC转换模式
  299. * @param conversion_mode 转换模式选择
  300. * @arg ADC_SINGLE_CONVER_MODE
  301. * @arg ADC_CONTINUOUS_CONVER_MODE
  302. * @arg ADC_DISCONTINUOUS_CONVER_MODE
  303. * @note 当START=0时,软件对此位域执行写操作生效
  304. * @retval 无
  305. */
  306. __STATIC_INLINE void std_adc_conversion_mode_config(uint32_t conversion_mode)
  307. {
  308. MODIFY_REG(ADC->CFG1, ADC_CFG1_CONV_MOD, conversion_mode);
  309. }
  310. /**
  311. * @brief ADC通道使能
  312. * @param channel 通道号选择
  313. * @arg ADC_CHANNEL_0
  314. * @arg ADC_CHANNEL_1
  315. * @arg ...
  316. * @arg ADC_CHANNEL_ALL
  317. * @retval 无
  318. */
  319. __STATIC_INLINE void std_adc_fix_sequence_channel_enable(uint32_t channel)
  320. {
  321. ADC->CHCFG |= (channel);
  322. }
  323. /**
  324. * @brief ADC通道禁止
  325. * @param channel 禁止通道选择
  326. * @arg ADC_CHANNEL_0
  327. * @arg ADC_CHANNEL_1
  328. * @arg ...
  329. * @arg ADC_CHANNEL_ALL
  330. * @retval 无
  331. */
  332. __STATIC_INLINE void std_adc_fix_sequence_channel_disable(uint32_t channel)
  333. {
  334. ADC->CHCFG &= (~channel);
  335. }
  336. /**
  337. * @brief 配置ADC触发源为软件触发
  338. * @retval 无
  339. */
  340. __STATIC_INLINE void std_adc_trig_sw(void)
  341. {
  342. MODIFY_REG(ADC->CFG1, ADC_CFG1_TRIGEN, ADC_TRIG_SW);
  343. }
  344. /**
  345. * @brief 配置ADC触发信号源和极性
  346. * @param trig_edge 触发极性选择
  347. * @arg ADC_TRIG_SW(软件触发方式)
  348. * @arg ADC_TRIG_HW_EDGE_RISING
  349. * @arg ADC_TRIG_HW_EDGE_FALLING
  350. * @arg ADC_TRIG_HW_EDGE_BOTH
  351. * @param trig_source 外部触发源性选择
  352. * @arg ADC_EXTRIG_TIM1_TRGO
  353. * @arg ADC_EXTRIG_TIM1_OC4_ADC
  354. * @arg ADC_EXTRIG_TIM3_TRGO
  355. * @arg ADC_EXTRIG_EXTI7
  356. * @note 当选择ADC_TRIG_SW(软件触发方式)时,触发源参数无意义。
  357. * @retval 无
  358. */
  359. __STATIC_INLINE void std_adc_trig_config(uint32_t trig_edge,uint32_t trig_source)
  360. {
  361. MODIFY_REG(ADC->CFG1, (ADC_CFG1_TRIGEN | ADC_CFG1_TRIG_SEL), (trig_edge | trig_source));
  362. }
  363. /**
  364. * @brief ADC采样时间参数1配置
  365. * @param sample_time 采样时间选择
  366. * @arg ADC_SAMPTIME_3CYCLES
  367. * @arg ...
  368. * @arg ADC_SAMPTIME_1919CYCLES
  369. * @retval 无
  370. */
  371. __STATIC_INLINE void std_adc_sampt_time_config(uint32_t sample_time)
  372. {
  373. MODIFY_REG(ADC->SAMPT, ADC_SAMPT_SAMPT, sample_time);
  374. }
  375. /**
  376. * @brief 配置ADC_CK时钟分频
  377. * @param presc ADC_CK时钟源分频系数
  378. * @arg ADC_CK_DIV1: ADC_CK 不分频
  379. * @arg ADC_CK_DIV2: ADC_CK 2分频
  380. * @arg ADC_CK_DIV3: ADC_CK 3分频
  381. * @arg ...
  382. * @arg ADC_CK_DIV64:ADC_CK 64分频
  383. * @retval 无
  384. */
  385. __STATIC_INLINE void std_adc_clock_config(uint32_t presc)
  386. {
  387. MODIFY_REG(ADC->CFG2, ADC_CFG2_PRESC, presc);
  388. }
  389. /**
  390. * @brief 配置ADC校准系数
  391. * @param calibration_factor 参数范围为0x00~0x3F
  392. * @retval 无
  393. */
  394. __STATIC_INLINE void std_adc_calibration_factor_config(uint32_t calibration_factor)
  395. {
  396. ADC->CALFACT = calibration_factor;
  397. }
  398. /**
  399. * @brief 获取ADC校准系数
  400. * @retval uint16_t ADC校准系数
  401. */
  402. __STATIC_INLINE uint16_t std_adc_get_calibration_factor(void)
  403. {
  404. return ((uint16_t)(ADC->CALFACT));
  405. }
  406. /**
  407. * @brief 使能ADC等待模式
  408. * @note 用于避免数据未及时读取,转换溢出
  409. * @retval 无
  410. */
  411. __STATIC_INLINE void std_adc_wait_mode_enable(void)
  412. {
  413. ADC->CFG1 |= (ADC_CFG1_WAIT_MOD);
  414. }
  415. /**
  416. * @brief 禁止ADC等待模式
  417. * @retval 无
  418. */
  419. __STATIC_INLINE void std_adc_wait_mode_disable(void)
  420. {
  421. ADC->CFG1 &= (~ADC_CFG1_WAIT_MOD);
  422. }
  423. /**
  424. * @brief 配置通道序列扫描方向
  425. * @param dir ADC通道扫描方向
  426. * @arg ADC_SCAN_DIR_FORWARD
  427. * @arg ADC_SCAN_DIR_BACKWARD
  428. * @retval 无
  429. */
  430. __STATIC_INLINE void std_adc_scan_direction_config(uint32_t dir)
  431. {
  432. MODIFY_REG(ADC->CFG1, ADC_CFG1_SDIR, dir);
  433. }
  434. /**
  435. * @brief 配置ADC数据溢出管理方式
  436. * @param ovrn_mode ADC数据溢出管理方式
  437. * @arg ADC_OVRN_MODE_PRESERVED
  438. * @arg ADC_OVRN_MODE_OVERWRITTEN
  439. * @retval 无
  440. */
  441. __STATIC_INLINE void std_adc_ovrn_mode_config(uint32_t ovrn_mode)
  442. {
  443. MODIFY_REG(ADC->CFG1, ADC_CFG1_OVRN_MOD, ovrn_mode);
  444. }
  445. /**
  446. * @brief ADC内部通道VBGR使能
  447. * @retval 无
  448. */
  449. __STATIC_INLINE void std_adc_internal_channel_vbgr_enable(void)
  450. {
  451. ADC->CFG2 |= (ADC_INTERNAL_CHANNEL_VBGREN);
  452. }
  453. /**
  454. * @brief ADC内部通道VBGR禁止
  455. * @retval 无
  456. */
  457. __STATIC_INLINE void std_adc_internal_channel_vbgr_disable(void)
  458. {
  459. ADC->CFG2 &= (~ADC_INTERNAL_CHANNEL_VBGREN);
  460. }
  461. /**
  462. * @brief 选择ADC模拟看门狗监控通道
  463. * @param channel ADC看门狗监控通道选择
  464. * @arg ADC_AWDG_CHANNEL_NONE
  465. * @arg ADC_AWDG_CHANNEL_0
  466. * @arg ...
  467. * @arg ADC_AWDG_CHANNEL_ALL
  468. * @retval 无
  469. */
  470. __STATIC_INLINE void std_adc_analog_watchdog_monit_channel(uint32_t channel)
  471. {
  472. MODIFY_REG(ADC->AWDGCR, ADC_AWDGCR_CHN, channel);
  473. }
  474. /**
  475. * @brief 配置看门狗监控通道电压阈值
  476. * @param high_threshold 阈值上限选择范围为 0x000~0xFFF
  477. * @param low_threshold 阈值下限选择范围为 0x000~0xFFF
  478. * @retval 无
  479. */
  480. __STATIC_INLINE void std_adc_analog_watchdog_thresholds_config(uint32_t high_threshold, uint32_t low_threshold)
  481. {
  482. MODIFY_REG(ADC->AWDGTR, (ADC_AWDGTR_AWDG_LT | ADC_AWDGTR_AWDG_HT), (high_threshold << ADC_AWDGTR_AWDG_HT_POS) | (low_threshold));
  483. }
  484. /**
  485. * @brief 获取ADC采样值
  486. * @retval uint16_t ADC转换值
  487. */
  488. __STATIC_INLINE uint16_t std_adc_get_conversion_value(void)
  489. {
  490. return ((uint16_t)(ADC->DR));
  491. }
  492. /**
  493. * @brief 获取校准后的参考电压值
  494. * @param vbgr_sample_data ADC采集BGR的转换值
  495. * @retval uint32_t 校准后的参考电压值
  496. */
  497. __STATIC_INLINE uint32_t std_adc_calc_vref_voltage(uint16_t vbgr_sample_data)
  498. {
  499. return ((VBGR_CAL_VREF * (*VBGR_CAL_ADDR))/vbgr_sample_data);
  500. }
  501. /**
  502. * @brief 配置ADC工作模式
  503. * @param mode_sel ADC工作模式
  504. * @arg ADC_MODE_INTERVAL
  505. * @arg ADC_MODE_NORMAL
  506. * @retval 无
  507. */
  508. __STATIC_INLINE void std_adc_mode_config(uint32_t mode_sel)
  509. {
  510. MODIFY_REG(ADC->CFG3, ADC_CFG3_MODE_MASK, mode_sel);
  511. }
  512. /* ADC去初始化函数 */
  513. void std_adc_deinit(void);
  514. /**
  515. * @}
  516. */
  517. #ifdef __cplusplus
  518. }
  519. #endif
  520. /**
  521. * @}
  522. */
  523. /**
  524. * @}
  525. */
  526. #endif /* CIU32F003_STD_ADC_H */