stm32f10x_rcc.c 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478
  1. /**
  2. ******************************************************************************
  3. * @file stm32f10x_rcc.c
  4. * @author MCD Application Team
  5. * @version V3.3.0
  6. * @date 04/16/2010
  7. * @brief This file provides all the RCC firmware functions.
  8. ******************************************************************************
  9. * @copy
  10. *
  11. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  12. * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  13. * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  14. * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  15. * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  16. * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  17. *
  18. * <h2><center>&copy; COPYRIGHT 2010 STMicroelectronics</center></h2>
  19. */
  20. /* Includes ------------------------------------------------------------------*/
  21. #include "stm32f10x_rcc.h"
  22. /** @addtogroup STM32F10x_StdPeriph_Driver
  23. * @{
  24. */
  25. /** @defgroup RCC
  26. * @brief RCC driver modules
  27. * @{
  28. */
  29. /** @defgroup RCC_Private_TypesDefinitions
  30. * @{
  31. */
  32. /**
  33. * @}
  34. */
  35. /** @defgroup RCC_Private_Defines
  36. * @{
  37. */
  38. /* ------------ RCC registers bit address in the alias region ----------- */
  39. #define RCC_OFFSET (RCC_BASE - PERIPH_BASE)
  40. /* --- CR Register ---*/
  41. /* Alias word address of HSION bit */
  42. #define CR_OFFSET (RCC_OFFSET + 0x00)
  43. #define HSION_BitNumber 0x00
  44. #define CR_HSION_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (HSION_BitNumber * 4))
  45. /* Alias word address of PLLON bit */
  46. #define PLLON_BitNumber 0x18
  47. #define CR_PLLON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLLON_BitNumber * 4))
  48. #ifdef STM32F10X_CL
  49. /* Alias word address of PLL2ON bit */
  50. #define PLL2ON_BitNumber 0x1A
  51. #define CR_PLL2ON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLL2ON_BitNumber * 4))
  52. /* Alias word address of PLL3ON bit */
  53. #define PLL3ON_BitNumber 0x1C
  54. #define CR_PLL3ON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLL3ON_BitNumber * 4))
  55. #endif /* STM32F10X_CL */
  56. /* Alias word address of CSSON bit */
  57. #define CSSON_BitNumber 0x13
  58. #define CR_CSSON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (CSSON_BitNumber * 4))
  59. /* --- CFGR Register ---*/
  60. /* Alias word address of USBPRE bit */
  61. #define CFGR_OFFSET (RCC_OFFSET + 0x04)
  62. #ifndef STM32F10X_CL
  63. #define USBPRE_BitNumber 0x16
  64. #define CFGR_USBPRE_BB (PERIPH_BB_BASE + (CFGR_OFFSET * 32) + (USBPRE_BitNumber * 4))
  65. #else
  66. #define OTGFSPRE_BitNumber 0x16
  67. #define CFGR_OTGFSPRE_BB (PERIPH_BB_BASE + (CFGR_OFFSET * 32) + (OTGFSPRE_BitNumber * 4))
  68. #endif /* STM32F10X_CL */
  69. /* --- BDCR Register ---*/
  70. /* Alias word address of RTCEN bit */
  71. #define BDCR_OFFSET (RCC_OFFSET + 0x20)
  72. #define RTCEN_BitNumber 0x0F
  73. #define BDCR_RTCEN_BB (PERIPH_BB_BASE + (BDCR_OFFSET * 32) + (RTCEN_BitNumber * 4))
  74. /* Alias word address of BDRST bit */
  75. #define BDRST_BitNumber 0x10
  76. #define BDCR_BDRST_BB (PERIPH_BB_BASE + (BDCR_OFFSET * 32) + (BDRST_BitNumber * 4))
  77. /* --- CSR Register ---*/
  78. /* Alias word address of LSION bit */
  79. #define CSR_OFFSET (RCC_OFFSET + 0x24)
  80. #define LSION_BitNumber 0x00
  81. #define CSR_LSION_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (LSION_BitNumber * 4))
  82. #ifdef STM32F10X_CL
  83. /* --- CFGR2 Register ---*/
  84. /* Alias word address of I2S2SRC bit */
  85. #define CFGR2_OFFSET (RCC_OFFSET + 0x2C)
  86. #define I2S2SRC_BitNumber 0x11
  87. #define CFGR2_I2S2SRC_BB (PERIPH_BB_BASE + (CFGR2_OFFSET * 32) + (I2S2SRC_BitNumber * 4))
  88. /* Alias word address of I2S3SRC bit */
  89. #define I2S3SRC_BitNumber 0x12
  90. #define CFGR2_I2S3SRC_BB (PERIPH_BB_BASE + (CFGR2_OFFSET * 32) + (I2S3SRC_BitNumber * 4))
  91. #endif /* STM32F10X_CL */
  92. /* ---------------------- RCC registers bit mask ------------------------ */
  93. /* CR register bit mask */
  94. #define CR_HSEBYP_Reset ((uint32_t)0xFFFBFFFF)
  95. #define CR_HSEBYP_Set ((uint32_t)0x00040000)
  96. #define CR_HSEON_Reset ((uint32_t)0xFFFEFFFF)
  97. #define CR_HSEON_Set ((uint32_t)0x00010000)
  98. #define CR_HSITRIM_Mask ((uint32_t)0xFFFFFF07)
  99. /* CFGR register bit mask */
  100. #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_CL)
  101. #define CFGR_PLL_Mask ((uint32_t)0xFFC2FFFF)
  102. #else
  103. #define CFGR_PLL_Mask ((uint32_t)0xFFC0FFFF)
  104. #endif /* STM32F10X_CL */
  105. #define CFGR_PLLMull_Mask ((uint32_t)0x003C0000)
  106. #define CFGR_PLLSRC_Mask ((uint32_t)0x00010000)
  107. #define CFGR_PLLXTPRE_Mask ((uint32_t)0x00020000)
  108. #define CFGR_SWS_Mask ((uint32_t)0x0000000C)
  109. #define CFGR_SW_Mask ((uint32_t)0xFFFFFFFC)
  110. #define CFGR_HPRE_Reset_Mask ((uint32_t)0xFFFFFF0F)
  111. #define CFGR_HPRE_Set_Mask ((uint32_t)0x000000F0)
  112. #define CFGR_PPRE1_Reset_Mask ((uint32_t)0xFFFFF8FF)
  113. #define CFGR_PPRE1_Set_Mask ((uint32_t)0x00000700)
  114. #define CFGR_PPRE2_Reset_Mask ((uint32_t)0xFFFFC7FF)
  115. #define CFGR_PPRE2_Set_Mask ((uint32_t)0x00003800)
  116. #define CFGR_ADCPRE_Reset_Mask ((uint32_t)0xFFFF3FFF)
  117. #define CFGR_ADCPRE_Set_Mask ((uint32_t)0x0000C000)
  118. /* CSR register bit mask */
  119. #define CSR_RMVF_Set ((uint32_t)0x01000000)
  120. #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_CL)
  121. /* CFGR2 register bit mask */
  122. #define CFGR2_PREDIV1SRC ((uint32_t)0x00010000)
  123. #define CFGR2_PREDIV1 ((uint32_t)0x0000000F)
  124. #endif
  125. #ifdef STM32F10X_CL
  126. #define CFGR2_PREDIV2 ((uint32_t)0x000000F0)
  127. #define CFGR2_PLL2MUL ((uint32_t)0x00000F00)
  128. #define CFGR2_PLL3MUL ((uint32_t)0x0000F000)
  129. #endif /* STM32F10X_CL */
  130. /* RCC Flag Mask */
  131. #define FLAG_Mask ((uint8_t)0x1F)
  132. #ifndef HSI_Value
  133. /* Typical Value of the HSI in Hz */
  134. #define HSI_Value ((uint32_t)8000000)
  135. #endif /* HSI_Value */
  136. /* CIR register byte 2 (Bits[15:8]) base address */
  137. #define CIR_BYTE2_ADDRESS ((uint32_t)0x40021009)
  138. /* CIR register byte 3 (Bits[23:16]) base address */
  139. #define CIR_BYTE3_ADDRESS ((uint32_t)0x4002100A)
  140. /* CFGR register byte 4 (Bits[31:24]) base address */
  141. #define CFGR_BYTE4_ADDRESS ((uint32_t)0x40021007)
  142. /* BDCR register base address */
  143. #define BDCR_ADDRESS (PERIPH_BASE + BDCR_OFFSET)
  144. #ifndef HSEStartUp_TimeOut
  145. /* Time out for HSE start up */
  146. #define HSEStartUp_TimeOut ((uint16_t)0x0500)
  147. #endif /* HSEStartUp_TimeOut */
  148. /**
  149. * @}
  150. */
  151. /** @defgroup RCC_Private_Macros
  152. * @{
  153. */
  154. /**
  155. * @}
  156. */
  157. /** @defgroup RCC_Private_Variables
  158. * @{
  159. */
  160. static __I uint8_t APBAHBPrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9};
  161. static __I uint8_t ADCPrescTable[4] = {2, 4, 6, 8};
  162. /**
  163. * @}
  164. */
  165. /** @defgroup RCC_Private_FunctionPrototypes
  166. * @{
  167. */
  168. /**
  169. * @}
  170. */
  171. /** @defgroup RCC_Private_Functions
  172. * @{
  173. */
  174. /**
  175. * @brief Resets the RCC clock configuration to the default reset state.
  176. * @param None
  177. * @retval None
  178. */
  179. void RCC_DeInit(void)
  180. {
  181. /* Set HSION bit */
  182. RCC->CR |= (uint32_t)0x00000001;
  183. /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
  184. #ifndef STM32F10X_CL
  185. RCC->CFGR &= (uint32_t)0xF8FF0000;
  186. #else
  187. RCC->CFGR &= (uint32_t)0xF0FF0000;
  188. #endif /* STM32F10X_CL */
  189. /* Reset HSEON, CSSON and PLLON bits */
  190. RCC->CR &= (uint32_t)0xFEF6FFFF;
  191. /* Reset HSEBYP bit */
  192. RCC->CR &= (uint32_t)0xFFFBFFFF;
  193. /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
  194. RCC->CFGR &= (uint32_t)0xFF80FFFF;
  195. #ifdef STM32F10X_CL
  196. /* Reset PLL2ON and PLL3ON bits */
  197. RCC->CR &= (uint32_t)0xEBFFFFFF;
  198. /* Disable all interrupts and clear pending bits */
  199. RCC->CIR = 0x00FF0000;
  200. /* Reset CFGR2 register */
  201. RCC->CFGR2 = 0x00000000;
  202. #elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL)
  203. /* Disable all interrupts and clear pending bits */
  204. RCC->CIR = 0x009F0000;
  205. /* Reset CFGR2 register */
  206. RCC->CFGR2 = 0x00000000;
  207. #else
  208. /* Disable all interrupts and clear pending bits */
  209. RCC->CIR = 0x009F0000;
  210. #endif /* STM32F10X_CL */
  211. }
  212. /**
  213. * @brief Configures the External High Speed oscillator (HSE).
  214. * @note HSE can not be stopped if it is used directly or through the PLL as system clock.
  215. * @param RCC_HSE: specifies the new state of the HSE.
  216. * This parameter can be one of the following values:
  217. * @arg RCC_HSE_OFF: HSE oscillator OFF
  218. * @arg RCC_HSE_ON: HSE oscillator ON
  219. * @arg RCC_HSE_Bypass: HSE oscillator bypassed with external clock
  220. * @retval None
  221. */
  222. void RCC_HSEConfig(uint32_t RCC_HSE)
  223. {
  224. /* Check the parameters */
  225. assert_param(IS_RCC_HSE(RCC_HSE));
  226. /* Reset HSEON and HSEBYP bits before configuring the HSE ------------------*/
  227. /* Reset HSEON bit */
  228. RCC->CR &= CR_HSEON_Reset;
  229. /* Reset HSEBYP bit */
  230. RCC->CR &= CR_HSEBYP_Reset;
  231. /* Configure HSE (RCC_HSE_OFF is already covered by the code section above) */
  232. switch(RCC_HSE)
  233. {
  234. case RCC_HSE_ON:
  235. /* Set HSEON bit */
  236. RCC->CR |= CR_HSEON_Set;
  237. break;
  238. case RCC_HSE_Bypass:
  239. /* Set HSEBYP and HSEON bits */
  240. RCC->CR |= CR_HSEBYP_Set | CR_HSEON_Set;
  241. break;
  242. default:
  243. break;
  244. }
  245. }
  246. /**
  247. * @brief Waits for HSE start-up.
  248. * @param None
  249. * @retval An ErrorStatus enumuration value:
  250. * - SUCCESS: HSE oscillator is stable and ready to use
  251. * - ERROR: HSE oscillator not yet ready
  252. */
  253. ErrorStatus RCC_WaitForHSEStartUp(void)
  254. {
  255. __IO uint32_t StartUpCounter = 0;
  256. ErrorStatus status = ERROR;
  257. FlagStatus HSEStatus = RESET;
  258. /* Wait till HSE is ready and if Time out is reached exit */
  259. do
  260. {
  261. HSEStatus = RCC_GetFlagStatus(RCC_FLAG_HSERDY);
  262. StartUpCounter++;
  263. } while((StartUpCounter != HSEStartUp_TimeOut) && (HSEStatus == RESET));
  264. if (RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET)
  265. {
  266. status = SUCCESS;
  267. }
  268. else
  269. {
  270. status = ERROR;
  271. }
  272. return (status);
  273. }
  274. /**
  275. * @brief Adjusts the Internal High Speed oscillator (HSI) calibration value.
  276. * @param HSICalibrationValue: specifies the calibration trimming value.
  277. * This parameter must be a number between 0 and 0x1F.
  278. * @retval None
  279. */
  280. void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue)
  281. {
  282. uint32_t tmpreg = 0;
  283. /* Check the parameters */
  284. assert_param(IS_RCC_CALIBRATION_VALUE(HSICalibrationValue));
  285. tmpreg = RCC->CR;
  286. /* Clear HSITRIM[4:0] bits */
  287. tmpreg &= CR_HSITRIM_Mask;
  288. /* Set the HSITRIM[4:0] bits according to HSICalibrationValue value */
  289. tmpreg |= (uint32_t)HSICalibrationValue << 3;
  290. /* Store the new value */
  291. RCC->CR = tmpreg;
  292. }
  293. /**
  294. * @brief Enables or disables the Internal High Speed oscillator (HSI).
  295. * @note HSI can not be stopped if it is used directly or through the PLL as system clock.
  296. * @param NewState: new state of the HSI. This parameter can be: ENABLE or DISABLE.
  297. * @retval None
  298. */
  299. void RCC_HSICmd(FunctionalState NewState)
  300. {
  301. /* Check the parameters */
  302. assert_param(IS_FUNCTIONAL_STATE(NewState));
  303. *(__IO uint32_t *) CR_HSION_BB = (uint32_t)NewState;
  304. }
  305. /**
  306. * @brief Configures the PLL clock source and multiplication factor.
  307. * @note This function must be used only when the PLL is disabled.
  308. * @param RCC_PLLSource: specifies the PLL entry clock source.
  309. * For @b STM32_Connectivity_line_devices or @b STM32_Value_line_devices,
  310. * this parameter can be one of the following values:
  311. * @arg RCC_PLLSource_HSI_Div2: HSI oscillator clock divided by 2 selected as PLL clock entry
  312. * @arg RCC_PLLSource_PREDIV1: PREDIV1 clock selected as PLL clock entry
  313. * For @b other_STM32_devices, this parameter can be one of the following values:
  314. * @arg RCC_PLLSource_HSI_Div2: HSI oscillator clock divided by 2 selected as PLL clock entry
  315. * @arg RCC_PLLSource_HSE_Div1: HSE oscillator clock selected as PLL clock entry
  316. * @arg RCC_PLLSource_HSE_Div2: HSE oscillator clock divided by 2 selected as PLL clock entry
  317. * @param RCC_PLLMul: specifies the PLL multiplication factor.
  318. * For @b STM32_Connectivity_line_devices, this parameter can be RCC_PLLMul_x where x:{[4,9], 6_5}
  319. * For @b other_STM32_devices, this parameter can be RCC_PLLMul_x where x:[2,16]
  320. * @retval None
  321. */
  322. void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul)
  323. {
  324. uint32_t tmpreg = 0;
  325. /* Check the parameters */
  326. assert_param(IS_RCC_PLL_SOURCE(RCC_PLLSource));
  327. assert_param(IS_RCC_PLL_MUL(RCC_PLLMul));
  328. tmpreg = RCC->CFGR;
  329. /* Clear PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */
  330. tmpreg &= CFGR_PLL_Mask;
  331. /* Set the PLL configuration bits */
  332. tmpreg |= RCC_PLLSource | RCC_PLLMul;
  333. /* Store the new value */
  334. RCC->CFGR = tmpreg;
  335. }
  336. /**
  337. * @brief Enables or disables the PLL.
  338. * @note The PLL can not be disabled if it is used as system clock.
  339. * @param NewState: new state of the PLL. This parameter can be: ENABLE or DISABLE.
  340. * @retval None
  341. */
  342. void RCC_PLLCmd(FunctionalState NewState)
  343. {
  344. /* Check the parameters */
  345. assert_param(IS_FUNCTIONAL_STATE(NewState));
  346. *(__IO uint32_t *) CR_PLLON_BB = (uint32_t)NewState;
  347. }
  348. #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_CL)
  349. /**
  350. * @brief Configures the PREDIV1 division factor.
  351. * @note
  352. * - This function must be used only when the PLL is disabled.
  353. * - This function applies only to STM32 Connectivity line and Value line
  354. * devices.
  355. * @param RCC_PREDIV1_Source: specifies the PREDIV1 clock source.
  356. * This parameter can be one of the following values:
  357. * @arg RCC_PREDIV1_Source_HSE: HSE selected as PREDIV1 clock
  358. * @arg RCC_PREDIV1_Source_PLL2: PLL2 selected as PREDIV1 clock
  359. * @note
  360. * For @b STM32_Value_line_devices this parameter is always RCC_PREDIV1_Source_HSE
  361. * @param RCC_PREDIV1_Div: specifies the PREDIV1 clock division factor.
  362. * This parameter can be RCC_PREDIV1_Divx where x:[1,16]
  363. * @retval None
  364. */
  365. void RCC_PREDIV1Config(uint32_t RCC_PREDIV1_Source, uint32_t RCC_PREDIV1_Div)
  366. {
  367. uint32_t tmpreg = 0;
  368. /* Check the parameters */
  369. assert_param(IS_RCC_PREDIV1_SOURCE(RCC_PREDIV1_Source));
  370. assert_param(IS_RCC_PREDIV1(RCC_PREDIV1_Div));
  371. tmpreg = RCC->CFGR2;
  372. /* Clear PREDIV1[3:0] and PREDIV1SRC bits */
  373. tmpreg &= ~(CFGR2_PREDIV1 | CFGR2_PREDIV1SRC);
  374. /* Set the PREDIV1 clock source and division factor */
  375. tmpreg |= RCC_PREDIV1_Source | RCC_PREDIV1_Div ;
  376. /* Store the new value */
  377. RCC->CFGR2 = tmpreg;
  378. }
  379. #endif
  380. #ifdef STM32F10X_CL
  381. /**
  382. * @brief Configures the PREDIV2 division factor.
  383. * @note
  384. * - This function must be used only when both PLL2 and PLL3 are disabled.
  385. * - This function applies only to STM32 Connectivity line devices.
  386. * @param RCC_PREDIV2_Div: specifies the PREDIV2 clock division factor.
  387. * This parameter can be RCC_PREDIV2_Divx where x:[1,16]
  388. * @retval None
  389. */
  390. void RCC_PREDIV2Config(uint32_t RCC_PREDIV2_Div)
  391. {
  392. uint32_t tmpreg = 0;
  393. /* Check the parameters */
  394. assert_param(IS_RCC_PREDIV2(RCC_PREDIV2_Div));
  395. tmpreg = RCC->CFGR2;
  396. /* Clear PREDIV2[3:0] bits */
  397. tmpreg &= ~CFGR2_PREDIV2;
  398. /* Set the PREDIV2 division factor */
  399. tmpreg |= RCC_PREDIV2_Div;
  400. /* Store the new value */
  401. RCC->CFGR2 = tmpreg;
  402. }
  403. /**
  404. * @brief Configures the PLL2 multiplication factor.
  405. * @note
  406. * - This function must be used only when the PLL2 is disabled.
  407. * - This function applies only to STM32 Connectivity line devices.
  408. * @param RCC_PLL2Mul: specifies the PLL2 multiplication factor.
  409. * This parameter can be RCC_PLL2Mul_x where x:{[8,14], 16, 20}
  410. * @retval None
  411. */
  412. void RCC_PLL2Config(uint32_t RCC_PLL2Mul)
  413. {
  414. uint32_t tmpreg = 0;
  415. /* Check the parameters */
  416. assert_param(IS_RCC_PLL2_MUL(RCC_PLL2Mul));
  417. tmpreg = RCC->CFGR2;
  418. /* Clear PLL2Mul[3:0] bits */
  419. tmpreg &= ~CFGR2_PLL2MUL;
  420. /* Set the PLL2 configuration bits */
  421. tmpreg |= RCC_PLL2Mul;
  422. /* Store the new value */
  423. RCC->CFGR2 = tmpreg;
  424. }
  425. /**
  426. * @brief Enables or disables the PLL2.
  427. * @note
  428. * - The PLL2 can not be disabled if it is used indirectly as system clock
  429. * (i.e. it is used as PLL clock entry that is used as System clock).
  430. * - This function applies only to STM32 Connectivity line devices.
  431. * @param NewState: new state of the PLL2. This parameter can be: ENABLE or DISABLE.
  432. * @retval None
  433. */
  434. void RCC_PLL2Cmd(FunctionalState NewState)
  435. {
  436. /* Check the parameters */
  437. assert_param(IS_FUNCTIONAL_STATE(NewState));
  438. *(__IO uint32_t *) CR_PLL2ON_BB = (uint32_t)NewState;
  439. }
  440. /**
  441. * @brief Configures the PLL3 multiplication factor.
  442. * @note
  443. * - This function must be used only when the PLL3 is disabled.
  444. * - This function applies only to STM32 Connectivity line devices.
  445. * @param RCC_PLL3Mul: specifies the PLL3 multiplication factor.
  446. * This parameter can be RCC_PLL3Mul_x where x:{[8,14], 16, 20}
  447. * @retval None
  448. */
  449. void RCC_PLL3Config(uint32_t RCC_PLL3Mul)
  450. {
  451. uint32_t tmpreg = 0;
  452. /* Check the parameters */
  453. assert_param(IS_RCC_PLL3_MUL(RCC_PLL3Mul));
  454. tmpreg = RCC->CFGR2;
  455. /* Clear PLL3Mul[3:0] bits */
  456. tmpreg &= ~CFGR2_PLL3MUL;
  457. /* Set the PLL3 configuration bits */
  458. tmpreg |= RCC_PLL3Mul;
  459. /* Store the new value */
  460. RCC->CFGR2 = tmpreg;
  461. }
  462. /**
  463. * @brief Enables or disables the PLL3.
  464. * @note This function applies only to STM32 Connectivity line devices.
  465. * @param NewState: new state of the PLL3. This parameter can be: ENABLE or DISABLE.
  466. * @retval None
  467. */
  468. void RCC_PLL3Cmd(FunctionalState NewState)
  469. {
  470. /* Check the parameters */
  471. assert_param(IS_FUNCTIONAL_STATE(NewState));
  472. *(__IO uint32_t *) CR_PLL3ON_BB = (uint32_t)NewState;
  473. }
  474. #endif /* STM32F10X_CL */
  475. /**
  476. * @brief Configures the system clock (SYSCLK).
  477. * @param RCC_SYSCLKSource: specifies the clock source used as system clock.
  478. * This parameter can be one of the following values:
  479. * @arg RCC_SYSCLKSource_HSI: HSI selected as system clock
  480. * @arg RCC_SYSCLKSource_HSE: HSE selected as system clock
  481. * @arg RCC_SYSCLKSource_PLLCLK: PLL selected as system clock
  482. * @retval None
  483. */
  484. void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource)
  485. {
  486. uint32_t tmpreg = 0;
  487. /* Check the parameters */
  488. assert_param(IS_RCC_SYSCLK_SOURCE(RCC_SYSCLKSource));
  489. tmpreg = RCC->CFGR;
  490. /* Clear SW[1:0] bits */
  491. tmpreg &= CFGR_SW_Mask;
  492. /* Set SW[1:0] bits according to RCC_SYSCLKSource value */
  493. tmpreg |= RCC_SYSCLKSource;
  494. /* Store the new value */
  495. RCC->CFGR = tmpreg;
  496. }
  497. /**
  498. * @brief Returns the clock source used as system clock.
  499. * @param None
  500. * @retval The clock source used as system clock. The returned value can
  501. * be one of the following:
  502. * - 0x00: HSI used as system clock
  503. * - 0x04: HSE used as system clock
  504. * - 0x08: PLL used as system clock
  505. */
  506. uint8_t RCC_GetSYSCLKSource(void)
  507. {
  508. return ((uint8_t)(RCC->CFGR & CFGR_SWS_Mask));
  509. }
  510. /**
  511. * @brief Configures the AHB clock (HCLK).
  512. * @param RCC_SYSCLK: defines the AHB clock divider. This clock is derived from
  513. * the system clock (SYSCLK).
  514. * This parameter can be one of the following values:
  515. * @arg RCC_SYSCLK_Div1: AHB clock = SYSCLK
  516. * @arg RCC_SYSCLK_Div2: AHB clock = SYSCLK/2
  517. * @arg RCC_SYSCLK_Div4: AHB clock = SYSCLK/4
  518. * @arg RCC_SYSCLK_Div8: AHB clock = SYSCLK/8
  519. * @arg RCC_SYSCLK_Div16: AHB clock = SYSCLK/16
  520. * @arg RCC_SYSCLK_Div64: AHB clock = SYSCLK/64
  521. * @arg RCC_SYSCLK_Div128: AHB clock = SYSCLK/128
  522. * @arg RCC_SYSCLK_Div256: AHB clock = SYSCLK/256
  523. * @arg RCC_SYSCLK_Div512: AHB clock = SYSCLK/512
  524. * @retval None
  525. */
  526. void RCC_HCLKConfig(uint32_t RCC_SYSCLK)
  527. {
  528. uint32_t tmpreg = 0;
  529. /* Check the parameters */
  530. assert_param(IS_RCC_HCLK(RCC_SYSCLK));
  531. tmpreg = RCC->CFGR;
  532. /* Clear HPRE[3:0] bits */
  533. tmpreg &= CFGR_HPRE_Reset_Mask;
  534. /* Set HPRE[3:0] bits according to RCC_SYSCLK value */
  535. tmpreg |= RCC_SYSCLK;
  536. /* Store the new value */
  537. RCC->CFGR = tmpreg;
  538. }
  539. /**
  540. * @brief Configures the Low Speed APB clock (PCLK1).
  541. * @param RCC_HCLK: defines the APB1 clock divider. This clock is derived from
  542. * the AHB clock (HCLK).
  543. * This parameter can be one of the following values:
  544. * @arg RCC_HCLK_Div1: APB1 clock = HCLK
  545. * @arg RCC_HCLK_Div2: APB1 clock = HCLK/2
  546. * @arg RCC_HCLK_Div4: APB1 clock = HCLK/4
  547. * @arg RCC_HCLK_Div8: APB1 clock = HCLK/8
  548. * @arg RCC_HCLK_Div16: APB1 clock = HCLK/16
  549. * @retval None
  550. */
  551. void RCC_PCLK1Config(uint32_t RCC_HCLK)
  552. {
  553. uint32_t tmpreg = 0;
  554. /* Check the parameters */
  555. assert_param(IS_RCC_PCLK(RCC_HCLK));
  556. tmpreg = RCC->CFGR;
  557. /* Clear PPRE1[2:0] bits */
  558. tmpreg &= CFGR_PPRE1_Reset_Mask;
  559. /* Set PPRE1[2:0] bits according to RCC_HCLK value */
  560. tmpreg |= RCC_HCLK;
  561. /* Store the new value */
  562. RCC->CFGR = tmpreg;
  563. }
  564. /**
  565. * @brief Configures the High Speed APB clock (PCLK2).
  566. * @param RCC_HCLK: defines the APB2 clock divider. This clock is derived from
  567. * the AHB clock (HCLK).
  568. * This parameter can be one of the following values:
  569. * @arg RCC_HCLK_Div1: APB2 clock = HCLK
  570. * @arg RCC_HCLK_Div2: APB2 clock = HCLK/2
  571. * @arg RCC_HCLK_Div4: APB2 clock = HCLK/4
  572. * @arg RCC_HCLK_Div8: APB2 clock = HCLK/8
  573. * @arg RCC_HCLK_Div16: APB2 clock = HCLK/16
  574. * @retval None
  575. */
  576. void RCC_PCLK2Config(uint32_t RCC_HCLK)
  577. {
  578. uint32_t tmpreg = 0;
  579. /* Check the parameters */
  580. assert_param(IS_RCC_PCLK(RCC_HCLK));
  581. tmpreg = RCC->CFGR;
  582. /* Clear PPRE2[2:0] bits */
  583. tmpreg &= CFGR_PPRE2_Reset_Mask;
  584. /* Set PPRE2[2:0] bits according to RCC_HCLK value */
  585. tmpreg |= RCC_HCLK << 3;
  586. /* Store the new value */
  587. RCC->CFGR = tmpreg;
  588. }
  589. /**
  590. * @brief Enables or disables the specified RCC interrupts.
  591. * @param RCC_IT: specifies the RCC interrupt sources to be enabled or disabled.
  592. *
  593. * For @b STM32_Connectivity_line_devices, this parameter can be any combination
  594. * of the following values
  595. * @arg RCC_IT_LSIRDY: LSI ready interrupt
  596. * @arg RCC_IT_LSERDY: LSE ready interrupt
  597. * @arg RCC_IT_HSIRDY: HSI ready interrupt
  598. * @arg RCC_IT_HSERDY: HSE ready interrupt
  599. * @arg RCC_IT_PLLRDY: PLL ready interrupt
  600. * @arg RCC_IT_PLL2RDY: PLL2 ready interrupt
  601. * @arg RCC_IT_PLL3RDY: PLL3 ready interrupt
  602. *
  603. * For @b other_STM32_devices, this parameter can be any combination of the
  604. * following values
  605. * @arg RCC_IT_LSIRDY: LSI ready interrupt
  606. * @arg RCC_IT_LSERDY: LSE ready interrupt
  607. * @arg RCC_IT_HSIRDY: HSI ready interrupt
  608. * @arg RCC_IT_HSERDY: HSE ready interrupt
  609. * @arg RCC_IT_PLLRDY: PLL ready interrupt
  610. *
  611. * @param NewState: new state of the specified RCC interrupts.
  612. * This parameter can be: ENABLE or DISABLE.
  613. * @retval None
  614. */
  615. void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState)
  616. {
  617. /* Check the parameters */
  618. assert_param(IS_RCC_IT(RCC_IT));
  619. assert_param(IS_FUNCTIONAL_STATE(NewState));
  620. if (NewState != DISABLE)
  621. {
  622. /* Perform Byte access to RCC_CIR bits to enable the selected interrupts */
  623. *(__IO uint8_t *) CIR_BYTE2_ADDRESS |= RCC_IT;
  624. }
  625. else
  626. {
  627. /* Perform Byte access to RCC_CIR bits to disable the selected interrupts */
  628. *(__IO uint8_t *) CIR_BYTE2_ADDRESS &= (uint8_t)~RCC_IT;
  629. }
  630. }
  631. #ifndef STM32F10X_CL
  632. /**
  633. * @brief Configures the USB clock (USBCLK).
  634. * @param RCC_USBCLKSource: specifies the USB clock source. This clock is
  635. * derived from the PLL output.
  636. * This parameter can be one of the following values:
  637. * @arg RCC_USBCLKSource_PLLCLK_1Div5: PLL clock divided by 1,5 selected as USB
  638. * clock source
  639. * @arg RCC_USBCLKSource_PLLCLK_Div1: PLL clock selected as USB clock source
  640. * @retval None
  641. */
  642. void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource)
  643. {
  644. /* Check the parameters */
  645. assert_param(IS_RCC_USBCLK_SOURCE(RCC_USBCLKSource));
  646. *(__IO uint32_t *) CFGR_USBPRE_BB = RCC_USBCLKSource;
  647. }
  648. #else
  649. /**
  650. * @brief Configures the USB OTG FS clock (OTGFSCLK).
  651. * This function applies only to STM32 Connectivity line devices.
  652. * @param RCC_OTGFSCLKSource: specifies the USB OTG FS clock source.
  653. * This clock is derived from the PLL output.
  654. * This parameter can be one of the following values:
  655. * @arg RCC_OTGFSCLKSource_PLLVCO_Div3: PLL VCO clock divided by 2 selected as USB OTG FS clock source
  656. * @arg RCC_OTGFSCLKSource_PLLVCO_Div2: PLL VCO clock divided by 2 selected as USB OTG FS clock source
  657. * @retval None
  658. */
  659. void RCC_OTGFSCLKConfig(uint32_t RCC_OTGFSCLKSource)
  660. {
  661. /* Check the parameters */
  662. assert_param(IS_RCC_OTGFSCLK_SOURCE(RCC_OTGFSCLKSource));
  663. *(__IO uint32_t *) CFGR_OTGFSPRE_BB = RCC_OTGFSCLKSource;
  664. }
  665. #endif /* STM32F10X_CL */
  666. /**
  667. * @brief Configures the ADC clock (ADCCLK).
  668. * @param RCC_PCLK2: defines the ADC clock divider. This clock is derived from
  669. * the APB2 clock (PCLK2).
  670. * This parameter can be one of the following values:
  671. * @arg RCC_PCLK2_Div2: ADC clock = PCLK2/2
  672. * @arg RCC_PCLK2_Div4: ADC clock = PCLK2/4
  673. * @arg RCC_PCLK2_Div6: ADC clock = PCLK2/6
  674. * @arg RCC_PCLK2_Div8: ADC clock = PCLK2/8
  675. * @retval None
  676. */
  677. void RCC_ADCCLKConfig(uint32_t RCC_PCLK2)
  678. {
  679. uint32_t tmpreg = 0;
  680. /* Check the parameters */
  681. assert_param(IS_RCC_ADCCLK(RCC_PCLK2));
  682. tmpreg = RCC->CFGR;
  683. /* Clear ADCPRE[1:0] bits */
  684. tmpreg &= CFGR_ADCPRE_Reset_Mask;
  685. /* Set ADCPRE[1:0] bits according to RCC_PCLK2 value */
  686. tmpreg |= RCC_PCLK2;
  687. /* Store the new value */
  688. RCC->CFGR = tmpreg;
  689. }
  690. #ifdef STM32F10X_CL
  691. /**
  692. * @brief Configures the I2S2 clock source(I2S2CLK).
  693. * @note
  694. * - This function must be called before enabling I2S2 APB clock.
  695. * - This function applies only to STM32 Connectivity line devices.
  696. * @param RCC_I2S2CLKSource: specifies the I2S2 clock source.
  697. * This parameter can be one of the following values:
  698. * @arg RCC_I2S2CLKSource_SYSCLK: system clock selected as I2S2 clock entry
  699. * @arg RCC_I2S2CLKSource_PLL3_VCO: PLL3 VCO clock selected as I2S2 clock entry
  700. * @retval None
  701. */
  702. void RCC_I2S2CLKConfig(uint32_t RCC_I2S2CLKSource)
  703. {
  704. /* Check the parameters */
  705. assert_param(IS_RCC_I2S2CLK_SOURCE(RCC_I2S2CLKSource));
  706. *(__IO uint32_t *) CFGR2_I2S2SRC_BB = RCC_I2S2CLKSource;
  707. }
  708. /**
  709. * @brief Configures the I2S3 clock source(I2S2CLK).
  710. * @note
  711. * - This function must be called before enabling I2S3 APB clock.
  712. * - This function applies only to STM32 Connectivity line devices.
  713. * @param RCC_I2S3CLKSource: specifies the I2S3 clock source.
  714. * This parameter can be one of the following values:
  715. * @arg RCC_I2S3CLKSource_SYSCLK: system clock selected as I2S3 clock entry
  716. * @arg RCC_I2S3CLKSource_PLL3_VCO: PLL3 VCO clock selected as I2S3 clock entry
  717. * @retval None
  718. */
  719. void RCC_I2S3CLKConfig(uint32_t RCC_I2S3CLKSource)
  720. {
  721. /* Check the parameters */
  722. assert_param(IS_RCC_I2S3CLK_SOURCE(RCC_I2S3CLKSource));
  723. *(__IO uint32_t *) CFGR2_I2S3SRC_BB = RCC_I2S3CLKSource;
  724. }
  725. #endif /* STM32F10X_CL */
  726. /**
  727. * @brief Configures the External Low Speed oscillator (LSE).
  728. * @param RCC_LSE: specifies the new state of the LSE.
  729. * This parameter can be one of the following values:
  730. * @arg RCC_LSE_OFF: LSE oscillator OFF
  731. * @arg RCC_LSE_ON: LSE oscillator ON
  732. * @arg RCC_LSE_Bypass: LSE oscillator bypassed with external clock
  733. * @retval None
  734. */
  735. void RCC_LSEConfig(uint8_t RCC_LSE)
  736. {
  737. /* Check the parameters */
  738. assert_param(IS_RCC_LSE(RCC_LSE));
  739. /* Reset LSEON and LSEBYP bits before configuring the LSE ------------------*/
  740. /* Reset LSEON bit */
  741. *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF;
  742. /* Reset LSEBYP bit */
  743. *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF;
  744. /* Configure LSE (RCC_LSE_OFF is already covered by the code section above) */
  745. switch(RCC_LSE)
  746. {
  747. case RCC_LSE_ON:
  748. /* Set LSEON bit */
  749. *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_ON;
  750. break;
  751. case RCC_LSE_Bypass:
  752. /* Set LSEBYP and LSEON bits */
  753. *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_Bypass | RCC_LSE_ON;
  754. break;
  755. default:
  756. break;
  757. }
  758. }
  759. /**
  760. * @brief Enables or disables the Internal Low Speed oscillator (LSI).
  761. * @note LSI can not be disabled if the IWDG is running.
  762. * @param NewState: new state of the LSI. This parameter can be: ENABLE or DISABLE.
  763. * @retval None
  764. */
  765. void RCC_LSICmd(FunctionalState NewState)
  766. {
  767. /* Check the parameters */
  768. assert_param(IS_FUNCTIONAL_STATE(NewState));
  769. *(__IO uint32_t *) CSR_LSION_BB = (uint32_t)NewState;
  770. }
  771. /**
  772. * @brief Configures the RTC clock (RTCCLK).
  773. * @note Once the RTC clock is selected it can’t be changed unless the Backup domain is reset.
  774. * @param RCC_RTCCLKSource: specifies the RTC clock source.
  775. * This parameter can be one of the following values:
  776. * @arg RCC_RTCCLKSource_LSE: LSE selected as RTC clock
  777. * @arg RCC_RTCCLKSource_LSI: LSI selected as RTC clock
  778. * @arg RCC_RTCCLKSource_HSE_Div128: HSE clock divided by 128 selected as RTC clock
  779. * @retval None
  780. */
  781. void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource)
  782. {
  783. /* Check the parameters */
  784. assert_param(IS_RCC_RTCCLK_SOURCE(RCC_RTCCLKSource));
  785. /* Select the RTC clock source */
  786. RCC->BDCR |= RCC_RTCCLKSource;
  787. }
  788. /**
  789. * @brief Enables or disables the RTC clock.
  790. * @note This function must be used only after the RTC clock was selected using the RCC_RTCCLKConfig function.
  791. * @param NewState: new state of the RTC clock. This parameter can be: ENABLE or DISABLE.
  792. * @retval None
  793. */
  794. void RCC_RTCCLKCmd(FunctionalState NewState)
  795. {
  796. /* Check the parameters */
  797. assert_param(IS_FUNCTIONAL_STATE(NewState));
  798. *(__IO uint32_t *) BDCR_RTCEN_BB = (uint32_t)NewState;
  799. }
  800. /**
  801. * @brief Returns the frequencies of different on chip clocks.
  802. * @param RCC_Clocks: pointer to a RCC_ClocksTypeDef structure which will hold
  803. * the clocks frequencies.
  804. * @retval None
  805. */
  806. void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
  807. {
  808. uint32_t tmp = 0, pllmull = 0, pllsource = 0, presc = 0;
  809. #ifdef STM32F10X_CL
  810. uint32_t prediv1source = 0, prediv1factor = 0, prediv2factor = 0, pll2mull = 0;
  811. #endif /* STM32F10X_CL */
  812. #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL)
  813. uint32_t prediv1factor = 0;
  814. #endif
  815. /* Get SYSCLK source -------------------------------------------------------*/
  816. tmp = RCC->CFGR & CFGR_SWS_Mask;
  817. switch (tmp)
  818. {
  819. case 0x00: /* HSI used as system clock */
  820. RCC_Clocks->SYSCLK_Frequency = HSI_Value;
  821. break;
  822. case 0x04: /* HSE used as system clock */
  823. RCC_Clocks->SYSCLK_Frequency = HSE_Value;
  824. break;
  825. case 0x08: /* PLL used as system clock */
  826. /* Get PLL clock source and multiplication factor ----------------------*/
  827. pllmull = RCC->CFGR & CFGR_PLLMull_Mask;
  828. pllsource = RCC->CFGR & CFGR_PLLSRC_Mask;
  829. #ifndef STM32F10X_CL
  830. pllmull = ( pllmull >> 18) + 2;
  831. if (pllsource == 0x00)
  832. {/* HSI oscillator clock divided by 2 selected as PLL clock entry */
  833. RCC_Clocks->SYSCLK_Frequency = (HSI_Value >> 1) * pllmull;
  834. }
  835. else
  836. {
  837. #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL)
  838. prediv1factor = (RCC->CFGR2 & CFGR2_PREDIV1) + 1;
  839. /* HSE oscillator clock selected as PREDIV1 clock entry */
  840. RCC_Clocks->SYSCLK_Frequency = (HSE_Value / prediv1factor) * pllmull;
  841. #else
  842. /* HSE selected as PLL clock entry */
  843. if ((RCC->CFGR & CFGR_PLLXTPRE_Mask) != (uint32_t)RESET)
  844. {/* HSE oscillator clock divided by 2 */
  845. RCC_Clocks->SYSCLK_Frequency = (HSE_Value >> 1) * pllmull;
  846. }
  847. else
  848. {
  849. RCC_Clocks->SYSCLK_Frequency = HSE_Value * pllmull;
  850. }
  851. #endif
  852. }
  853. #else
  854. pllmull = pllmull >> 18;
  855. if (pllmull != 0x0D)
  856. {
  857. pllmull += 2;
  858. }
  859. else
  860. { /* PLL multiplication factor = PLL input clock * 6.5 */
  861. pllmull = 13 / 2;
  862. }
  863. if (pllsource == 0x00)
  864. {/* HSI oscillator clock divided by 2 selected as PLL clock entry */
  865. RCC_Clocks->SYSCLK_Frequency = (HSI_Value >> 1) * pllmull;
  866. }
  867. else
  868. {/* PREDIV1 selected as PLL clock entry */
  869. /* Get PREDIV1 clock source and division factor */
  870. prediv1source = RCC->CFGR2 & CFGR2_PREDIV1SRC;
  871. prediv1factor = (RCC->CFGR2 & CFGR2_PREDIV1) + 1;
  872. if (prediv1source == 0)
  873. { /* HSE oscillator clock selected as PREDIV1 clock entry */
  874. RCC_Clocks->SYSCLK_Frequency = (HSE_Value / prediv1factor) * pllmull;
  875. }
  876. else
  877. {/* PLL2 clock selected as PREDIV1 clock entry */
  878. /* Get PREDIV2 division factor and PLL2 multiplication factor */
  879. prediv2factor = ((RCC->CFGR2 & CFGR2_PREDIV2) >> 4) + 1;
  880. pll2mull = ((RCC->CFGR2 & CFGR2_PLL2MUL) >> 8 ) + 2;
  881. RCC_Clocks->SYSCLK_Frequency = (((HSE_Value / prediv2factor) * pll2mull) / prediv1factor) * pllmull;
  882. }
  883. }
  884. #endif /* STM32F10X_CL */
  885. break;
  886. default:
  887. RCC_Clocks->SYSCLK_Frequency = HSI_Value;
  888. break;
  889. }
  890. /* Compute HCLK, PCLK1, PCLK2 and ADCCLK clocks frequencies ----------------*/
  891. /* Get HCLK prescaler */
  892. tmp = RCC->CFGR & CFGR_HPRE_Set_Mask;
  893. tmp = tmp >> 4;
  894. presc = APBAHBPrescTable[tmp];
  895. /* HCLK clock frequency */
  896. RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc;
  897. /* Get PCLK1 prescaler */
  898. tmp = RCC->CFGR & CFGR_PPRE1_Set_Mask;
  899. tmp = tmp >> 8;
  900. presc = APBAHBPrescTable[tmp];
  901. /* PCLK1 clock frequency */
  902. RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc;
  903. /* Get PCLK2 prescaler */
  904. tmp = RCC->CFGR & CFGR_PPRE2_Set_Mask;
  905. tmp = tmp >> 11;
  906. presc = APBAHBPrescTable[tmp];
  907. /* PCLK2 clock frequency */
  908. RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc;
  909. /* Get ADCCLK prescaler */
  910. tmp = RCC->CFGR & CFGR_ADCPRE_Set_Mask;
  911. tmp = tmp >> 14;
  912. presc = ADCPrescTable[tmp];
  913. /* ADCCLK clock frequency */
  914. RCC_Clocks->ADCCLK_Frequency = RCC_Clocks->PCLK2_Frequency / presc;
  915. }
  916. /**
  917. * @brief Enables or disables the AHB peripheral clock.
  918. * @param RCC_AHBPeriph: specifies the AHB peripheral to gates its clock.
  919. *
  920. * For @b STM32_Connectivity_line_devices, this parameter can be any combination
  921. * of the following values:
  922. * @arg RCC_AHBPeriph_DMA1
  923. * @arg RCC_AHBPeriph_DMA2
  924. * @arg RCC_AHBPeriph_SRAM
  925. * @arg RCC_AHBPeriph_FLITF
  926. * @arg RCC_AHBPeriph_CRC
  927. * @arg RCC_AHBPeriph_OTG_FS
  928. * @arg RCC_AHBPeriph_ETH_MAC
  929. * @arg RCC_AHBPeriph_ETH_MAC_Tx
  930. * @arg RCC_AHBPeriph_ETH_MAC_Rx
  931. *
  932. * For @b other_STM32_devices, this parameter can be any combination of the
  933. * following values:
  934. * @arg RCC_AHBPeriph_DMA1
  935. * @arg RCC_AHBPeriph_DMA2
  936. * @arg RCC_AHBPeriph_SRAM
  937. * @arg RCC_AHBPeriph_FLITF
  938. * @arg RCC_AHBPeriph_CRC
  939. * @arg RCC_AHBPeriph_FSMC
  940. * @arg RCC_AHBPeriph_SDIO
  941. *
  942. * @note SRAM and FLITF clock can be disabled only during sleep mode.
  943. * @param NewState: new state of the specified peripheral clock.
  944. * This parameter can be: ENABLE or DISABLE.
  945. * @retval None
  946. */
  947. void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState)
  948. {
  949. /* Check the parameters */
  950. assert_param(IS_RCC_AHB_PERIPH(RCC_AHBPeriph));
  951. assert_param(IS_FUNCTIONAL_STATE(NewState));
  952. if (NewState != DISABLE)
  953. {
  954. RCC->AHBENR |= RCC_AHBPeriph;
  955. }
  956. else
  957. {
  958. RCC->AHBENR &= ~RCC_AHBPeriph;
  959. }
  960. }
  961. /**
  962. * @brief Enables or disables the High Speed APB (APB2) peripheral clock.
  963. * @param RCC_APB2Periph: specifies the APB2 peripheral to gates its clock.
  964. * This parameter can be any combination of the following values:
  965. * @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
  966. * RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,
  967. * RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
  968. * RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
  969. * RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
  970. * RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,
  971. * RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11
  972. * @param NewState: new state of the specified peripheral clock.
  973. * This parameter can be: ENABLE or DISABLE.
  974. * @retval None
  975. */
  976. void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
  977. {
  978. /* Check the parameters */
  979. assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
  980. assert_param(IS_FUNCTIONAL_STATE(NewState));
  981. if (NewState != DISABLE)
  982. {
  983. RCC->APB2ENR |= RCC_APB2Periph;
  984. }
  985. else
  986. {
  987. RCC->APB2ENR &= ~RCC_APB2Periph;
  988. }
  989. }
  990. /**
  991. * @brief Enables or disables the Low Speed APB (APB1) peripheral clock.
  992. * @param RCC_APB1Periph: specifies the APB1 peripheral to gates its clock.
  993. * This parameter can be any combination of the following values:
  994. * @arg RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4,
  995. * RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7,
  996. * RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3,
  997. * RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4,
  998. * RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2,
  999. * RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP,
  1000. * RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC,
  1001. * RCC_APB1Periph_TIM12, RCC_APB1Periph_TIM13, RCC_APB1Periph_TIM14
  1002. * @param NewState: new state of the specified peripheral clock.
  1003. * This parameter can be: ENABLE or DISABLE.
  1004. * @retval None
  1005. */
  1006. void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
  1007. {
  1008. /* Check the parameters */
  1009. assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));
  1010. assert_param(IS_FUNCTIONAL_STATE(NewState));
  1011. if (NewState != DISABLE)
  1012. {
  1013. RCC->APB1ENR |= RCC_APB1Periph;
  1014. }
  1015. else
  1016. {
  1017. RCC->APB1ENR &= ~RCC_APB1Periph;
  1018. }
  1019. }
  1020. #ifdef STM32F10X_CL
  1021. /**
  1022. * @brief Forces or releases AHB peripheral reset.
  1023. * @note This function applies only to STM32 Connectivity line devices.
  1024. * @param RCC_AHBPeriph: specifies the AHB peripheral to reset.
  1025. * This parameter can be any combination of the following values:
  1026. * @arg RCC_AHBPeriph_OTG_FS
  1027. * @arg RCC_AHBPeriph_ETH_MAC
  1028. * @param NewState: new state of the specified peripheral reset.
  1029. * This parameter can be: ENABLE or DISABLE.
  1030. * @retval None
  1031. */
  1032. void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState)
  1033. {
  1034. /* Check the parameters */
  1035. assert_param(IS_RCC_AHB_PERIPH_RESET(RCC_AHBPeriph));
  1036. assert_param(IS_FUNCTIONAL_STATE(NewState));
  1037. if (NewState != DISABLE)
  1038. {
  1039. RCC->AHBRSTR |= RCC_AHBPeriph;
  1040. }
  1041. else
  1042. {
  1043. RCC->AHBRSTR &= ~RCC_AHBPeriph;
  1044. }
  1045. }
  1046. #endif /* STM32F10X_CL */
  1047. /**
  1048. * @brief Forces or releases High Speed APB (APB2) peripheral reset.
  1049. * @param RCC_APB2Periph: specifies the APB2 peripheral to reset.
  1050. * This parameter can be any combination of the following values:
  1051. * @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
  1052. * RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,
  1053. * RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
  1054. * RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
  1055. * RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
  1056. * RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,
  1057. * RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11
  1058. * @param NewState: new state of the specified peripheral reset.
  1059. * This parameter can be: ENABLE or DISABLE.
  1060. * @retval None
  1061. */
  1062. void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
  1063. {
  1064. /* Check the parameters */
  1065. assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
  1066. assert_param(IS_FUNCTIONAL_STATE(NewState));
  1067. if (NewState != DISABLE)
  1068. {
  1069. RCC->APB2RSTR |= RCC_APB2Periph;
  1070. }
  1071. else
  1072. {
  1073. RCC->APB2RSTR &= ~RCC_APB2Periph;
  1074. }
  1075. }
  1076. /**
  1077. * @brief Forces or releases Low Speed APB (APB1) peripheral reset.
  1078. * @param RCC_APB1Periph: specifies the APB1 peripheral to reset.
  1079. * This parameter can be any combination of the following values:
  1080. * @arg RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4,
  1081. * RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7,
  1082. * RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3,
  1083. * RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4,
  1084. * RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2,
  1085. * RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP,
  1086. * RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC,
  1087. * RCC_APB1Periph_TIM12, RCC_APB1Periph_TIM13, RCC_APB1Periph_TIM14
  1088. * @param NewState: new state of the specified peripheral clock.
  1089. * This parameter can be: ENABLE or DISABLE.
  1090. * @retval None
  1091. */
  1092. void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
  1093. {
  1094. /* Check the parameters */
  1095. assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));
  1096. assert_param(IS_FUNCTIONAL_STATE(NewState));
  1097. if (NewState != DISABLE)
  1098. {
  1099. RCC->APB1RSTR |= RCC_APB1Periph;
  1100. }
  1101. else
  1102. {
  1103. RCC->APB1RSTR &= ~RCC_APB1Periph;
  1104. }
  1105. }
  1106. /**
  1107. * @brief Forces or releases the Backup domain reset.
  1108. * @param NewState: new state of the Backup domain reset.
  1109. * This parameter can be: ENABLE or DISABLE.
  1110. * @retval None
  1111. */
  1112. void RCC_BackupResetCmd(FunctionalState NewState)
  1113. {
  1114. /* Check the parameters */
  1115. assert_param(IS_FUNCTIONAL_STATE(NewState));
  1116. *(__IO uint32_t *) BDCR_BDRST_BB = (uint32_t)NewState;
  1117. }
  1118. /**
  1119. * @brief Enables or disables the Clock Security System.
  1120. * @param NewState: new state of the Clock Security System..
  1121. * This parameter can be: ENABLE or DISABLE.
  1122. * @retval None
  1123. */
  1124. void RCC_ClockSecuritySystemCmd(FunctionalState NewState)
  1125. {
  1126. /* Check the parameters */
  1127. assert_param(IS_FUNCTIONAL_STATE(NewState));
  1128. *(__IO uint32_t *) CR_CSSON_BB = (uint32_t)NewState;
  1129. }
  1130. /**
  1131. * @brief Selects the clock source to output on MCO pin.
  1132. * @param RCC_MCO: specifies the clock source to output.
  1133. *
  1134. * For @b STM32_Connectivity_line_devices, this parameter can be one of the
  1135. * following values:
  1136. * @arg RCC_MCO_NoClock: No clock selected
  1137. * @arg RCC_MCO_SYSCLK: System clock selected
  1138. * @arg RCC_MCO_HSI: HSI oscillator clock selected
  1139. * @arg RCC_MCO_HSE: HSE oscillator clock selected
  1140. * @arg RCC_MCO_PLLCLK_Div2: PLL clock divided by 2 selected
  1141. * @arg RCC_MCO_PLL2CLK: PLL2 clock selected
  1142. * @arg RCC_MCO_PLL3CLK_Div2: PLL3 clock divided by 2 selected
  1143. * @arg RCC_MCO_XT1: External 3-25 MHz oscillator clock selected
  1144. * @arg RCC_MCO_PLL3CLK: PLL3 clock selected
  1145. *
  1146. * For @b other_STM32_devices, this parameter can be one of the following values:
  1147. * @arg RCC_MCO_NoClock: No clock selected
  1148. * @arg RCC_MCO_SYSCLK: System clock selected
  1149. * @arg RCC_MCO_HSI: HSI oscillator clock selected
  1150. * @arg RCC_MCO_HSE: HSE oscillator clock selected
  1151. * @arg RCC_MCO_PLLCLK_Div2: PLL clock divided by 2 selected
  1152. *
  1153. * @retval None
  1154. */
  1155. void RCC_MCOConfig(uint8_t RCC_MCO)
  1156. {
  1157. /* Check the parameters */
  1158. assert_param(IS_RCC_MCO(RCC_MCO));
  1159. /* Perform Byte access to MCO bits to select the MCO source */
  1160. *(__IO uint8_t *) CFGR_BYTE4_ADDRESS = RCC_MCO;
  1161. }
  1162. /**
  1163. * @brief Checks whether the specified RCC flag is set or not.
  1164. * @param RCC_FLAG: specifies the flag to check.
  1165. *
  1166. * For @b STM32_Connectivity_line_devices, this parameter can be one of the
  1167. * following values:
  1168. * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready
  1169. * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready
  1170. * @arg RCC_FLAG_PLLRDY: PLL clock ready
  1171. * @arg RCC_FLAG_PLL2RDY: PLL2 clock ready
  1172. * @arg RCC_FLAG_PLL3RDY: PLL3 clock ready
  1173. * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready
  1174. * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready
  1175. * @arg RCC_FLAG_PINRST: Pin reset
  1176. * @arg RCC_FLAG_PORRST: POR/PDR reset
  1177. * @arg RCC_FLAG_SFTRST: Software reset
  1178. * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset
  1179. * @arg RCC_FLAG_WWDGRST: Window Watchdog reset
  1180. * @arg RCC_FLAG_LPWRRST: Low Power reset
  1181. *
  1182. * For @b other_STM32_devices, this parameter can be one of the following values:
  1183. * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready
  1184. * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready
  1185. * @arg RCC_FLAG_PLLRDY: PLL clock ready
  1186. * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready
  1187. * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready
  1188. * @arg RCC_FLAG_PINRST: Pin reset
  1189. * @arg RCC_FLAG_PORRST: POR/PDR reset
  1190. * @arg RCC_FLAG_SFTRST: Software reset
  1191. * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset
  1192. * @arg RCC_FLAG_WWDGRST: Window Watchdog reset
  1193. * @arg RCC_FLAG_LPWRRST: Low Power reset
  1194. *
  1195. * @retval The new state of RCC_FLAG (SET or RESET).
  1196. */
  1197. FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG)
  1198. {
  1199. uint32_t tmp = 0;
  1200. uint32_t statusreg = 0;
  1201. FlagStatus bitstatus = RESET;
  1202. /* Check the parameters */
  1203. assert_param(IS_RCC_FLAG(RCC_FLAG));
  1204. /* Get the RCC register index */
  1205. tmp = RCC_FLAG >> 5;
  1206. if (tmp == 1) /* The flag to check is in CR register */
  1207. {
  1208. statusreg = RCC->CR;
  1209. }
  1210. else if (tmp == 2) /* The flag to check is in BDCR register */
  1211. {
  1212. statusreg = RCC->BDCR;
  1213. }
  1214. else /* The flag to check is in CSR register */
  1215. {
  1216. statusreg = RCC->CSR;
  1217. }
  1218. /* Get the flag position */
  1219. tmp = RCC_FLAG & FLAG_Mask;
  1220. if ((statusreg & ((uint32_t)1 << tmp)) != (uint32_t)RESET)
  1221. {
  1222. bitstatus = SET;
  1223. }
  1224. else
  1225. {
  1226. bitstatus = RESET;
  1227. }
  1228. /* Return the flag status */
  1229. return bitstatus;
  1230. }
  1231. /**
  1232. * @brief Clears the RCC reset flags.
  1233. * @note The reset flags are: RCC_FLAG_PINRST, RCC_FLAG_PORRST, RCC_FLAG_SFTRST,
  1234. * RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST, RCC_FLAG_LPWRRST
  1235. * @param None
  1236. * @retval None
  1237. */
  1238. void RCC_ClearFlag(void)
  1239. {
  1240. /* Set RMVF bit to clear the reset flags */
  1241. RCC->CSR |= CSR_RMVF_Set;
  1242. }
  1243. /**
  1244. * @brief Checks whether the specified RCC interrupt has occurred or not.
  1245. * @param RCC_IT: specifies the RCC interrupt source to check.
  1246. *
  1247. * For @b STM32_Connectivity_line_devices, this parameter can be one of the
  1248. * following values:
  1249. * @arg RCC_IT_LSIRDY: LSI ready interrupt
  1250. * @arg RCC_IT_LSERDY: LSE ready interrupt
  1251. * @arg RCC_IT_HSIRDY: HSI ready interrupt
  1252. * @arg RCC_IT_HSERDY: HSE ready interrupt
  1253. * @arg RCC_IT_PLLRDY: PLL ready interrupt
  1254. * @arg RCC_IT_PLL2RDY: PLL2 ready interrupt
  1255. * @arg RCC_IT_PLL3RDY: PLL3 ready interrupt
  1256. * @arg RCC_IT_CSS: Clock Security System interrupt
  1257. *
  1258. * For @b other_STM32_devices, this parameter can be one of the following values:
  1259. * @arg RCC_IT_LSIRDY: LSI ready interrupt
  1260. * @arg RCC_IT_LSERDY: LSE ready interrupt
  1261. * @arg RCC_IT_HSIRDY: HSI ready interrupt
  1262. * @arg RCC_IT_HSERDY: HSE ready interrupt
  1263. * @arg RCC_IT_PLLRDY: PLL ready interrupt
  1264. * @arg RCC_IT_CSS: Clock Security System interrupt
  1265. *
  1266. * @retval The new state of RCC_IT (SET or RESET).
  1267. */
  1268. ITStatus RCC_GetITStatus(uint8_t RCC_IT)
  1269. {
  1270. ITStatus bitstatus = RESET;
  1271. /* Check the parameters */
  1272. assert_param(IS_RCC_GET_IT(RCC_IT));
  1273. /* Check the status of the specified RCC interrupt */
  1274. if ((RCC->CIR & RCC_IT) != (uint32_t)RESET)
  1275. {
  1276. bitstatus = SET;
  1277. }
  1278. else
  1279. {
  1280. bitstatus = RESET;
  1281. }
  1282. /* Return the RCC_IT status */
  1283. return bitstatus;
  1284. }
  1285. /**
  1286. * @brief Clears the RCC’s interrupt pending bits.
  1287. * @param RCC_IT: specifies the interrupt pending bit to clear.
  1288. *
  1289. * For @b STM32_Connectivity_line_devices, this parameter can be any combination
  1290. * of the following values:
  1291. * @arg RCC_IT_LSIRDY: LSI ready interrupt
  1292. * @arg RCC_IT_LSERDY: LSE ready interrupt
  1293. * @arg RCC_IT_HSIRDY: HSI ready interrupt
  1294. * @arg RCC_IT_HSERDY: HSE ready interrupt
  1295. * @arg RCC_IT_PLLRDY: PLL ready interrupt
  1296. * @arg RCC_IT_PLL2RDY: PLL2 ready interrupt
  1297. * @arg RCC_IT_PLL3RDY: PLL3 ready interrupt
  1298. * @arg RCC_IT_CSS: Clock Security System interrupt
  1299. *
  1300. * For @b other_STM32_devices, this parameter can be any combination of the
  1301. * following values:
  1302. * @arg RCC_IT_LSIRDY: LSI ready interrupt
  1303. * @arg RCC_IT_LSERDY: LSE ready interrupt
  1304. * @arg RCC_IT_HSIRDY: HSI ready interrupt
  1305. * @arg RCC_IT_HSERDY: HSE ready interrupt
  1306. * @arg RCC_IT_PLLRDY: PLL ready interrupt
  1307. *
  1308. * @arg RCC_IT_CSS: Clock Security System interrupt
  1309. * @retval None
  1310. */
  1311. void RCC_ClearITPendingBit(uint8_t RCC_IT)
  1312. {
  1313. /* Check the parameters */
  1314. assert_param(IS_RCC_CLEAR_IT(RCC_IT));
  1315. /* Perform Byte access to RCC_CIR[23:16] bits to clear the selected interrupt
  1316. pending bits */
  1317. *(__IO uint8_t *) CIR_BYTE3_ADDRESS = RCC_IT;
  1318. }
  1319. /**
  1320. * @}
  1321. */
  1322. /**
  1323. * @}
  1324. */
  1325. /**
  1326. * @}
  1327. */
  1328. /******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/