hal_rcc.c 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995
  1. ////////////////////////////////////////////////////////////////////////////////
  2. /// @file hal_rcc.c
  3. /// @author AE TEAM
  4. /// @brief THIS FILE PROVIDES ALL THE RCC FIRMWARE FUNCTIONS.
  5. ////////////////////////////////////////////////////////////////////////////////
  6. /// @attention
  7. ///
  8. /// THE EXISTING FIRMWARE IS ONLY FOR REFERENCE, WHICH IS DESIGNED TO PROVIDE
  9. /// CUSTOMERS WITH CODING INFORMATION ABOUT THEIR PRODUCTS SO THEY CAN SAVE
  10. /// TIME. THEREFORE, MINDMOTION SHALL NOT BE LIABLE FOR ANY DIRECT, INDIRECT OR
  11. /// CONSEQUENTIAL DAMAGES ABOUT ANY CLAIMS ARISING OUT OF THE CONTENT OF SUCH
  12. /// HARDWARE AND/OR THE USE OF THE CODING INFORMATION CONTAINED HEREIN IN
  13. /// CONNECTION WITH PRODUCTS MADE BY CUSTOMERS.
  14. ///
  15. /// <H2><CENTER>&COPY; COPYRIGHT MINDMOTION </CENTER></H2>
  16. ////////////////////////////////////////////////////////////////////////////////
  17. // Define to prevent recursive inclusion
  18. #define _HAL_RCC_C_
  19. // Files includes
  20. #include "mm32_reg.h"
  21. #include "hal_rcc.h"
  22. u8 tbPresc[] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9};
  23. ////////////////////////////////////////////////////////////////////////////////
  24. /// @addtogroup MM32_Hardware_Abstract_Layer
  25. /// @{
  26. ////////////////////////////////////////////////////////////////////////////////
  27. /// @addtogroup RCC_HAL
  28. /// @{
  29. ////////////////////////////////////////////////////////////////////////////////
  30. /// @addtogroup RCC_Exported_Functions
  31. /// @{
  32. ////////////////////////////////////////////////////////////////////////////////
  33. /// @brief Resets the RCC clock configuration to default state.
  34. /// @param None.
  35. /// @retval None.
  36. ////////////////////////////////////////////////////////////////////////////////
  37. void RCC_DeInit()
  38. {
  39. SET_BIT(RCC->CR, RCC_CR_HSION);
  40. CLEAR_BIT(RCC->CFGR, RCC_CFGR_SW);
  41. CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_CSSON | RCC_CR_PLLON );
  42. CLEAR_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLL_DN | RCC_PLLCFGR_PLL_DP);
  43. CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP);
  44. CLEAR_REG(RCC->CFGR);
  45. CLEAR_REG(RCC->CIR);
  46. }
  47. ////////////////////////////////////////////////////////////////////////////////
  48. /// @brief Configures the External High Speed oscillator (HSE).
  49. /// @param state: specifies the new state of HSE.
  50. /// This parameter can be one of the following values:
  51. /// @arg RCC_HSE_OFF: HSE oscillator OFF
  52. /// @arg RCC_HSE_ON: HSE oscillator ON
  53. /// @arg RCC_HSE_Bypass: HSE oscillator bypassed with external clock
  54. /// @retval None.
  55. ////////////////////////////////////////////////////////////////////////////////
  56. void RCC_HSEConfig(RCCHSE_TypeDef state)
  57. {
  58. RCC->CR &= ~(RCC_CR_HSEBYP | RCC_CR_HSEON);
  59. switch (state) {
  60. case RCC_HSE_Bypass:
  61. RCC->CR |= RCC_CR_HSEBYP;
  62. RCC->CR |= RCC_CR_HSEON;
  63. break;
  64. case RCC_HSE_ON:
  65. RCC->CR |= RCC_CR_HSEON;
  66. break;
  67. default:
  68. break;
  69. }
  70. }
  71. ////////////////////////////////////////////////////////////////////////////////
  72. /// @brief Checks whether the specified RCC flag is set or not.
  73. /// @param flag: specifies the flag to check.
  74. /// This parameter can be one of the following values:
  75. /// @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready
  76. /// @arg RCC_FLAG_HSERDY: HSE oscillator clock ready
  77. /// @arg RCC_FLAG_PLLRDY: PLL clock ready
  78. /// @arg RCC_FLAG_LSERDY: LSE oscillator clock ready
  79. /// @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready
  80. /// @arg RCC_FLAG_PINRST: Pin reset
  81. /// @arg RCC_FLAG_PORRST: POR/PDR reset
  82. /// @arg RCC_FLAG_SFTRST: Software reset
  83. /// @arg RCC_FLAG_IWDGRST: Independent Watchdog reset
  84. /// @arg RCC_FLAG_WWDGRST: Window Watchdog reset
  85. /// @arg RCC_FLAG_LPWRRST: Low Power reset
  86. /// @retval The new state of flag (SET or RESET).
  87. ////////////////////////////////////////////////////////////////////////////////
  88. FlagStatus RCC_GetFlagStatus(RCC_FLAG_TypeDef flag)
  89. {
  90. return ((((flag >> 5) == CR_REG_INDEX) ? RCC->CR : (((flag >> 5) == BDCR_REG_INDEX) ? RCC->BDCR : RCC->CSR)) &
  91. (1 << (flag & 0x1F)))
  92. ? SET : RESET;
  93. }
  94. ////////////////////////////////////////////////////////////////////////////////
  95. /// @brief Waits for HSE start-up.
  96. /// @param None.
  97. /// @retval An ErrorStatus enumuration value:
  98. /// - SUCCESS: HSE oscillator is stable and ready to use
  99. /// - ERROR: HSE oscillator not yet ready
  100. ////////////////////////////////////////////////////////////////////////////////
  101. ErrorStatus RCC_WaitForHSEStartUp(void)
  102. {
  103. u32 StartUpCounter = 0;
  104. FlagStatus HSEStatus;
  105. do {
  106. HSEStatus = RCC_GetFlagStatus(RCC_FLAG_HSERDY);
  107. StartUpCounter++;
  108. } while ((HSEStatus == RESET) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
  109. return (ErrorStatus)(RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET) ? SUCCESS : ERROR;
  110. }
  111. ////////////////////////////////////////////////////////////////////////////////
  112. /// @brief Waits for flag start-up.
  113. /// @param flag: specifies the flag to check.
  114. /// This parameter can be one of the following values:
  115. /// @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready
  116. /// @arg RCC_FLAG_HSERDY: HSE oscillator clock ready
  117. /// @arg RCC_FLAG_PLLRDY: PLL clock ready
  118. /// @arg RCC_FLAG_LSERDY: LSE oscillator clock ready
  119. /// @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready
  120. /// @arg RCC_FLAG_PINRST: Pin reset
  121. /// @arg RCC_FLAG_PORRST: POR/PDR reset
  122. /// @arg RCC_FLAG_SFTRST: Software reset
  123. /// @arg RCC_FLAG_IWDGRST: Independent Watchdog reset
  124. /// @arg RCC_FLAG_WWDGRST: Window Watchdog reset
  125. /// @retval An ErrorStatus enumuration value:
  126. /// - SUCCESS: HSE oscillator is stable and ready to use
  127. /// - ERROR: HSE oscillator not yet ready
  128. ////////////////////////////////////////////////////////////////////////////////
  129. ErrorStatus RCC_WaitForFlagStartUp(RCC_FLAG_TypeDef flag)
  130. {
  131. u32 StartUpCounter = 0;
  132. while (RCC_GetFlagStatus(flag) == RESET) {
  133. if (StartUpCounter++ > HSE_STARTUP_TIMEOUT) {
  134. return ERROR;
  135. }
  136. }
  137. return SUCCESS;
  138. }
  139. ////////////////////////////////////////////////////////////////////////////////
  140. /// @brief Enables or disables the Internal High Speed oscillator (HSI).
  141. /// @param state: new state of the HSI.
  142. /// This parameter can be: ENABLE or DISABLE.
  143. /// @retval None.
  144. ////////////////////////////////////////////////////////////////////////////////
  145. void RCC_HSICmd(FunctionalState state)
  146. {
  147. MODIFY_REG(RCC->CR, RCC_CR_HSION, (state << RCC_CR_HSION_Pos));
  148. }
  149. ////////////////////////////////////////////////////////////////////////////////
  150. /// @brief Configures the system clock (SYSCLK).
  151. /// @param sys_clk_source: specifies the clock source used as system
  152. /// clock. This parameter can be one of the following values:
  153. /// @arg RCC_HSI: specifies HSI as system clock
  154. /// @arg RCC_HSE: specifies HSE as system clock
  155. /// @arg RCC_PLL: specifies PLL as system clock
  156. /// @arg RCC_LSI: specifies LSI as system clock
  157. /// @retval None.
  158. ////////////////////////////////////////////////////////////////////////////////
  159. void RCC_SYSCLKConfig(SYSCLK_TypeDef sys_clk_source)
  160. {
  161. MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, (sys_clk_source << RCC_CFGR_SW_Pos));
  162. }
  163. ////////////////////////////////////////////////////////////////////////////////
  164. /// @brief Configures the PLL clock source and DM DN factor.
  165. /// This function must be used only when the PLL is disabled.
  166. /// @param plldn: specifies the PLL multiplication factor.
  167. /// This parameter can be RCC_PLLMul_x where x:[31:26]
  168. /// @param plldm: specifies the PLL Divsior factor.
  169. /// This parameter can be RCC_Divsior_x where x:[22:20]
  170. /// @retval None.
  171. ////////////////////////////////////////////////////////////////////////////////
  172. void RCC_PLLDMDNConfig(u32 plldn, u32 plldm)
  173. {
  174. MODIFY_REG(RCC->PLLCFGR, (RCC_PLLCFGR_PLL_DN | RCC_PLLCFGR_PLL_DP), ((plldn << RCC_PLLCFGR_PLL_DN_Pos) | (plldm << RCC_PLLCFGR_PLL_DP_Pos)));
  175. }
  176. ////////////////////////////////////////////////////////////////////////////////
  177. /// @brief Enables or disables the PLL.
  178. /// The PLL can not be disabled if it is used as system clock.
  179. /// @param state: new state of the PLL.
  180. /// This parameter can be: ENABLE or DISABLE.
  181. /// @retval None.
  182. ////////////////////////////////////////////////////////////////////////////////
  183. void RCC_PLLCmd(FunctionalState state)
  184. {
  185. MODIFY_REG(RCC->CR, RCC_CR_PLLON, (state << RCC_CR_PLLON_Pos));
  186. }
  187. ////////////////////////////////////////////////////////////////////////////////
  188. /// @brief Configures the PLL clock source and multiplication factor.
  189. /// This function must be used only when the PLL is disabled.
  190. /// @param pll_src: specifies the PLL entry clock source.
  191. /// This parameter can be one of the following values:
  192. /// @arg RCC_HSI_Div4: HSI oscillator clock divided
  193. /// by 4 selected as PLL clock entry
  194. /// @arg RCC_HSE_Div1: HSE oscillator clock selected
  195. /// as PLL clock entry
  196. /// @arg RCC_HSE_Div2: HSE oscillator clock divided
  197. /// by 2 selected as PLL clock entry
  198. /// @param pll_mul: specifies the PLL multiplication factor.
  199. /// This parameter can be RCC_PLLMul_x where x:[31:26][22:20]
  200. /// @retval None.
  201. ////////////////////////////////////////////////////////////////////////////////
  202. void RCC_PLLConfig(RCC_PLLSource_TypeDef pll_src, RCC_PLLMul_TypeDef pll_mul)
  203. {
  204. const u8 DNDM_Item[] = {0x07, 0x03, 0x05, 0x01, 0x07, 0x01, 0x09, 0x01, // Frclk*8/4 ; Frclk*6/2 ; Frclk*8/2 ; Frclk*10/2;
  205. 0x0B, 0x01, 0x0D, 0x01, 0x0F, 0x01, 0x11, 0x01, // Frclk*12/2; Frclk*14/2; Frclk*16/2; Frclk*18/2;
  206. 0x13, 0x01, 0x15, 0x01, 0x17, 0x01, 0x19, 0x01, // Frclk*20/2; Frclk*22/2; Frclk*24/2; Frclk*26/2;
  207. 0x1B, 0x01, 0x1D, 0x01, 0x1F, 0x01
  208. }; // Frclk*28/2; Frclk*30/2; // Frclk*32/2;
  209. MODIFY_REG(RCC->PLLCFGR, (RCC_PLLCFGR_PLLXTPRE | RCC_PLLCFGR_PLLSRC), pll_src);
  210. RCC_PLLDMDNConfig((u32)DNDM_Item[pll_mul >> 17], (u32)DNDM_Item[(pll_mul >> 17) + 1]);
  211. }
  212. ////////////////////////////////////////////////////////////////////////////////
  213. /// @brief Configures the USB clock (USBCLK).
  214. /// @param usb_clk_src: specifies the USB clock source.
  215. /// This clock is derived from the PLL output.
  216. /// This parameter can be one of the following values:
  217. /// @arg RCC_USBCLKSource_PLLCLK_Div1: PLL clock selected as USB clock source
  218. /// @arg RCC_USBCLKSource_PLLCLK_Div2: PLL clock divided by 2 selected as USB
  219. /// clock source
  220. /// @arg RCC_USBCLKSource_PLLCLK_Div3: PLL clock divided by 3 selected as USB
  221. /// clock source
  222. /// @arg RCC_USBCLKSource_PLLCLK_Div4: PLL clock divided by 4 selected as USB
  223. /// clock source
  224. /// @arg RCC_USBCLKSource_PLLCLK_Div5: PLL clock divided by 5 selected as USB
  225. /// clock source
  226. /// @retval None.
  227. ////////////////////////////////////////////////////////////////////////////////
  228. void RCC_USBCLKConfig(RCC_USBCLKSOURCE_TypeDef usb_clk_src)
  229. {
  230. MODIFY_REG(RCC->CFGR, RCC_CFGR_USBPRE, (usb_clk_src << RCC_CFGR_USBPRE_Pos));
  231. }
  232. ////////////////////////////////////////////////////////////////////////////////
  233. /// @brief Returns the clock source used as system clock.
  234. /// @param None.
  235. /// @retval The clock source used as system clock. The returned value can
  236. /// be one of the following:
  237. /// - 0x00: HSI/6 used as system clock
  238. /// - 0x04: HSE used as system clock
  239. /// - 0x08: PLL used as system clock
  240. ////////////////////////////////////////////////////////////////////////////////
  241. u8 RCC_GetSYSCLKSource(void)
  242. {
  243. return ((u8)READ_BIT(RCC->CFGR, RCC_CFGR_SWS));
  244. }
  245. ////////////////////////////////////////////////////////////////////////////////
  246. /// @brief Configures the AHB clock (hclk).
  247. /// @param sys_clk: defines the AHB clock divider. This clock is derived
  248. /// from the system clock (SYSCLK).
  249. /// This parameter can be one of the following values:
  250. /// @arg RCC_SYSCLK_Div1: AHB clock = SYSCLK
  251. /// @arg RCC_SYSCLK_Div2: AHB clock = SYSCLK/2
  252. /// @arg RCC_SYSCLK_Div4: AHB clock = SYSCLK/4
  253. /// @arg RCC_SYSCLK_Div8: AHB clock = SYSCLK/8
  254. /// @arg RCC_SYSCLK_Div16: AHB clock = SYSCLK/16
  255. /// @arg RCC_SYSCLK_Div64: AHB clock = SYSCLK/64
  256. /// @arg RCC_SYSCLK_Div128: AHB clock = SYSCLK/128
  257. /// @arg RCC_SYSCLK_Div256: AHB clock = SYSCLK/256
  258. /// @arg RCC_SYSCLK_Div512: AHB clock = SYSCLK/512
  259. /// @retval None.
  260. ////////////////////////////////////////////////////////////////////////////////
  261. void RCC_HCLKConfig(RCC_AHB_CLK_TypeDef sys_clk)
  262. {
  263. MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, sys_clk);
  264. }
  265. ////////////////////////////////////////////////////////////////////////////////
  266. /// @brief Configures the Low Speed APB clock (pclk1).
  267. /// @param hclk: defines the APB1 clock divider. This clock is derived from
  268. /// the AHB clock (hclk).
  269. /// This parameter can be one of the following values:
  270. /// @arg RCC_HCLK_Div1: APB1 clock = hclk
  271. /// @arg RCC_HCLK_Div2: APB1 clock = hclk/2
  272. /// @arg RCC_HCLK_Div4: APB1 clock = hclk/4
  273. /// @arg RCC_HCLK_Div8: APB1 clock = hclk/8
  274. /// @arg RCC_HCLK_Div16: APB1 clock = hclk/16
  275. /// @retval None.
  276. ////////////////////////////////////////////////////////////////////////////////
  277. void RCC_PCLK1Config(RCC_APB1_APB2_CLK_TypeDef hclk)
  278. {
  279. MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, hclk);
  280. }
  281. ////////////////////////////////////////////////////////////////////////////////
  282. /// @brief Configures the High Speed APB clock (pclk2).
  283. /// @param hclk: defines the APB2 clock divider. This clock is derived from
  284. /// the AHB clock (hclk).
  285. /// This parameter can be one of the following values:
  286. /// @arg RCC_HCLK_Div1: APB2 clock = hclk
  287. /// @arg RCC_HCLK_Div2: APB2 clock = hclk/2
  288. /// @arg RCC_HCLK_Div4: APB2 clock = hclk/4
  289. /// @arg RCC_HCLK_Div8: APB2 clock = hclk/8
  290. /// @arg RCC_HCLK_Div16: APB2 clock = hclk/16
  291. /// @retval None.
  292. ////////////////////////////////////////////////////////////////////////////////
  293. void RCC_PCLK2Config(RCC_APB1_APB2_CLK_TypeDef hclk)
  294. {
  295. MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, (hclk << 3));
  296. }
  297. ////////////////////////////////////////////////////////////////////////////////
  298. /// @brief Configures the ADC clock (ADCCLK).
  299. /// @param pclk2: defines the ADC clock divider. This clock is derived from
  300. /// the APB2 clock (pclk2).
  301. /// This parameter can be one of the following values:
  302. /// @arg RCC_PCLK2_Div2: ADC clock = pclk2/2
  303. /// @arg RCC_PCLK2_Div4: ADC clock = pclk2/4
  304. /// @arg RCC_PCLK2_Div6: ADC clock = pclk2/6
  305. /// @arg RCC_PCLK2_Div8: ADC clock = pclk2/8
  306. /// @retval None.
  307. ////////////////////////////////////////////////////////////////////////////////
  308. void RCC_ADCCLKConfig(RCC_ADCCLKSOURCE_TypeDef pclk2)
  309. {
  310. MODIFY_REG(RCC->CFGR, ADC_CFGR_PRE, pclk2);
  311. }
  312. ////////////////////////////////////////////////////////////////////////////////
  313. /// @brief Configures the External Low Speed oscillator (LSE).
  314. /// @param state: specifies the new state of the LSE.
  315. /// This parameter can be one of the following values:
  316. /// @arg RCC_LSE_OFF: LSE oscillator OFF
  317. /// @arg RCC_LSE_ON: LSE oscillator ON
  318. /// @arg RCC_LSE_Bypass: LSE oscillator bypassed with external
  319. /// clock
  320. /// @retval None.
  321. ////////////////////////////////////////////////////////////////////////////////
  322. void RCC_LSEConfig(RCC_LSE_TypeDef state)
  323. {
  324. RCC->BDCR &= ~(RCC_BDCR_LSEBYP | RCC_BDCR_LSEON);
  325. switch (state) {
  326. case RCC_LSE_Bypass:
  327. RCC->BDCR |= RCC_BDCR_LSEBYP;
  328. RCC->BDCR |= RCC_BDCR_LSEON;
  329. break;
  330. case RCC_LSE_ON:
  331. RCC->BDCR |= RCC_BDCR_LSEON;
  332. break;
  333. default:
  334. break;
  335. }
  336. }
  337. ////////////////////////////////////////////////////////////////////////////////
  338. /// @brief Configures the RTC clock (RTCCLK).
  339. /// Once the RTC clock is selected it can be changed unless the
  340. /// Backup domain is reset.
  341. /// @param rtc_clk_src: specifies the RTC clock source.
  342. /// This parameter can be one of the following values:
  343. /// @arg RCC_RTCCLKSource_LSE: LSE selected as RTC clock
  344. /// @arg RCC_RTCCLKSource_LSI: LSI selected as RTC clock
  345. /// @arg RCC_RTCCLKSource_HSE_Div128: HSE clock divided by 128
  346. /// selected as RTC clock
  347. /// @retval None.
  348. ////////////////////////////////////////////////////////////////////////////////
  349. void RCC_RTCCLKConfig(RCC_RTCCLKSOURCE_TypeDef rtc_clk_src)
  350. {
  351. MODIFY_REG(RCC->BDCR, RCC_BDCR_RTCSEL, rtc_clk_src);
  352. }
  353. ////////////////////////////////////////////////////////////////////////////////
  354. /// @brief Enables or disables the RTC clock.
  355. /// This function must be used only after the RTC clock was
  356. /// selected using the RCC_RTCCLKConfig function.
  357. /// @param state: new state of the RTC clock.
  358. /// This parameter can be: ENABLE or DISABLE.
  359. /// @retval None.
  360. ////////////////////////////////////////////////////////////////////////////////
  361. void RCC_RTCCLKCmd(FunctionalState state)
  362. {
  363. MODIFY_REG(RCC->BDCR, RCC_BDCR_RTCEN, (state << RCC_BDCR_RTCEN_Pos));
  364. }
  365. ////////////////////////////////////////////////////////////////////////////////
  366. /// @brief Enables or disables the Internal Low Speed oscillator (LSI).
  367. /// LSI can not be disabled if the IWDG is running.
  368. /// @param state: new state of the LSI.
  369. /// This parameter can be: ENABLE or DISABLE.
  370. /// @retval None.
  371. ////////////////////////////////////////////////////////////////////////////////
  372. void RCC_LSICmd(FunctionalState state)
  373. {
  374. // u32 j;
  375. MODIFY_REG(RCC->CSR, RCC_CSR_LSION | RCC_CSR_LSIOENLV, RCC_CSR_LSIOENLV | (state << RCC_CSR_LSION_Pos));
  376. }
  377. ////////////////////////////////////////////////////////////////////////////////
  378. /// @brief Returns the clock frequency of different on chip clocks.
  379. /// @param None.
  380. /// @retval sys_clk : System clock frequency
  381. ////////////////////////////////////////////////////////////////////////////////
  382. u32 RCC_GetSysClockFreq(void)
  383. {
  384. u32 result;
  385. u32 clock, mul, div;
  386. switch (RCC->CFGR & RCC_CFGR_SWS) {
  387. case RCC_CFGR_SWS_LSI:
  388. result = LSI_VALUE;
  389. break;
  390. case RCC_CFGR_SWS_HSE:
  391. result = HSE_VALUE;
  392. break;
  393. case RCC_CFGR_SWS_PLL:
  394. clock = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC) ? (READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLXTPRE) ? (HSE_VALUE >> 1) : HSE_VALUE)
  395. : HSI_VALUE_PLL_ON;
  396. mul = ((RCC->PLLCFGR & (u32)RCC_PLLCFGR_PLL_DN) >> RCC_PLLCFGR_PLL_DN_Pos) + 1;
  397. div = ((RCC->PLLCFGR & RCC_PLLCFGR_PLL_DP) >> RCC_PLLCFGR_PLL_DP_Pos) + 1;
  398. result = clock * mul / div;
  399. break;
  400. default:
  401. result = HSI_VALUE;
  402. break;
  403. }
  404. return result;
  405. }
  406. ////////////////////////////////////////////////////////////////////////////////
  407. /// @brief Returns the hclk frequency of different on chip clocks.
  408. /// @param None.
  409. /// @retval hclk frequency
  410. ////////////////////////////////////////////////////////////////////////////////
  411. u32 RCC_GetHCLKFreq(void)
  412. {
  413. return (RCC_GetSysClockFreq() >> tbPresc[(RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos]);
  414. }
  415. ////////////////////////////////////////////////////////////////////////////////
  416. /// @brief Returns the pclk1 frequency of different on chip clocks.
  417. /// @param None.
  418. /// @retval pclk1 frequency
  419. ////////////////////////////////////////////////////////////////////////////////
  420. u32 RCC_GetPCLK1Freq(void)
  421. {
  422. return (RCC_GetHCLKFreq() >> tbPresc[(RCC->CFGR & RCC_CFGR_PPRE1) >> RCC_CFGR_PPRE1_Pos]);
  423. }
  424. ////////////////////////////////////////////////////////////////////////////////
  425. /// @brief Returns the pclk2 frequency of different on chip clocks.
  426. /// @param None.
  427. /// @retval pclk2 frequency
  428. ////////////////////////////////////////////////////////////////////////////////
  429. u32 RCC_GetPCLK2Freq(void)
  430. {
  431. return (RCC_GetHCLKFreq() >> tbPresc[(RCC->CFGR & RCC_CFGR_PPRE2) >> RCC_CFGR_PPRE2_Pos]);
  432. }
  433. ////////////////////////////////////////////////////////////////////////////////
  434. /// @brief Returns the frequency of different on chip clocks.
  435. /// @param clk: pointer to a RCC_ClocksTypeDef structure which
  436. /// will hold the clocks frequency.
  437. /// @retval None.
  438. ////////////////////////////////////////////////////////////////////////////////
  439. void RCC_GetClocksFreq(RCC_ClocksTypeDef* clk)
  440. {
  441. u8 tbADCPresc[] = {2, 4, 6, 8};
  442. clk->SYSCLK_Frequency = RCC_GetSysClockFreq();
  443. clk->HCLK_Frequency = RCC_GetHCLKFreq();
  444. clk->PCLK1_Frequency = RCC_GetPCLK1Freq();
  445. clk->PCLK2_Frequency = RCC_GetPCLK2Freq();
  446. clk->ADCCLK_Frequency = clk->PCLK2_Frequency / tbADCPresc[(RCC->CFGR & ADC_CFGR_PRE) >> ADC_CFGR_PRE_Pos];
  447. }
  448. ////////////////////////////////////////////////////////////////////////////////
  449. /// @brief Enables or disables the AHB peripheral clock.
  450. /// @param ahb_periph: specifies the AHB peripheral to gates its clock.
  451. /// This parameter can be any combination of the following values:
  452. /// @param state: new state of the specified peripheral clock.
  453. /// This parameter can be: ENABLE or DISABLE.
  454. /// @retval None.
  455. ////////////////////////////////////////////////////////////////////////////////
  456. void RCC_AHBPeriphClockCmd(u32 ahb_periph, FunctionalState state)
  457. {
  458. (state) ? (RCC->AHBENR |= ahb_periph) : (RCC->AHBENR &= ~ahb_periph);
  459. }
  460. /// @param state: new state of the specified peripheral clock.
  461. /// This parameter can be: ENABLE or DISABLE.
  462. /// @retval None.
  463. ////////////////////////////////////////////////////////////////////////////////
  464. void RCC_AHB2PeriphClockCmd(u32 ahb_periph, FunctionalState state)
  465. {
  466. (state) ? (RCC->AHB2ENR |= ahb_periph) : (RCC->AHB2ENR &= ~ahb_periph);
  467. }
  468. /// @param state: new state of the specified peripheral clock.
  469. /// This parameter can be: ENABLE or DISABLE.
  470. /// @retval None.
  471. ////////////////////////////////////////////////////////////////////////////////
  472. void RCC_AHB3PeriphClockCmd(u32 ahb_periph, FunctionalState state)
  473. {
  474. (state) ? (RCC->AHB3ENR |= ahb_periph) : (RCC->AHB3ENR &= ~ahb_periph);
  475. }
  476. ////////////////////////////////////////////////////////////////////////////////
  477. /// @brief Enables or disables the High Speed APB (APB2) peripheral clock.
  478. /// @param apb2_periph: specifies the APB2 peripheral to gates its
  479. /// clock.
  480. /// This parameter can be any combination of the following values:
  481. /// @param state: new state of the specified peripheral clock.
  482. /// This parameter can be: ENABLE or DISABLE.
  483. /// @retval None.
  484. ////////////////////////////////////////////////////////////////////////////////
  485. void RCC_APB2PeriphClockCmd(u32 apb2_periph, FunctionalState state)
  486. {
  487. (state) ? (RCC->APB2ENR |= apb2_periph) : (RCC->APB2ENR &= ~apb2_periph);
  488. }
  489. ////////////////////////////////////////////////////////////////////////////////
  490. /// @brief Enables or disables the Low Speed APB (APB1) peripheral clock.
  491. /// @param apb1_periph: specifies the APB1 peripheral to gates its
  492. /// clock.
  493. /// This parameter can be any combination of the following values:
  494. /// @param state: new state of the specified peripheral clock.
  495. /// This parameter can be: ENABLE or DISABLE.
  496. /// @retval None.
  497. ////////////////////////////////////////////////////////////////////////////////
  498. void RCC_APB1PeriphClockCmd(u32 apb1_periph, FunctionalState state)
  499. {
  500. (state) ? (RCC->APB1ENR |= apb1_periph) : (RCC->APB1ENR &= ~apb1_periph);
  501. }
  502. ////////////////////////////////////////////////////////////////////////////////
  503. /// @brief Forces or releases High Speed APB (APB2) peripheral reset.
  504. /// @param apb2_periph: specifies the APB2 peripheral to reset.
  505. /// This parameter can be any combination of the following values:
  506. /// @param state: new state of the specified peripheral reset.
  507. /// This parameter can be: ENABLE or DISABLE.
  508. /// @retval None.
  509. ////////////////////////////////////////////////////////////////////////////////
  510. void RCC_APB2PeriphResetCmd(u32 apb2_periph, FunctionalState state)
  511. {
  512. (state) ? (RCC->APB2RSTR |= apb2_periph) : (RCC->APB2RSTR &= ~apb2_periph);
  513. }
  514. ////////////////////////////////////////////////////////////////////////////////
  515. /// @brief Forces or releases Low Speed APB (APB1) peripheral reset.
  516. /// @param apb1_periph: specifies the APB1 peripheral to reset.
  517. /// This parameter can be any combination of the following values:
  518. /// @param state: new state of the specified peripheral clock.
  519. /// This parameter can be: ENABLE or DISABLE.
  520. /// @retval None.
  521. ////////////////////////////////////////////////////////////////////////////////
  522. void RCC_APB1PeriphResetCmd(u32 apb1_periph, FunctionalState state)
  523. {
  524. (state) ? (RCC->APB1RSTR |= apb1_periph) : (RCC->APB1RSTR &= ~apb1_periph);
  525. }
  526. ////////////////////////////////////////////////////////////////////////////////
  527. /// @brief Forces or releases Low Speed AHB peripheral reset.
  528. /// @param ahb_periph: specifies the AHB peripheral to reset.
  529. /// This parameter can be any combination of the following values:
  530. /// @param state: new state of the specified peripheral clock.
  531. /// This parameter can be: ENABLE or DISABLE.
  532. /// @retval None.
  533. ////////////////////////////////////////////////////////////////////////////////
  534. void RCC_AHBPeriphResetCmd(u32 ahb_periph, FunctionalState state)
  535. {
  536. (state) ? (RCC->AHBRSTR |= ahb_periph) : (RCC->AHBRSTR &= ~ahb_periph);
  537. }
  538. ////////////////////////////////////////////////////////////////////////////////
  539. /// @brief Forces or releases Low Speed AHB2 peripheral reset.
  540. /// @param ahb_periph: specifies the AHB peripheral to reset.
  541. /// This parameter can be any combination of the following values:
  542. /// @param state: new state of the specified peripheral clock.
  543. /// This parameter can be: ENABLE or DISABLE.
  544. /// @retval None.
  545. ////////////////////////////////////////////////////////////////////////////////
  546. void RCC_AHB2PeriphResetCmd(u32 ahb_periph, FunctionalState state)
  547. {
  548. (state) ? (RCC->AHB2RSTR |= ahb_periph) : (RCC->AHB2RSTR &= ~ahb_periph);
  549. }
  550. ////////////////////////////////////////////////////////////////////////////////
  551. /// @brief Forces or releases Low Speed AHB2 peripheral reset.
  552. /// @param ahb_periph: specifies the AHB peripheral to reset.
  553. /// This parameter can be any combination of the following values:
  554. /// @param state: new state of the specified peripheral clock.
  555. /// This parameter can be: ENABLE or DISABLE.
  556. /// @retval None.
  557. ////////////////////////////////////////////////////////////////////////////////
  558. void RCC_AHB3PeriphResetCmd(u32 ahb_periph, FunctionalState state)
  559. {
  560. (state) ? (RCC->AHB3RSTR |= ahb_periph) : (RCC->AHB3RSTR &= ~ahb_periph);
  561. }
  562. ////////////////////////////////////////////////////////////////////////////////
  563. /// @brief Forces or releases the Backup domain reset.
  564. /// @param state: new state of the Backup domain reset.
  565. /// This parameter can be: ENABLE or DISABLE.
  566. /// @retval None.
  567. ////////////////////////////////////////////////////////////////////////////////
  568. void RCC_BackupResetCmd(FunctionalState state)
  569. {
  570. MODIFY_REG(RCC->BDCR, RCC_BDCR_BDRST, (state << RCC_BDCR_BDRST_Pos));
  571. }
  572. ////////////////////////////////////////////////////////////////////////////////
  573. /// @brief Enables or disables the Clock Security System.
  574. /// @param state: new state of the Clock Security System..
  575. /// This parameter can be: ENABLE or DISABLE.
  576. /// @retval None.
  577. ////////////////////////////////////////////////////////////////////////////////
  578. void RCC_ClockSecuritySystemCmd(FunctionalState state)
  579. {
  580. MODIFY_REG(RCC->CR, RCC_CR_CSSON, (state << RCC_CR_CSSON_Pos));
  581. }
  582. ////////////////////////////////////////////////////////////////////////////////
  583. /// @brief Selects the clock source to output on MCO pin.
  584. /// @param mco_src: specifies the clock source to output.
  585. /// This parameter can be one of the following values:
  586. /// @arg RCC_MCO_NoClock: No clock selected
  587. /// @arg RCC_MCO_LSI: LSI oscillator clock selected
  588. /// @arg RCC_MCO_LSE: LSE oscillator clock selected
  589. /// @arg RCC_MCO_SYSCLK: System clock selected
  590. /// @arg RCC_MCO_HSI: HSI oscillator clock selected
  591. /// @arg RCC_MCO_HSE: HSE oscillator clock selected
  592. /// @arg RCC_MCO_PLLCLK_Div2: PLL clock divided by 2 selected
  593. /// @retval None.
  594. ////////////////////////////////////////////////////////////////////////////////
  595. void RCC_MCOConfig(RCC_MCO_TypeDef mco_src)
  596. {
  597. MODIFY_REG(RCC->CFGR, RCC_CFGR_MCO, mco_src);
  598. }
  599. ////////////////////////////////////////////////////////////////////////////////
  600. /// @brief Clears the RCC reset flags.
  601. /// The reset flags are: RCC_FLAG_PINRST, RCC_FLAG_PORRST,
  602. /// RCC_FLAG_SFTRST, RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST,
  603. /// RCC_FLAG_LPWRRST
  604. /// @param None.
  605. /// @retval None.
  606. ////////////////////////////////////////////////////////////////////////////////
  607. void RCC_ClearFlag(void)
  608. {
  609. SET_BIT(RCC->CSR, RCC_CSR_RMVF);
  610. }
  611. ////////////////////////////////////////////////////////////////////////////////
  612. /// @brief Enables or disables the specified RCC interrupts.
  613. /// @param it: specifies the RCC interrupt sources to be enabled or
  614. /// disabled.
  615. /// This parameter can be any combination of the following values:
  616. /// @arg RCC_IT_LSIRDY: LSI ready interrupt
  617. /// @arg RCC_IT_LSERDY: LSE ready interrupt
  618. /// @arg RCC_IT_HSIRDY: HSI ready interrupt
  619. /// @arg RCC_IT_HSERDY: HSE ready interrupt
  620. /// @arg RCC_IT_PLLRDY: PLL ready interrupt
  621. /// @param state: new state of the specified RCC interrupts.
  622. /// This parameter can be: ENABLE or DISABLE.
  623. /// @retval None.
  624. ////////////////////////////////////////////////////////////////////////////////
  625. void RCC_ITConfig(RCC_IT_TypeDef it, FunctionalState state)
  626. {
  627. (state) ? SET_BIT(RCC->CIR, it << RCC_CIR_LSIRDYIE_Pos) : CLEAR_BIT(RCC->CIR, it << RCC_CIR_LSIRDYIE_Pos);
  628. }
  629. ////////////////////////////////////////////////////////////////////////////////
  630. /// @brief Checks whether the specified RCC interrupt has occurred or not.
  631. /// @param it: specifies the RCC interrupt source to check.
  632. /// This parameter can be one of the following values:
  633. /// @arg RCC_IT_LSIRDY: LSI ready interrupt
  634. /// @arg RCC_IT_LSERDY: LSE ready interrupt
  635. /// @arg RCC_IT_HSIRDY: HSI ready interrupt
  636. /// @arg RCC_IT_HSERDY: HSE ready interrupt
  637. /// @arg RCC_IT_PLLRDY: PLL ready interrupt
  638. /// @arg RCC_IT_CSS: Clock Security System interrupt
  639. /// @retval The new state of it (SET or RESET).
  640. ////////////////////////////////////////////////////////////////////////////////
  641. ITStatus RCC_GetITStatus(RCC_IT_TypeDef it)
  642. {
  643. return (ITStatus)READ_BIT(RCC->CIR, (it << RCC_CIR_LSIRDYF_Pos));
  644. }
  645. ////////////////////////////////////////////////////////////////////////////////
  646. /// @brief Clears the RCC�?interrupt pending bits.
  647. /// @param it: specifies the interrupt pending bit to clear.
  648. /// This parameter can be any combination of the following values:
  649. /// @arg RCC_IT_LSIRDY: LSI ready interrupt
  650. /// @arg RCC_IT_LSERDY: LSE ready interrupt
  651. /// @arg RCC_IT_HSIRDY: HSI ready interrupt
  652. /// @arg RCC_IT_HSERDY: HSE ready interrupt
  653. /// @arg RCC_IT_PLLRDY: PLL ready interrupt
  654. /// @arg RCC_IT_CSS: Clock Security System interrupt
  655. /// @retval None.
  656. ////////////////////////////////////////////////////////////////////////////////
  657. void RCC_ClearITPendingBit(u8 it)
  658. {
  659. SET_BIT(RCC->CIR, (it << RCC_CIR_LSIRDYC_Pos));
  660. }
  661. ////////////////////////////////////////////////////////////////////////////////
  662. /// @brief Forces or releases Low Speed APB (APB1) peripheral reset.
  663. /// @param apb1_periph: specifies the APB1 peripheral to reset.
  664. /// This parameter can be any combination of the following values:
  665. /// @retval None.
  666. ////////////////////////////////////////////////////////////////////////////////
  667. void RCC_APB1PeriphReset(u32 apb1_periph)
  668. {
  669. RCC->APB1RSTR |= apb1_periph;
  670. RCC->APB1RSTR &= ~apb1_periph;
  671. }
  672. ////////////////////////////////////////////////////////////////////////////////
  673. /// @brief Forces or releases Low Speed APB (APB2) peripheral reset.
  674. /// @param apb2_periph: specifies the APB2 peripheral to reset.
  675. /// This parameter can be any combination of the following values:
  676. /// @retval None.
  677. ////////////////////////////////////////////////////////////////////////////////
  678. void RCC_APB2PeriphReset(u32 apb2_periph)
  679. {
  680. RCC->APB2RSTR |= apb2_periph;
  681. RCC->APB2RSTR &= ~apb2_periph;
  682. }
  683. ////////////////////////////////////////////////////////////////////////////////
  684. /// @brief Forces or releases High Speed AHB (AHB1) peripheral reset.
  685. /// @param ahb1_periph: specifies the AHB1 peripheral to reset.
  686. /// This parameter can be any combination of the following values:
  687. /// @retval None.
  688. ////////////////////////////////////////////////////////////////////////////////
  689. void RCC_AHBPeriphReset(u32 ahb1_periph)
  690. {
  691. RCC->AHBRSTR |= ahb1_periph;
  692. RCC->AHBRSTR &= ~ahb1_periph;
  693. }
  694. ////////////////////////////////////////////////////////////////////////////////
  695. //
  696. // New Function Interface
  697. //
  698. ////////////////////////////////////////////////////////////////////////////////
  699. ////////////////////////////////////////////////////////////////////////////////
  700. /// @brief Forces or releases Low Speed APB (APB1) peripheral reset.
  701. /// @param apb1_periph: specifies the APB1 peripheral to reset.
  702. /// This parameter can be any combination of the following values:
  703. /// @retval None.
  704. ////////////////////////////////////////////////////////////////////////////////
  705. void exRCC_APB1PeriphReset(u32 apb1_periph)
  706. {
  707. RCC->APB1RSTR |= apb1_periph;
  708. RCC->APB1RSTR &= ~apb1_periph;
  709. }
  710. ////////////////////////////////////////////////////////////////////////////////
  711. /// @brief
  712. /// @param
  713. /// @retval None.
  714. ////////////////////////////////////////////////////////////////////////////////
  715. void exRCC_BackupReset()
  716. {
  717. }
  718. ////////////////////////////////////////////////////////////////////////////////
  719. /// @brief Forces or releases High Speed APB (APB2) peripheral reset.
  720. /// @param apb2_periph: specifies the APB2 peripheral to reset.
  721. /// This parameter can be any combination of the following values:
  722. /// @retval None.
  723. ////////////////////////////////////////////////////////////////////////////////
  724. void exRCC_APB2PeriphReset(u32 apb2_periph)
  725. {
  726. RCC->APB2RSTR |= apb2_periph;
  727. RCC->APB2RSTR &= ~apb2_periph;
  728. }
  729. ////////////////////////////////////////////////////////////////////////////////
  730. /// @brief Forces or releases High Speed AHB (AHB1) peripheral reset.
  731. /// @param ahb1_periph: specifies the AHB1 peripheral to reset.
  732. /// This parameter can be any combination of the following values:
  733. /// @retval None.
  734. ////////////////////////////////////////////////////////////////////////////////
  735. void exRCC_AHBPeriphReset(u32 ahb1_periph)
  736. {
  737. RCC->AHBRSTR |= ahb1_periph;
  738. RCC->AHBRSTR &= ~ahb1_periph;
  739. }
  740. ////////////////////////////////////////////////////////////////////////////////
  741. /// @brief Disable systick
  742. /// @param None.
  743. /// @retval None.
  744. ////////////////////////////////////////////////////////////////////////////////
  745. void exRCC_SystickDisable()
  746. {
  747. SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
  748. }
  749. ////////////////////////////////////////////////////////////////////////////////
  750. /// @brief Enable systick
  751. /// @param None.
  752. /// @retval None.
  753. ////////////////////////////////////////////////////////////////////////////////
  754. void exRCC_SystickEnable(u32 sys_tick_period)
  755. {
  756. SysTick_Config(RCC_GetHCLKFreq() / 1000000 * sys_tick_period);
  757. }
  758. /*
  759. (state) ? (RCC->AHBENR |= ahb_periph) : (RCC->AHBENR &= ~ahb_periph);
  760. (state) ? (RCC->APB1ENR |= apb1_periph) : (RCC->APB1ENR &= ~apb1_periph);
  761. (state) ? (RCC->APB2ENR |= apb2_periph) : (RCC->APB2ENR &= ~apb2_periph);
  762. */
  763. ////////////////////////////////////////////////////////////////////////////////
  764. /// @brief Enables or disables the specified ADC peripheral Clock.
  765. /// @param peripheral:select the ADC peripheral.
  766. /// @param state: new state of the ADC peripheral.
  767. /// @retval None.
  768. ////////////////////////////////////////////////////////////////////////////////
  769. void RCC_ADC_ClockCmd(ADC_TypeDef* peripheral, FunctionalState state)
  770. {
  771. switch (*(vu32*)&peripheral) {
  772. case ADC1_BASE:
  773. (state) ? (RCC->APB2ENR |= RCC_APB2ENR_ADC1) : (RCC->APB2ENR &= ~RCC_APB2ENR_ADC1);
  774. break;
  775. case ADC2_BASE:
  776. (state) ? (RCC->APB2ENR |= RCC_APB2ENR_ADC2) : (RCC->APB2ENR &= ~RCC_APB2ENR_ADC2);
  777. break;
  778. case ADC3_BASE:
  779. (state) ? (RCC->APB2ENR |= RCC_APB2ENR_ADC3) : (RCC->APB2ENR &= ~RCC_APB2ENR_ADC3);
  780. break;
  781. default:
  782. break;
  783. }
  784. }
  785. ////////////////////////////////////////////////////////////////////////////////
  786. /// @brief Enables or disables the specified BKP peripheral Clock.
  787. /// @param peripheral:select the BKP peripheral.
  788. /// @param state: new state of the BKP peripheral.
  789. /// @retval None.
  790. ////////////////////////////////////////////////////////////////////////////////
  791. void RCC_BKP_ClockCmd(BKP_TypeDef* peripheral, FunctionalState state)
  792. {
  793. if(BKP == peripheral) {
  794. (state) ? (RCC->APB1ENR |= RCC_APB1ENR_BKP) : (RCC->APB1ENR &= ~RCC_APB1ENR_BKP);
  795. (state) ? (RCC->APB1ENR |= RCC_APB1ENR_PWR) : (RCC->APB1ENR &= ~RCC_APB1ENR_PWR);
  796. }
  797. }
  798. ////////////////////////////////////////////////////////////////////////////////
  799. /// @brief Enables or disables the specified CAN peripheral Clock.
  800. /// @param peripheral:select the CAN peripheral.
  801. /// @param state: new state of the CAN peripheral.
  802. /// @retval None.
  803. ////////////////////////////////////////////////////////////////////////////////
  804. void RCC_CAN_ClockCmd(CAN_TypeDef* peripheral, FunctionalState state)
  805. {
  806. if(CAN1 == peripheral) {
  807. (state) ? (RCC->APB1ENR |= RCC_APB1ENR_CAN) : (RCC->APB1ENR &= ~RCC_APB1ENR_CAN);
  808. }
  809. }
  810. ////////////////////////////////////////////////////////////////////////////////
  811. /// @brief Enables or disables the specified COMP peripheral Clock.
  812. /// @param peripheral:select the COMP peripheral.
  813. /// @param state: new state of the COMP peripheral.
  814. /// @retval None.
  815. ////////////////////////////////////////////////////////////////////////////////
  816. void RCC_COMP_ClockCmd(COMP_TypeDef* peripheral, FunctionalState state)
  817. {
  818. if(COMP == peripheral) {
  819. (state) ? (RCC->APB2ENR |= RCC_APB2ENR_COMP) : (RCC->APB2ENR &= ~RCC_APB2ENR_COMP);
  820. }
  821. }
  822. ////////////////////////////////////////////////////////////////////////////////
  823. /// @brief Enables or disables the specified CRC peripheral Clock.
  824. /// @param peripheral:select the CRC peripheral.
  825. /// @param state: new state of the CRC peripheral.
  826. /// @retval None.
  827. ////////////////////////////////////////////////////////////////////////////////
  828. void RCC_CRC_ClockCmd(CRC_TypeDef* peripheral, FunctionalState state)
  829. {
  830. if(CRC == peripheral) {
  831. (state) ? (RCC->AHBENR |= RCC_AHBENR_CRC) : (RCC->AHBENR &= ~RCC_AHBENR_CRC);
  832. }
  833. }
  834. ////////////////////////////////////////////////////////////////////////////////
  835. /// @brief Enables or disables the specified DAC peripheral Clock.
  836. /// @param peripheral:select the DAC peripheral.
  837. /// @param state: new state of the DAC peripheral.
  838. /// @retval None.
  839. ////////////////////////////////////////////////////////////////////////////////
  840. void RCC_DAC_ClockCmd(DAC_TypeDef* peripheral, FunctionalState state)
  841. {
  842. if(DAC == peripheral) {
  843. (state) ? (RCC->APB1ENR |= RCC_APB1ENR_DAC) : (RCC->APB1ENR &= ~RCC_APB1ENR_DAC);
  844. }
  845. }
  846. ////////////////////////////////////////////////////////////////////////////////
  847. /// @brief Enables or disables the specified DMA peripheral Clock.
  848. /// @param peripheral:select the DMA peripheral.
  849. /// @param state: new state of the DMA peripheral.
  850. /// @retval None.
  851. ////////////////////////////////////////////////////////////////////////////////
  852. void RCC_DMA_ClockCmd(DMA_TypeDef* peripheral, FunctionalState state)
  853. {
  854. if(DMA1 == peripheral) {
  855. (state) ? (RCC->AHBENR |= RCC_AHBENR_DMA1) : (RCC->AHBENR &= ~RCC_AHBENR_DMA1);
  856. }
  857. if(DMA2 == peripheral) {
  858. (state) ? (RCC->AHBENR |= RCC_AHBENR_DMA2) : (RCC->AHBENR &= ~RCC_AHBENR_DMA2);
  859. }
  860. }
  861. ////////////////////////////////////////////////////////////////////////////////
  862. /// @brief Enables or disables the specified GPIO peripheral Clock.
  863. /// @param peripheral:select the GPIO peripheral.
  864. /// @param state: new state of the GPIO peripheral.
  865. /// @retval None.
  866. ////////////////////////////////////////////////////////////////////////////////
  867. void RCC_GPIO_ClockCmd(GPIO_TypeDef* peripheral, FunctionalState state)
  868. {
  869. switch (*(vu32*)&peripheral) {
  870. case (u32)GPIOA:
  871. (state) ? (RCC->AHBENR |= RCC_AHBENR_GPIOA) : (RCC->AHBENR &= ~RCC_AHBENR_GPIOA);
  872. break;
  873. case (u32)GPIOB:
  874. (state) ? (RCC->AHBENR |= RCC_AHBENR_GPIOB) : (RCC->AHBENR &= ~RCC_AHBENR_GPIOB);
  875. break;
  876. case (u32)GPIOC:
  877. (state) ? (RCC->AHBENR |= RCC_AHBENR_GPIOC) : (RCC->AHBENR &= ~RCC_AHBENR_GPIOC);
  878. break;
  879. case (u32)GPIOD:
  880. (state) ? (RCC->AHBENR |= RCC_AHBENR_GPIOD) : (RCC->AHBENR &= ~RCC_AHBENR_GPIOD);
  881. break;
  882. case (u32)GPIOE:
  883. (state) ? (RCC->AHBENR |= RCC_AHBENR_GPIOE) : (RCC->AHBENR &= ~RCC_AHBENR_GPIOE);
  884. break;
  885. case (u32)GPIOF:
  886. (state) ? (RCC->AHBENR |= RCC_AHBENR_GPIOF) : (RCC->AHBENR &= ~RCC_AHBENR_GPIOF);
  887. break;
  888. case (u32)GPIOG:
  889. (state) ? (RCC->AHBENR |= RCC_AHBENR_GPIOG) : (RCC->AHBENR &= ~RCC_AHBENR_GPIOG);
  890. break;
  891. case (u32)GPIOH:
  892. (state) ? (RCC->AHBENR |= RCC_AHBENR_GPIOH) : (RCC->AHBENR &= ~RCC_AHBENR_GPIOH);
  893. break;
  894. default:
  895. break;
  896. }
  897. }
  898. ////////////////////////////////////////////////////////////////////////////////
  899. /// @brief Deinitializes the uart peripheral registers to their
  900. /// default reset values.
  901. /// @param peripheral: Select the UART or the UART peripheral.
  902. /// @retval None.
  903. ////////////////////////////////////////////////////////////////////////////////
  904. void RCC_UART_ClockCmd(UART_TypeDef* peripheral, FunctionalState state)
  905. {
  906. if(UART2 == peripheral) {
  907. (state) ? (RCC->APB1ENR |= RCC_APB1ENR_UART2) : (RCC->APB1ENR &= ~RCC_APB1ENR_UART2);//exRCC_APB1PeriphReset(RCC_APB1ENR_UART2);
  908. }
  909. if(UART1 == peripheral) {
  910. (state) ? (RCC->APB2ENR |= RCC_APB2ENR_UART1) : (RCC->APB2ENR &= ~RCC_APB2ENR_UART1);//exRCC_APB2PeriphReset(RCC_APB2ENR_UART1);
  911. }
  912. if(UART3 == peripheral) {
  913. (state) ? (RCC->APB1ENR |= RCC_APB1ENR_UART3) : (RCC->APB1ENR &= ~RCC_APB1ENR_UART3);//exRCC_APB1PeriphReset(RCC_APB1ENR_UART3);
  914. }
  915. if(UART4 == peripheral) {
  916. (state) ? (RCC->APB1ENR |= RCC_APB1ENR_UART4) : (RCC->APB1ENR &= ~RCC_APB1ENR_UART4);//exRCC_APB1PeriphReset(RCC_APB1ENR_UART4);
  917. }
  918. if(UART5 == peripheral) {
  919. (state) ? (RCC->APB1ENR |= RCC_APB1ENR_UART5) : (RCC->APB1ENR &= ~RCC_APB1ENR_UART5);//exRCC_APB1PeriphReset(RCC_APB1ENR_UART5);
  920. }
  921. if(UART6 == peripheral) {
  922. (state) ? (RCC->APB2ENR |= RCC_APB2ENR_UART6) : (RCC->APB2ENR &= ~RCC_APB2ENR_UART6);//exRCC_APB2PeriphReset(RCC_APB2ENR_UART6);
  923. }
  924. if(UART7 == peripheral) {
  925. (state) ? (RCC->APB1ENR |= RCC_APB1ENR_UART7) : (RCC->APB1ENR &= ~RCC_APB1ENR_UART7);//exRCC_APB1PeriphReset(RCC_APB1ENR_UART7);
  926. }
  927. if(UART8 == peripheral) {
  928. (state) ? (RCC->APB1ENR |= RCC_APB1ENR_UART8) : (RCC->APB1ENR &= ~RCC_APB1ENR_UART8);//exRCC_APB1PeriphReset(RCC_APB1ENR_UART8);
  929. }
  930. }
  931. /// @}
  932. /// @}
  933. /// @}