ics.h 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. /******************************************************************************
  2. *
  3. * @brief ICS 驱动头文件.
  4. *
  5. ******************************************************************************/
  6. #ifndef ICS_H_
  7. #define ICS_H_
  8. #ifdef __cplusplus
  9. extern "C" {
  10. #endif
  11. #include "common.h"
  12. /****************************************************************************!
  13. * @brief 时钟模式常量定义
  14. *
  15. ***************************************************************************/
  16. enum
  17. {
  18. ICS_CLK_MODE_FEI = 1, /*!< FEI 模式 */
  19. ICS_CLK_MODE_FEE, /*!< FEE 模式 */
  20. ICS_CLK_MODE_FEE_OSC, /*!< FEE 模式 OSC输出时钟源选择来自EXTAL引脚的外部时钟源 */
  21. ICS_CLK_MODE_FBE, /*!< FBE 模式 */
  22. ICS_CLK_MODE_FBE_OSC, /*!< FBE 模式 OSC输出时钟源选择来自EXTAL引脚的外部时钟源 */
  23. ICS_CLK_MODE_FBI, /*!< FBI 模式 */
  24. ICS_CLK_MODE_FBILP, /*!< FBILP 模式 */
  25. ICS_CLK_MODE_FBELP, /*!< FBELP 模式 */
  26. };
  27. /*****************************************************************************//*!
  28. *
  29. * @brief 将时钟模式从当前模式切换到另一个时钟模式.
  30. *
  31. * 时钟模式宏观定义如下:
  32. * FEI, FBI, FEE, FBE, FBILP, FBELP, FEE_OSC, FBE_OSC
  33. * 注:FEE_OSC, FBE_OSC 不能用作当前时钟模式. 当前时钟模式和要切换到的时钟模式组合如下:
  34. * < 当前时钟模式,要切换到的时钟模式>
  35. * <FEI,FEE>, <FEI,FBI>, <FEI,FBE>, <FEI,FBE_OSC>, <FEI,FEE_OSC>, <FEE,FEI>,
  36. * <FEE,FBI>, <FEE,FBE>, <FBI,FBE>, <FBI,FEE>, <FBI,FBILP>, <FBI,FEI>,
  37. * <FBE,FBI>, <FBE,FEE>, <FBE,FEI>, <FBE,FBELP>, <FBELP,FBE>, <FBILP,FBI>.
  38. *
  39. * @param[in] CurMode 当前时钟模式
  40. * @param[in] NewMode 要切换到的时钟模式
  41. * @param[in] clkFreq 参考时钟频率
  42. *
  43. * @return none
  44. * @warning FEE_OSC, FBE_OSC 不能用作当前时钟模式.
  45. *
  46. *****************************************************************************/
  47. #define ICS_SwitchMode(CurMode, NewMode, clkFreq) CurMode##_to_##NewMode(clkFreq)
  48. /******************************************************************************
  49. * 定义 OSC 配置结构体
  50. *
  51. *******************************************************************************/
  52. typedef struct
  53. {
  54. uint8_t bRange : 1; /*!< 1: 高频范围, 0: 低频范围 */
  55. uint8_t bGain : 1; /*!< 1: 高增益, 0:低增益 */
  56. uint8_t bEnable : 1; /*!< 1: 使能OSC, 0: 禁用OSC */
  57. uint8_t bStopEnable : 1; /*!< 1: 停止模式下OSC使能, 0: 停止模式下OSC禁用 */
  58. uint8_t bIsCryst : 1; /*!< 1: OSC输出选择振荡器时钟, 0: OSC输出选择来自extal引脚的外部时钟 */
  59. uint8_t bWaitInit : 1; /*!< 1: 等待振荡器初始化完成, 0: 不等待 */
  60. } OSC_ConfigType, *OSC_ConfigPtr;
  61. /******************************************************************************
  62. *
  63. * ICS配置结构体
  64. *
  65. *******************************************************************************/
  66. typedef struct
  67. {
  68. uint8_t u8ClkMode; /*!< 选择时钟模式*/
  69. uint8_t bLPEnable; /*!< 低功耗模式下使能 */
  70. uint32_t u32ClkFreq; /*!< 参考时钟频率 */
  71. OSC_ConfigType oscConfig; /*!< OSC 配置 */
  72. } ICS_ConfigType ;
  73. /*****************************************************************************//*!
  74. *
  75. * @brief 使能中断.
  76. *
  77. * @param none
  78. *
  79. * @return none
  80. *
  81. * @see ICS_DisableInt
  82. *****************************************************************************/
  83. __STATIC_INLINE void ICS_EnableInt(void)
  84. {
  85. ICS->C4 |= (ICS_C4_LOLIE_MASK);
  86. }
  87. /*****************************************************************************//*!
  88. *
  89. * @brief 禁用中断
  90. *
  91. * @param none
  92. *
  93. * @return none
  94. *
  95. * @see ICS_EnableInt
  96. *****************************************************************************/
  97. __STATIC_INLINE void ICS_DisableInt(void)
  98. {
  99. ICS->C4 &= ~(ICS_C4_LOLIE_MASK);
  100. }
  101. /*****************************************************************************//*!
  102. *
  103. * @brief 使能时钟监控
  104. *
  105. * @param none
  106. *
  107. * @return none
  108. *
  109. * @see ICS_DisableClockMonitor
  110. *****************************************************************************/
  111. __STATIC_INLINE void ICS_EnableClockMonitor(void)
  112. {
  113. ICS->C4 |= (ICS_C4_CME_MASK);
  114. }
  115. /*****************************************************************************//*!
  116. *
  117. * @brief 禁用时钟监控
  118. *
  119. * @param none
  120. *
  121. * @return none
  122. *
  123. * @see ICS_EnableClockMonitor
  124. *****************************************************************************/
  125. __STATIC_INLINE void ICS_DisableClockMonitor(void)
  126. {
  127. ICS->C4 &= ~(ICS_C4_CME_MASK);
  128. }
  129. /*****************************************************************************//*!
  130. *
  131. * @brief 设置ICS输出时钟源分频
  132. *
  133. * @param[in] busDivide -- 分频值
  134. *
  135. * @return depends on commands
  136. *****************************************************************************/
  137. __STATIC_INLINE void ICS_SetBusDivider(uint8_t u8BusDivide)
  138. {
  139. ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(u8BusDivide);
  140. }
  141. /*****************************************************************************//*!
  142. *
  143. * @brief 使能OSC
  144. *
  145. * @param none
  146. *
  147. * @return none
  148. *
  149. *****************************************************************************/
  150. __STATIC_INLINE void OSC_Enable(void)
  151. {
  152. OSC->CR |= (OSC_CR_OSCEN_MASK);
  153. }
  154. /*****************************************************************************//*!
  155. *
  156. * @brief 禁用OSC
  157. *
  158. * @param none
  159. *
  160. * @return none
  161. *
  162. *****************************************************************************/
  163. __STATIC_INLINE void OSC_Disable(void)
  164. {
  165. OSC->CR &= ~(OSC_CR_OSCEN_MASK);
  166. }
  167. /*****************************************************************************//*!
  168. *
  169. * @brief 设置OSC模块的频率范围为低频范围
  170. *
  171. * @param none
  172. *
  173. * @return none
  174. *
  175. *****************************************************************************/
  176. __STATIC_INLINE void OSC_SetLowRange(void)
  177. {
  178. OSC->CR &= ~(OSC_CR_RANGE_MASK);
  179. }
  180. /*!***************************************************************************//*!
  181. +FUNCTION----------------------------------------------------------------
  182. *
  183. * @brief 设置OSC模块的频率范围为高频范围
  184. *
  185. * @param none
  186. *
  187. * @return none
  188. *
  189. *****************************************************************************/
  190. __STATIC_INLINE void OSC_SetHighRange(void)
  191. {
  192. OSC->CR |= (OSC_CR_RANGE_MASK);
  193. }
  194. /*****************************************************************************//*!
  195. *
  196. * @brief 设置OSC的工作模式为高增益模式
  197. *
  198. * @param none
  199. *
  200. * @return none
  201. *
  202. *****************************************************************************/
  203. __STATIC_INLINE void OSC_SetHighGain(void)
  204. {
  205. OSC->CR |= (OSC_CR_HGO_MASK);
  206. }
  207. /*****************************************************************************//*!
  208. *
  209. * @brief 设置OSC的工作模式为低功耗模式
  210. *
  211. * @param none
  212. *
  213. * @return none
  214. *
  215. *****************************************************************************/
  216. __STATIC_INLINE void OSC_SetLowGain(void)
  217. {
  218. OSC->CR &= ~(OSC_CR_HGO_MASK);
  219. }
  220. /*****************************************************************************//*!
  221. *
  222. * @brief 选择OSC模块的输出时钟源为振荡器时钟源
  223. *
  224. * @param none
  225. *
  226. * @return none
  227. *
  228. *****************************************************************************/
  229. __STATIC_INLINE void OSC_SelectCrystal(void)
  230. {
  231. OSC->CR |= (OSC_CR_OSCOS_MASK);
  232. }
  233. /*****************************************************************************//*!
  234. *
  235. * @brief OSC输出选择来自extal引脚的外部时钟
  236. *
  237. * @param none
  238. *
  239. * @return none
  240. *
  241. *****************************************************************************/
  242. __STATIC_INLINE void OSC_SelectClock(void)
  243. {
  244. OSC->CR &= ~(OSC_CR_OSCOS_MASK);
  245. }
  246. /*****************************************************************************//*!
  247. *
  248. * @brief 在停止模式下OSC模块使能
  249. *
  250. * @param none
  251. *
  252. * @return none
  253. *
  254. *****************************************************************************/
  255. __STATIC_INLINE void OSC_ActiveInStop(void)
  256. {
  257. OSC->CR |= (OSC_CR_OSCSTEN_MASK);
  258. }
  259. /*****************************************************************************//*!
  260. *
  261. * @brief 在停止模式下OSC模块禁用
  262. *
  263. * @param none
  264. *
  265. * @return none
  266. *
  267. *****************************************************************************/
  268. __STATIC_INLINE void OSC_InactiveInStop(void)
  269. {
  270. OSC->CR &= ~(OSC_CR_OSCSTEN_MASK);
  271. }
  272. /******************************************************************************/
  273. void ICS_Init(ICS_ConfigType *pConfig);
  274. void ICS_DeInit(void);
  275. void ICS_SetClkDivider(uint32_t u32ClkFreqKHz);
  276. void ICS_Trim(uint16 u16TrimValue);
  277. void OSC_Init(OSC_ConfigType *pConfig);
  278. void OSC_DeInit(void);
  279. /************** 内联函数 ******************/
  280. void ICS_DisableClockMonitor(void);
  281. void ICS_DisableInt(void);
  282. void ICS_EnableClockMonitor(void);
  283. void ICS_EnableInt(void);
  284. void ICS_SetBusDivider(uint8_t u8BusDivide);
  285. void OSC_ActiveInStop(void);
  286. void OSC_Enable(void);
  287. void OSC_Disable(void);
  288. void OSC_InactiveInStop(void);
  289. void OSC_SelectClock(void);
  290. void OSC_SelectCrystal(void);
  291. void OSC_SetHighGain(void);
  292. void OSC_SetHighRange(void);
  293. void OSC_SetLowGain(void);
  294. void OSC_SetLowRange(void);
  295. /* do not touch the following functions */
  296. void FEI_to_FEE(ICS_ConfigType *pConfig);
  297. void FEI_to_FBI(ICS_ConfigType *pConfig);
  298. void FEI_to_FBE(ICS_ConfigType *pConfig);
  299. void FEE_to_FBI(ICS_ConfigType *pConfig);
  300. void FEE_to_FEI(ICS_ConfigType *pConfig);
  301. void FEE_to_FBE(ICS_ConfigType *pConfig);
  302. void FBE_to_FEE(ICS_ConfigType *pConfig);
  303. void FBE_to_FEI(ICS_ConfigType *pConfig);
  304. void FBE_to_FBI(ICS_ConfigType *pConfig);
  305. void FBE_to_FBELP(ICS_ConfigType *pConfig);
  306. void FBI_to_FEI(ICS_ConfigType *pConfig);
  307. void FBI_to_FBE(ICS_ConfigType *pConfig);
  308. void FBI_to_FEE(ICS_ConfigType *pConfig);
  309. void FBI_to_FBILP(ICS_ConfigType *pConfig);
  310. void FBILP_to_FBI(ICS_ConfigType *pConfig);
  311. void FBELP_to_FBE(ICS_ConfigType *pConfig);
  312. void FEI_to_FBE_OSC(ICS_ConfigType *pConfig);
  313. void FEI_to_FEE_OSC(ICS_ConfigType *pConfig);
  314. #ifdef __cplusplus
  315. }
  316. #endif
  317. #endif