efm32_cmu.h 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819
  1. /***************************************************************************//**
  2. * @file
  3. * @brief Clock management unit (CMU) API for EFM32.
  4. * @author Energy Micro AS
  5. * @version 2.3.2
  6. *******************************************************************************
  7. * @section License
  8. * <b>(C) Copyright 2011 Energy Micro AS, http://www.energymicro.com</b>
  9. *******************************************************************************
  10. *
  11. * This source code is the property of Energy Micro AS. The source and compiled
  12. * code may only be used on Energy Micro "EFM32" microcontrollers.
  13. *
  14. * This copyright notice may not be removed from the source code nor changed.
  15. *
  16. * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Energy Micro AS has no
  17. * obligation to support this Software. Energy Micro AS is providing the
  18. * Software "AS IS", with no express or implied warranties of any kind,
  19. * including, but not limited to, any implied warranties of merchantability
  20. * or fitness for any particular purpose or warranties against infringement
  21. * of any proprietary rights of a third party.
  22. *
  23. * Energy Micro AS will not be liable for any consequential, incidental, or
  24. * special damages, or any other relief, or for any claim by any third party,
  25. * arising from your use of this Software.
  26. *
  27. ******************************************************************************/
  28. #ifndef __EFM32_CMU_H
  29. #define __EFM32_CMU_H
  30. #include <stdbool.h>
  31. #include "efm32.h"
  32. #include "efm32_bitband.h"
  33. #ifdef __cplusplus
  34. extern "C" {
  35. #endif
  36. /***************************************************************************//**
  37. * @addtogroup EFM32_Library
  38. * @{
  39. ******************************************************************************/
  40. /***************************************************************************//**
  41. * @addtogroup CMU
  42. * @{
  43. ******************************************************************************/
  44. /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
  45. /* Select register ids, for internal use */
  46. #define CMU_NOSEL_REG 0
  47. #define CMU_HFCLKSEL_REG 1
  48. #define CMU_LFACLKSEL_REG 2
  49. #define CMU_LFBCLKSEL_REG 3
  50. #define CMU_DBGCLKSEL_REG 4
  51. #if defined (_EFM32_GIANT_FAMILY)
  52. #define CMU_USBCCLKSEL_REG 5
  53. #endif
  54. #define CMU_SEL_REG_POS 0
  55. #define CMU_SEL_REG_MASK 0xf
  56. /* Divisor register ids, for internal use */
  57. #define CMU_NODIV_REG 0
  58. #define CMU_HFPERCLKDIV_REG 1
  59. #define CMU_HFCORECLKDIV_REG 2
  60. #define CMU_LFAPRESC0_REG 3
  61. #define CMU_LFBPRESC0_REG 4
  62. #if defined (_EFM32_GIANT_FAMILY)
  63. #define CMU_HFCLKDIV_REG 5
  64. #endif
  65. #define CMU_DIV_REG_POS 4
  66. #define CMU_DIV_REG_MASK 0xf
  67. /* Enable register ids, for internal use */
  68. #define CMU_NO_EN_REG 0
  69. #define CMU_HFPERCLKDIV_EN_REG 1
  70. #define CMU_HFPERCLKEN0_EN_REG 2
  71. #define CMU_HFCORECLKEN0_EN_REG 3
  72. #define CMU_LFACLKEN0_EN_REG 4
  73. #define CMU_LFBCLKEN0_EN_REG 5
  74. #define CMU_PCNT_EN_REG 6
  75. #define CMU_EN_REG_POS 8
  76. #define CMU_EN_REG_MASK 0xf
  77. /* Enable register bit position, for internal use */
  78. #define CMU_EN_BIT_POS 12
  79. #define CMU_EN_BIT_MASK 0x1f
  80. /* Clock branch bitfield position, for internal use */
  81. #define CMU_HF_CLK_BRANCH 0
  82. #define CMU_HFPER_CLK_BRANCH 1
  83. #define CMU_HFCORE_CLK_BRANCH 2
  84. #define CMU_LFA_CLK_BRANCH 3
  85. #define CMU_RTC_CLK_BRANCH 4
  86. #define CMU_LETIMER_CLK_BRANCH 5
  87. #define CMU_LCDPRE_CLK_BRANCH 6
  88. #define CMU_LCD_CLK_BRANCH 7
  89. #define CMU_LESENSE_CLK_BRANCH 8
  90. #define CMU_LFB_CLK_BRANCH 9
  91. #define CMU_LEUART0_CLK_BRANCH 10
  92. #define CMU_LEUART1_CLK_BRANCH 11
  93. #define CMU_DBG_CLK_BRANCH 12
  94. #define CMU_AUX_CLK_BRANCH 13
  95. #define CMU_USBC_CLK_BRANCH 14
  96. #define CMU_CLK_BRANCH_POS 17
  97. #define CMU_CLK_BRANCH_MASK 0x1f
  98. /** @endcond */
  99. /*******************************************************************************
  100. ******************************** ENUMS ************************************
  101. ******************************************************************************/
  102. /** Clock divisors. These values are valid for prescalers. */
  103. #define cmuClkDiv_1 1 /**< Divide clock by 1. */
  104. #define cmuClkDiv_2 2 /**< Divide clock by 2. */
  105. #define cmuClkDiv_4 4 /**< Divide clock by 4. */
  106. #define cmuClkDiv_8 8 /**< Divide clock by 8. */
  107. #define cmuClkDiv_16 16 /**< Divide clock by 16. */
  108. #define cmuClkDiv_32 32 /**< Divide clock by 32. */
  109. #define cmuClkDiv_64 64 /**< Divide clock by 64. */
  110. #define cmuClkDiv_128 128 /**< Divide clock by 128. */
  111. #define cmuClkDiv_256 256 /**< Divide clock by 256. */
  112. #define cmuClkDiv_512 512 /**< Divide clock by 512. */
  113. #define cmuClkDiv_1024 1024 /**< Divide clock by 1024. */
  114. #define cmuClkDiv_2048 2048 /**< Divide clock by 2048. */
  115. #define cmuClkDiv_4096 4096 /**< Divide clock by 4096. */
  116. #define cmuClkDiv_8192 8192 /**< Divide clock by 8192. */
  117. #define cmuClkDiv_16384 16384 /**< Divide clock by 16384. */
  118. #define cmuClkDiv_32768 32768 /**< Divide clock by 32768. */
  119. /** Clock divider configuration */
  120. typedef uint32_t CMU_ClkDiv_TypeDef;
  121. /** High frequency RC bands. */
  122. typedef enum
  123. {
  124. /** 1MHz RC band. */
  125. cmuHFRCOBand_1MHz = _CMU_HFRCOCTRL_BAND_1MHZ,
  126. /** 7MHz RC band. */
  127. cmuHFRCOBand_7MHz = _CMU_HFRCOCTRL_BAND_7MHZ,
  128. /** 11MHz RC band. */
  129. cmuHFRCOBand_11MHz = _CMU_HFRCOCTRL_BAND_11MHZ,
  130. /** 14MHz RC band. */
  131. cmuHFRCOBand_14MHz = _CMU_HFRCOCTRL_BAND_14MHZ,
  132. /** 21MHz RC band. */
  133. cmuHFRCOBand_21MHz = _CMU_HFRCOCTRL_BAND_21MHZ,
  134. /** 28MHz RC band. */
  135. cmuHFRCOBand_28MHz = _CMU_HFRCOCTRL_BAND_28MHZ
  136. } CMU_HFRCOBand_TypeDef;
  137. #if defined(_EFM32_TINY_FAMILY) || defined(_EFM32_GIANT_FAMILY)
  138. /** AUX High frequency RC bands. */
  139. typedef enum
  140. {
  141. /** 1MHz RC band. */
  142. cmuAUXHFRCOBand_1MHz = _CMU_AUXHFRCOCTRL_BAND_1MHZ,
  143. /** 7MHz RC band. */
  144. cmuAUXHFRCOBand_7MHz = _CMU_AUXHFRCOCTRL_BAND_7MHZ,
  145. /** 11MHz RC band. */
  146. cmuAUXHFRCOBand_11MHz = _CMU_AUXHFRCOCTRL_BAND_11MHZ,
  147. /** 14MHz RC band. */
  148. cmuAUXHFRCOBand_14MHz = _CMU_AUXHFRCOCTRL_BAND_14MHZ,
  149. /** 21MHz RC band. */
  150. cmuAUXHFRCOBand_21MHz = _CMU_AUXHFRCOCTRL_BAND_21MHZ,
  151. /** 28MHz RC band. */
  152. cmuAUXHFRCOBand_28MHz = _CMU_AUXHFRCOCTRL_BAND_28MHZ
  153. } CMU_AUXHFRCOBand_TypeDef;
  154. #endif
  155. /** Clock points in CMU. Please refer to CMU overview in reference manual. */
  156. typedef enum
  157. {
  158. /*******************/
  159. /* HF clock branch */
  160. /*******************/
  161. /** High frequency clock */
  162. #if defined(_EFM32_GIANT_FAMILY)
  163. cmuClock_HF = (CMU_HFCLKDIV_REG << CMU_DIV_REG_POS) |
  164. (CMU_HFCLKSEL_REG << CMU_SEL_REG_POS) |
  165. (CMU_NO_EN_REG << CMU_EN_REG_POS) |
  166. (0 << CMU_EN_BIT_POS) |
  167. (CMU_HF_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  168. #else
  169. cmuClock_HF = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  170. (CMU_HFCLKSEL_REG << CMU_SEL_REG_POS) |
  171. (CMU_NO_EN_REG << CMU_EN_REG_POS) |
  172. (0 << CMU_EN_BIT_POS) |
  173. (CMU_HF_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  174. #endif
  175. /** Debug clock */
  176. cmuClock_DBG = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  177. (CMU_DBGCLKSEL_REG << CMU_SEL_REG_POS) |
  178. (CMU_NO_EN_REG << CMU_EN_REG_POS) |
  179. (0 << CMU_EN_BIT_POS) |
  180. (CMU_DBG_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  181. /** AUX clock */
  182. cmuClock_AUX = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  183. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  184. (CMU_NO_EN_REG << CMU_EN_REG_POS) |
  185. (0 << CMU_EN_BIT_POS) |
  186. (CMU_AUX_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  187. /**********************************/
  188. /* HF peripheral clock sub-branch */
  189. /**********************************/
  190. /** High frequency peripheral clock */
  191. cmuClock_HFPER = (CMU_HFPERCLKDIV_REG << CMU_DIV_REG_POS) |
  192. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  193. (CMU_HFPERCLKDIV_EN_REG << CMU_EN_REG_POS) |
  194. (_CMU_HFPERCLKDIV_HFPERCLKEN_SHIFT << CMU_EN_BIT_POS) |
  195. (CMU_HFPER_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  196. /** Universal sync/async receiver/transmitter 0 clock. */
  197. #if defined(_CMU_HFPERCLKEN0_USART0_MASK)
  198. cmuClock_USART0 = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  199. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  200. (CMU_HFPERCLKEN0_EN_REG << CMU_EN_REG_POS) |
  201. (_CMU_HFPERCLKEN0_USART0_SHIFT << CMU_EN_BIT_POS) |
  202. (CMU_HFPER_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  203. #endif
  204. /** Universal sync/async receiver/transmitter 1 clock. */
  205. #if defined(_CMU_HFPERCLKEN0_USART1_MASK)
  206. cmuClock_USART1 = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  207. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  208. (CMU_HFPERCLKEN0_EN_REG << CMU_EN_REG_POS) |
  209. (_CMU_HFPERCLKEN0_USART1_SHIFT << CMU_EN_BIT_POS) |
  210. (CMU_HFPER_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  211. #endif
  212. /** Universal sync/async receiver/transmitter 2 clock. */
  213. #if defined(_CMU_HFPERCLKEN0_USART2_MASK)
  214. cmuClock_USART2 = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  215. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  216. (CMU_HFPERCLKEN0_EN_REG << CMU_EN_REG_POS) |
  217. (_CMU_HFPERCLKEN0_USART2_SHIFT << CMU_EN_BIT_POS) |
  218. (CMU_HFPER_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  219. #endif
  220. /** Universal async receiver/transmitter 0 clock. */
  221. #if defined(_CMU_HFPERCLKEN0_UART0_MASK)
  222. cmuClock_UART0 = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  223. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  224. (CMU_HFPERCLKEN0_EN_REG << CMU_EN_REG_POS) |
  225. (_CMU_HFPERCLKEN0_UART0_SHIFT << CMU_EN_BIT_POS) |
  226. (CMU_HFPER_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  227. #endif
  228. /** Universal async receiver/transmitter 1 clock. */
  229. #if defined(_CMU_HFPERCLKEN0_UART1_MASK)
  230. cmuClock_UART1 = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  231. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  232. (CMU_HFPERCLKEN0_EN_REG << CMU_EN_REG_POS) |
  233. (_CMU_HFPERCLKEN0_UART1_SHIFT << CMU_EN_BIT_POS) |
  234. (CMU_HFPER_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  235. #endif
  236. /** Timer 0 clock. */
  237. #if defined(_CMU_HFPERCLKEN0_TIMER0_MASK)
  238. cmuClock_TIMER0 = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  239. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  240. (CMU_HFPERCLKEN0_EN_REG << CMU_EN_REG_POS) |
  241. (_CMU_HFPERCLKEN0_TIMER0_SHIFT << CMU_EN_BIT_POS) |
  242. (CMU_HFPER_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  243. #endif
  244. /** Timer 1 clock. */
  245. #if defined(_CMU_HFPERCLKEN0_TIMER1_MASK)
  246. cmuClock_TIMER1 = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  247. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  248. (CMU_HFPERCLKEN0_EN_REG << CMU_EN_REG_POS) |
  249. (_CMU_HFPERCLKEN0_TIMER1_SHIFT << CMU_EN_BIT_POS) |
  250. (CMU_HFPER_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  251. #endif
  252. /** Timer 2 clock. */
  253. #if defined(_CMU_HFPERCLKEN0_TIMER2_MASK)
  254. cmuClock_TIMER2 = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  255. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  256. (CMU_HFPERCLKEN0_EN_REG << CMU_EN_REG_POS) |
  257. (_CMU_HFPERCLKEN0_TIMER2_SHIFT << CMU_EN_BIT_POS) |
  258. (CMU_HFPER_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  259. #endif
  260. /** Analog comparator 0 clock. */
  261. #if defined(_CMU_HFPERCLKEN0_ACMP0_MASK)
  262. cmuClock_ACMP0 = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  263. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  264. (CMU_HFPERCLKEN0_EN_REG << CMU_EN_REG_POS) |
  265. (_CMU_HFPERCLKEN0_ACMP0_SHIFT << CMU_EN_BIT_POS) |
  266. (CMU_HFPER_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  267. #endif
  268. /** Analog comparator 1 clock. */
  269. #if defined(_CMU_HFPERCLKEN0_ACMP1_MASK)
  270. cmuClock_ACMP1 = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  271. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  272. (CMU_HFPERCLKEN0_EN_REG << CMU_EN_REG_POS) |
  273. (_CMU_HFPERCLKEN0_ACMP1_SHIFT << CMU_EN_BIT_POS) |
  274. (CMU_HFPER_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  275. #endif
  276. /** Peripheral reflex system clock. */
  277. #if defined(_CMU_HFPERCLKEN0_PRS_MASK)
  278. cmuClock_PRS = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  279. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  280. (CMU_HFPERCLKEN0_EN_REG << CMU_EN_REG_POS) |
  281. (_CMU_HFPERCLKEN0_PRS_SHIFT << CMU_EN_BIT_POS) |
  282. (CMU_HFPER_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  283. #endif
  284. /** Digital to analog converter 0 clock. */
  285. #if defined(_CMU_HFPERCLKEN0_DAC0_MASK)
  286. cmuClock_DAC0 = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  287. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  288. (CMU_HFPERCLKEN0_EN_REG << CMU_EN_REG_POS) |
  289. (_CMU_HFPERCLKEN0_DAC0_SHIFT << CMU_EN_BIT_POS) |
  290. (CMU_HFPER_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  291. #endif
  292. /** General purpose input/output clock. */
  293. #if defined(GPIO_PRESENT)
  294. cmuClock_GPIO = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  295. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  296. (CMU_HFPERCLKEN0_EN_REG << CMU_EN_REG_POS) |
  297. (_CMU_HFPERCLKEN0_GPIO_SHIFT << CMU_EN_BIT_POS) |
  298. (CMU_HFPER_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  299. #endif
  300. /** Voltage comparator clock. */
  301. #if defined(VCMP_PRESENT)
  302. cmuClock_VCMP = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  303. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  304. (CMU_HFPERCLKEN0_EN_REG << CMU_EN_REG_POS) |
  305. (_CMU_HFPERCLKEN0_VCMP_SHIFT << CMU_EN_BIT_POS) |
  306. (CMU_HFPER_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  307. #endif
  308. /** Analog to digital converter 0 clock. */
  309. #if defined(_CMU_HFPERCLKEN0_ADC0_MASK)
  310. cmuClock_ADC0 = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  311. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  312. (CMU_HFPERCLKEN0_EN_REG << CMU_EN_REG_POS) |
  313. (_CMU_HFPERCLKEN0_ADC0_SHIFT << CMU_EN_BIT_POS) |
  314. (CMU_HFPER_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  315. #endif
  316. /** I2C 0 clock. */
  317. #if defined(_CMU_HFPERCLKEN0_I2C0_MASK)
  318. cmuClock_I2C0 = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  319. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  320. (CMU_HFPERCLKEN0_EN_REG << CMU_EN_REG_POS) |
  321. (_CMU_HFPERCLKEN0_I2C0_SHIFT << CMU_EN_BIT_POS) |
  322. (CMU_HFPER_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  323. #endif
  324. /** I2C 1 clock. */
  325. #if defined(_CMU_HFPERCLKEN0_I2C1_MASK)
  326. cmuClock_I2C1 = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  327. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  328. (CMU_HFPERCLKEN0_EN_REG << CMU_EN_REG_POS) |
  329. (_CMU_HFPERCLKEN0_I2C1_SHIFT << CMU_EN_BIT_POS) |
  330. (CMU_HFPER_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  331. #endif
  332. /**********************/
  333. /* HF core sub-branch */
  334. /**********************/
  335. /** Core clock */
  336. cmuClock_CORE = (CMU_HFCORECLKDIV_REG << CMU_DIV_REG_POS) |
  337. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  338. (CMU_NO_EN_REG << CMU_EN_REG_POS) |
  339. (0 << CMU_EN_BIT_POS) |
  340. (CMU_HFCORE_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  341. /** Advanced encryption standard accelerator clock. */
  342. #if defined(AES_PRESENT)
  343. cmuClock_AES = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  344. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  345. (CMU_HFCORECLKEN0_EN_REG << CMU_EN_REG_POS) |
  346. (_CMU_HFCORECLKEN0_AES_SHIFT << CMU_EN_BIT_POS) |
  347. (CMU_HFCORE_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  348. #endif
  349. /** Direct memory access controller clock. */
  350. #if defined(DMA_PRESENT)
  351. cmuClock_DMA = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  352. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  353. (CMU_HFCORECLKEN0_EN_REG << CMU_EN_REG_POS) |
  354. (_CMU_HFCORECLKEN0_DMA_SHIFT << CMU_EN_BIT_POS) |
  355. (CMU_HFCORE_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  356. #endif
  357. /** Low energy clocking module clock. */
  358. cmuClock_CORELE = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  359. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  360. (CMU_HFCORECLKEN0_EN_REG << CMU_EN_REG_POS) |
  361. (_CMU_HFCORECLKEN0_LE_SHIFT << CMU_EN_BIT_POS) |
  362. (CMU_HFCORE_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  363. /** External bus interface clock. */
  364. #if defined(EBI_PRESENT)
  365. cmuClock_EBI = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  366. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  367. (CMU_HFCORECLKEN0_EN_REG << CMU_EN_REG_POS) |
  368. (_CMU_HFCORECLKEN0_EBI_SHIFT << CMU_EN_BIT_POS) |
  369. (CMU_HFCORE_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  370. #endif
  371. #if defined(USB_PRESENT)
  372. cmuClock_USBC = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  373. (CMU_USBCCLKSEL_REG << CMU_SEL_REG_POS) |
  374. (CMU_HFCORECLKEN0_EN_REG << CMU_EN_REG_POS) |
  375. (_CMU_HFCORECLKEN0_USBC_SHIFT << CMU_EN_BIT_POS) |
  376. (CMU_USBC_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  377. cmuClock_USB = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  378. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  379. (CMU_HFCORECLKEN0_EN_REG << CMU_EN_REG_POS) |
  380. (_CMU_HFCORECLKEN0_USB_SHIFT << CMU_EN_BIT_POS) |
  381. (CMU_HFCORE_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  382. #endif
  383. /***************/
  384. /* LF A branch */
  385. /***************/
  386. /** Low frequency A clock */
  387. cmuClock_LFA = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  388. (CMU_LFACLKSEL_REG << CMU_SEL_REG_POS) |
  389. (CMU_NO_EN_REG << CMU_EN_REG_POS) |
  390. (0 << CMU_EN_BIT_POS) |
  391. (CMU_LFA_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  392. /** Real time counter clock. */
  393. #if defined(RTC_PRESENT)
  394. cmuClock_RTC = (CMU_LFAPRESC0_REG << CMU_DIV_REG_POS) |
  395. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  396. (CMU_LFACLKEN0_EN_REG << CMU_EN_REG_POS) |
  397. (_CMU_LFACLKEN0_RTC_SHIFT << CMU_EN_BIT_POS) |
  398. (CMU_RTC_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  399. #endif
  400. /** Low energy timer 0 clock. */
  401. #if defined(_CMU_LFACLKEN0_LETIMER0_MASK)
  402. cmuClock_LETIMER0 = (CMU_LFAPRESC0_REG << CMU_DIV_REG_POS) |
  403. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  404. (CMU_LFACLKEN0_EN_REG << CMU_EN_REG_POS) |
  405. (_CMU_LFACLKEN0_LETIMER0_SHIFT << CMU_EN_BIT_POS) |
  406. (CMU_LETIMER_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  407. #endif
  408. /** Liquid crystal display, pre FDIV clock. */
  409. #if defined(_CMU_LFACLKEN0_LCD_MASK)
  410. cmuClock_LCDpre = (CMU_LFAPRESC0_REG << CMU_DIV_REG_POS) |
  411. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  412. (CMU_NO_EN_REG << CMU_EN_REG_POS) |
  413. (0 << CMU_EN_BIT_POS) |
  414. (CMU_LCDPRE_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  415. /** Liquid crystal display clock. Please notice that FDIV prescaler
  416. * must be set by special API. */
  417. cmuClock_LCD = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  418. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  419. (CMU_LFACLKEN0_EN_REG << CMU_EN_REG_POS) |
  420. (_CMU_LFACLKEN0_LCD_SHIFT << CMU_EN_BIT_POS) |
  421. (CMU_LCD_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  422. #endif
  423. /** Pulse counter 0 clock. */
  424. #if defined(_CMU_PCNTCTRL_PCNT0CLKEN_MASK)
  425. cmuClock_PCNT0 = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  426. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  427. (CMU_PCNT_EN_REG << CMU_EN_REG_POS) |
  428. (_CMU_PCNTCTRL_PCNT0CLKEN_SHIFT << CMU_EN_BIT_POS) |
  429. (CMU_LFA_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  430. #endif
  431. /** Pulse counter 1 clock. */
  432. #if defined(_CMU_PCNTCTRL_PCNT1CLKEN_MASK)
  433. cmuClock_PCNT1 = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  434. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  435. (CMU_PCNT_EN_REG << CMU_EN_REG_POS) |
  436. (_CMU_PCNTCTRL_PCNT1CLKEN_SHIFT << CMU_EN_BIT_POS) |
  437. (CMU_LFA_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  438. #endif
  439. /** Pulse counter 2 clock. */
  440. #if defined(_CMU_PCNTCTRL_PCNT2CLKEN_MASK)
  441. cmuClock_PCNT2 = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  442. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  443. (CMU_PCNT_EN_REG << CMU_EN_REG_POS) |
  444. (_CMU_PCNTCTRL_PCNT2CLKEN_SHIFT << CMU_EN_BIT_POS) |
  445. (CMU_LFA_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  446. #endif
  447. /** LESENSE clock. */
  448. #if defined(_CMU_LFACLKEN0_LESENSE_MASK)
  449. cmuClock_LESENSE = (CMU_LFAPRESC0_REG << CMU_DIV_REG_POS) |
  450. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  451. (CMU_LFACLKEN0_EN_REG << CMU_EN_REG_POS) |
  452. (_CMU_LFACLKEN0_LESENSE_SHIFT << CMU_EN_BIT_POS) |
  453. (CMU_LESENSE_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  454. #endif
  455. /***************/
  456. /* LF B branch */
  457. /***************/
  458. /** Low frequency B clock */
  459. cmuClock_LFB = (CMU_NODIV_REG << CMU_DIV_REG_POS) |
  460. (CMU_LFBCLKSEL_REG << CMU_SEL_REG_POS) |
  461. (CMU_NO_EN_REG << CMU_EN_REG_POS) |
  462. (0 << CMU_EN_BIT_POS) |
  463. (CMU_LFB_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  464. /** Low energy universal asynchronous receiver/transmitter 0 clock. */
  465. #if defined(_CMU_LFBCLKEN0_LEUART0_MASK)
  466. cmuClock_LEUART0 = (CMU_LFBPRESC0_REG << CMU_DIV_REG_POS) |
  467. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  468. (CMU_LFBCLKEN0_EN_REG << CMU_EN_REG_POS) |
  469. (_CMU_LFBCLKEN0_LEUART0_SHIFT << CMU_EN_BIT_POS) |
  470. (CMU_LEUART0_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  471. #endif
  472. /** Low energy universal asynchronous receiver/transmitter 1 clock. */
  473. #if defined(_CMU_LFBCLKEN0_LEUART1_MASK)
  474. cmuClock_LEUART1 = (CMU_LFBPRESC0_REG << CMU_DIV_REG_POS) |
  475. (CMU_NOSEL_REG << CMU_SEL_REG_POS) |
  476. (CMU_LFBCLKEN0_EN_REG << CMU_EN_REG_POS) |
  477. (_CMU_LFBCLKEN0_LEUART1_SHIFT << CMU_EN_BIT_POS) |
  478. (CMU_LEUART1_CLK_BRANCH << CMU_CLK_BRANCH_POS),
  479. #endif
  480. } CMU_Clock_TypeDef;
  481. /** Oscillator types. */
  482. typedef enum
  483. {
  484. cmuOsc_LFXO, /**< Low frequency crystal oscillator. */
  485. cmuOsc_LFRCO, /**< Low frequency RC oscillator. */
  486. cmuOsc_HFXO, /**< High frequency crystal oscillator. */
  487. cmuOsc_HFRCO, /**< High frequency RC oscillator. */
  488. cmuOsc_AUXHFRCO, /**< Auxiliary high frequency RC oscillator. */
  489. #if defined(_EFM32_TINY_FAMILY) || defined(_EFM32_GIANT_FAMILY)
  490. cmuOsc_ULFRCO /**< Ultra low frequency RC oscillator. */
  491. #endif
  492. } CMU_Osc_TypeDef;
  493. /** Selectable clock sources. */
  494. typedef enum
  495. {
  496. cmuSelect_Error, /**< Usage error. */
  497. cmuSelect_Disabled, /**< Clock selector disabled. */
  498. cmuSelect_LFXO, /**< Low frequency crystal oscillator. */
  499. cmuSelect_LFRCO, /**< Low frequency RC oscillator. */
  500. cmuSelect_HFXO, /**< High frequency crystal oscillator. */
  501. cmuSelect_HFRCO, /**< High frequency RC oscillator. */
  502. cmuSelect_CORELEDIV2, /**< Core low energy clock divided by 2. */
  503. cmuSelect_AUXHFRCO, /**< Auxilliary clock source can be used for debug clock */
  504. cmuSelect_HFCLK, /**< Divided HFCLK on Giant for debug clock, undivided on Tiny Gecko and for USBC (not used on Gecko) */
  505. #if defined(_EFM32_TINY_FAMILY) || defined(_EFM32_GIANT_FAMILY)
  506. cmuSelect_ULFRCO, /**< Ultra low frequency RC oscillator. */
  507. #endif
  508. } CMU_Select_TypeDef;
  509. /*******************************************************************************
  510. ***************************** PROTOTYPES **********************************
  511. ******************************************************************************/
  512. void CMU_ClockEnable(CMU_Clock_TypeDef clock, bool enable);
  513. uint32_t CMU_ClockFreqGet(CMU_Clock_TypeDef clock);
  514. CMU_ClkDiv_TypeDef CMU_ClockDivGet(CMU_Clock_TypeDef clock);
  515. CMU_Select_TypeDef CMU_ClockSelectGet(CMU_Clock_TypeDef clock);
  516. void CMU_ClockDivSet(CMU_Clock_TypeDef clock, CMU_ClkDiv_TypeDef div);
  517. void CMU_ClockSelectSet(CMU_Clock_TypeDef clock, CMU_Select_TypeDef ref);
  518. CMU_HFRCOBand_TypeDef CMU_HFRCOBandGet(void);
  519. void CMU_HFRCOBandSet(CMU_HFRCOBand_TypeDef band);
  520. #if defined(_EFM32_TINY_FAMILY) || defined(_EFM32_GIANT_FAMILY)
  521. CMU_AUXHFRCOBand_TypeDef CMU_AUXHFRCOBandGet(void);
  522. void CMU_AUXHFRCOBandSet(CMU_AUXHFRCOBand_TypeDef band);
  523. #endif
  524. void CMU_HFRCOStartupDelaySet(uint32_t delay);
  525. uint32_t CMU_HFRCOStartupDelayGet(void);
  526. void CMU_OscillatorEnable(CMU_Osc_TypeDef osc, bool enable, bool wait);
  527. uint32_t CMU_OscillatorTuningGet(CMU_Osc_TypeDef osc);
  528. void CMU_OscillatorTuningSet(CMU_Osc_TypeDef osc, uint32_t val);
  529. bool CMU_PCNTClockExternalGet(unsigned int inst);
  530. void CMU_PCNTClockExternalSet(unsigned int inst, bool external);
  531. uint32_t CMU_LCDClkFDIVGet(void);
  532. void CMU_LCDClkFDIVSet(uint32_t div);
  533. void CMU_FreezeEnable(bool enable);
  534. uint32_t CMU_Calibrate(uint32_t HFCycles, CMU_Osc_TypeDef reference);
  535. void CMU_CalibrateConfig(uint32_t downCycles, CMU_Osc_TypeDef downSel,
  536. CMU_Osc_TypeDef upSel);
  537. /***************************************************************************//**
  538. * @brief
  539. * Clear one or more pending CMU interrupts.
  540. *
  541. * @param[in] flags
  542. * CMU interrupt sources to clear.
  543. ******************************************************************************/
  544. static __INLINE void CMU_IntClear(uint32_t flags)
  545. {
  546. CMU->IFC = flags;
  547. }
  548. /***************************************************************************//**
  549. * @brief
  550. * Disable one or more CMU interrupts.
  551. *
  552. * @param[in] flags
  553. * CMU interrupt sources to disable.
  554. ******************************************************************************/
  555. static __INLINE void CMU_IntDisable(uint32_t flags)
  556. {
  557. CMU->IEN &= ~flags;
  558. }
  559. /***************************************************************************//**
  560. * @brief
  561. * Enable one or more CMU interrupts.
  562. *
  563. * @note
  564. * Depending on the use, a pending interrupt may already be set prior to
  565. * enabling the interrupt. Consider using CMU_IntClear() prior to enabling
  566. * if such a pending interrupt should be ignored.
  567. *
  568. * @param[in] flags
  569. * CMU interrupt sources to enable.
  570. ******************************************************************************/
  571. static __INLINE void CMU_IntEnable(uint32_t flags)
  572. {
  573. CMU->IEN |= flags;
  574. }
  575. /***************************************************************************//**
  576. * @brief
  577. * Get pending CMU interrupts.
  578. *
  579. * @return
  580. * CMU interrupt sources pending.
  581. ******************************************************************************/
  582. static __INLINE uint32_t CMU_IntGet(void)
  583. {
  584. return CMU->IF;
  585. }
  586. /***************************************************************************//**
  587. * @brief
  588. * Get enabled and pending CMU interrupt flags.
  589. *
  590. * @details
  591. * Useful for handling more interrupt sources in the same interrupt handler.
  592. *
  593. * @note
  594. * The event bits are not cleared by the use of this function.
  595. *
  596. * @return
  597. * Pending and enabled CMU interrupt sources.
  598. * The return value is the bitwise AND combination of
  599. * - the OR combination of enabled interrupt sources in CMU_IEN_nnn
  600. * register (CMU_IEN_nnn) and
  601. * - the OR combination of valid interrupt flags of the CMU module
  602. * (CMU_IF_nnn).
  603. ******************************************************************************/
  604. static __INLINE uint32_t CMU_IntGetEnabled(void)
  605. {
  606. uint32_t tmp = 0U;
  607. /* Store LESENSE->IEN in temporary variable in order to define explicit order
  608. * of volatile accesses. */
  609. tmp = CMU->IEN;
  610. /* Bitwise AND of pending and enabled interrupts */
  611. return CMU->IF & tmp;
  612. }
  613. /**************************************************************************//**
  614. * @brief
  615. * Set one or more pending CMU interrupts from SW.
  616. *
  617. * @param[in] flags
  618. * CMU interrupt sources to set to pending.
  619. *****************************************************************************/
  620. static __INLINE void CMU_IntSet(uint32_t flags)
  621. {
  622. CMU->IFS = flags;
  623. }
  624. /***************************************************************************//**
  625. * @brief
  626. * Lock the CMU in order to protect some of its registers against unintended
  627. * modification.
  628. *
  629. * @details
  630. * Please refer to the reference manual for CMU registers that will be
  631. * locked.
  632. *
  633. * @note
  634. * If locking the CMU registers, they must be unlocked prior to using any
  635. * CMU API functions modifying CMU registers protected by the lock.
  636. ******************************************************************************/
  637. static __INLINE void CMU_Lock(void)
  638. {
  639. CMU->LOCK = CMU_LOCK_LOCKKEY_LOCK;
  640. }
  641. /***************************************************************************//**
  642. * @brief
  643. * Unlock the CMU so that writing to locked registers again is possible.
  644. ******************************************************************************/
  645. static __INLINE void CMU_Unlock(void)
  646. {
  647. CMU->LOCK = CMU_LOCK_LOCKKEY_UNLOCK;
  648. }
  649. /***************************************************************************//**
  650. * @brief
  651. * Get calibration count register
  652. * @note
  653. * If continuous calibrartion mode is active, calibration busy will allmost
  654. * always be on, and we just need to read the value, where the normal case
  655. * would be that this function call has been triggered by the CALRDY
  656. * interrupt flag.
  657. * @return
  658. * Calibration count, the number of UPSEL clocks (see CMU_CalibrateConfig)
  659. * in the period of DOWNSEL oscillator clock cycles configured by a previous
  660. * write operation to CMU->CALCNT
  661. ******************************************************************************/
  662. static __INLINE uint32_t CMU_CalibrateCountGet(void)
  663. {
  664. /* Wait until calibration completes, UNLESS continuous calibration mode is */
  665. /* active */
  666. #if defined (_EFM32_TINY_FAMILY) || defined(_EFM32_GIANT_FAMILY)
  667. if (!(CMU->CALCTRL & CMU_CALCTRL_CONT))
  668. {
  669. while (CMU->STATUS & CMU_STATUS_CALBSY)
  670. ;
  671. }
  672. #else
  673. while (CMU->STATUS & CMU_STATUS_CALBSY)
  674. ;
  675. #endif
  676. return CMU->CALCNT;
  677. }
  678. /***************************************************************************//**
  679. * @brief
  680. * Starts calibration
  681. * @note
  682. * This call is usually invoked after CMU_CalibrateConfig() and possibly
  683. * CMU_CalibrateCont()
  684. ******************************************************************************/
  685. static __INLINE void CMU_CalibrateStart(void)
  686. {
  687. CMU->CMD = CMU_CMD_CALSTART;
  688. }
  689. #if defined (_EFM32_TINY_FAMILY) || defined(_EFM32_GIANT_FAMILY)
  690. /***************************************************************************//**
  691. * @brief
  692. * Stop the calibration counters
  693. ******************************************************************************/
  694. static __INLINE void CMU_CalibrateStop(void)
  695. {
  696. CMU->CMD = CMU_CMD_CALSTOP;
  697. }
  698. /***************************************************************************//**
  699. * @brief
  700. * Configures continuous calibration mode
  701. * @param[in] enable
  702. * If true, enables continuous calibration, if false disables continuous
  703. * calibrartion
  704. ******************************************************************************/
  705. static __INLINE void CMU_CalibrateCont(bool enable)
  706. {
  707. BITBAND_Peripheral(&(CMU->CALCTRL), _CMU_CALCTRL_CONT_SHIFT, enable);
  708. }
  709. #endif
  710. /** @} (end addtogroup CMU) */
  711. /** @} (end addtogroup EFM32_Library) */
  712. #ifdef __cplusplus
  713. }
  714. #endif
  715. #endif /* __EFM32_CMU_H */