stm32f10x_rcc.c
上传用户:yj_qqy
上传日期:2017-01-28
资源大小:2911k
文件大小:43k
源码类别:

uCOS

开发平台:

C/C++

  1. /******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
  2. * File Name          : stm32f10x_rcc.c
  3. * Author             : MCD Application Team
  4. * Version            : V2.0.2
  5. * Date               : 07/11/2008
  6. * Description        : This file provides all the RCC firmware functions.
  7. ********************************************************************************
  8. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  9. * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
  10. * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
  11. * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
  12. * CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
  13. * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  14. *******************************************************************************/
  15. /* Includes ------------------------------------------------------------------*/
  16. #include "stm32f10x_rcc.h"
  17. /* Private typedef -----------------------------------------------------------*/
  18. /* Private define ------------------------------------------------------------*/
  19. /* ------------ RCC registers bit address in the alias region ----------- */
  20. #define RCC_OFFSET                (RCC_BASE - PERIPH_BASE)
  21. /* --- CR Register ---*/
  22. /* Alias word address of HSION bit */
  23. #define CR_OFFSET                 (RCC_OFFSET + 0x00)
  24. #define HSION_BitNumber           0x00
  25. #define CR_HSION_BB               (PERIPH_BB_BASE + (CR_OFFSET * 32) + (HSION_BitNumber * 4))
  26. /* Alias word address of PLLON bit */
  27. #define PLLON_BitNumber           0x18
  28. #define CR_PLLON_BB               (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLLON_BitNumber * 4))
  29. /* Alias word address of CSSON bit */
  30. #define CSSON_BitNumber           0x13
  31. #define CR_CSSON_BB               (PERIPH_BB_BASE + (CR_OFFSET * 32) + (CSSON_BitNumber * 4))
  32. /* --- CFGR Register ---*/
  33. /* Alias word address of USBPRE bit */
  34. #define CFGR_OFFSET               (RCC_OFFSET + 0x04)
  35. #define USBPRE_BitNumber          0x16
  36. #define CFGR_USBPRE_BB            (PERIPH_BB_BASE + (CFGR_OFFSET * 32) + (USBPRE_BitNumber * 4))
  37. /* --- BDCR Register ---*/
  38. /* Alias word address of RTCEN bit */
  39. #define BDCR_OFFSET               (RCC_OFFSET + 0x20)
  40. #define RTCEN_BitNumber           0x0F
  41. #define BDCR_RTCEN_BB             (PERIPH_BB_BASE + (BDCR_OFFSET * 32) + (RTCEN_BitNumber * 4))
  42. /* Alias word address of BDRST bit */
  43. #define BDRST_BitNumber           0x10
  44. #define BDCR_BDRST_BB             (PERIPH_BB_BASE + (BDCR_OFFSET * 32) + (BDRST_BitNumber * 4))
  45. /* --- CSR Register ---*/
  46. /* Alias word address of LSION bit */
  47. #define CSR_OFFSET                (RCC_OFFSET + 0x24)
  48. #define LSION_BitNumber           0x00
  49. #define CSR_LSION_BB              (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (LSION_BitNumber * 4))
  50. /* ---------------------- RCC registers bit mask ------------------------ */
  51. /* CR register bit mask */
  52. #define CR_HSEBYP_Reset           ((u32)0xFFFBFFFF)
  53. #define CR_HSEBYP_Set             ((u32)0x00040000)
  54. #define CR_HSEON_Reset            ((u32)0xFFFEFFFF)
  55. #define CR_HSEON_Set              ((u32)0x00010000)
  56. #define CR_HSITRIM_Mask           ((u32)0xFFFFFF07)
  57. /* CFGR register bit mask */
  58. #define CFGR_PLL_Mask             ((u32)0xFFC0FFFF)
  59. #define CFGR_PLLMull_Mask         ((u32)0x003C0000)
  60. #define CFGR_PLLSRC_Mask          ((u32)0x00010000)
  61. #define CFGR_PLLXTPRE_Mask        ((u32)0x00020000)
  62. #define CFGR_SWS_Mask             ((u32)0x0000000C)
  63. #define CFGR_SW_Mask              ((u32)0xFFFFFFFC)
  64. #define CFGR_HPRE_Reset_Mask      ((u32)0xFFFFFF0F)
  65. #define CFGR_HPRE_Set_Mask        ((u32)0x000000F0)
  66. #define CFGR_PPRE1_Reset_Mask     ((u32)0xFFFFF8FF)
  67. #define CFGR_PPRE1_Set_Mask       ((u32)0x00000700)
  68. #define CFGR_PPRE2_Reset_Mask     ((u32)0xFFFFC7FF)
  69. #define CFGR_PPRE2_Set_Mask       ((u32)0x00003800)
  70. #define CFGR_ADCPRE_Reset_Mask    ((u32)0xFFFF3FFF)
  71. #define CFGR_ADCPRE_Set_Mask      ((u32)0x0000C000)
  72. /* CSR register bit mask */
  73. #define CSR_RMVF_Set              ((u32)0x01000000)
  74. /* RCC Flag Mask */
  75. #define FLAG_Mask                 ((u8)0x1F)
  76. /* Typical Value of the HSI in Hz */
  77. #define HSI_Value                 ((u32)8000000)
  78. /* CIR register byte 2 (Bits[15:8]) base address */
  79. #define CIR_BYTE2_ADDRESS         ((u32)0x40021009)
  80. /* CIR register byte 3 (Bits[23:16]) base address */
  81. #define CIR_BYTE3_ADDRESS         ((u32)0x4002100A)
  82. /* CFGR register byte 4 (Bits[31:24]) base address */
  83. #define CFGR_BYTE4_ADDRESS        ((u32)0x40021007)
  84. /* BDCR register base address */
  85. #define BDCR_ADDRESS              (PERIPH_BASE + BDCR_OFFSET)
  86. /* Time out for HSE start up */
  87. #define HSEStartUp_TimeOut        ((u16)0x01FF)
  88. /* Private macro -------------------------------------------------------------*/
  89. /* Private variables ---------------------------------------------------------*/
  90. static uc8 APBAHBPrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9};
  91. static uc8 ADCPrescTable[4] = {2, 4, 6, 8};
  92. static volatile FlagStatus HSEStatus;
  93. static vu32 StartUpCounter = 0;
  94. /* Private function prototypes -----------------------------------------------*/
  95. /* Private functions ---------------------------------------------------------*/
  96. /*******************************************************************************
  97. * Function Name  : RCC_DeInit
  98. * Description    : Resets the RCC clock configuration to the default reset state.
  99. * Input          : None
  100. * Output         : None
  101. * Return         : None
  102. *******************************************************************************/
  103. void RCC_DeInit(void)
  104. {
  105.   /* Set HSION bit */
  106.   RCC->CR |= (u32)0x00000001;
  107.   /* Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], ADCPRE[1:0] and MCO[2:0] bits */
  108.   RCC->CFGR &= (u32)0xF8FF0000;
  109.   
  110.   /* Reset HSEON, CSSON and PLLON bits */
  111.   RCC->CR &= (u32)0xFEF6FFFF;
  112.   /* Reset HSEBYP bit */
  113.   RCC->CR &= (u32)0xFFFBFFFF;
  114.   /* Reset PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE bits */
  115.   RCC->CFGR &= (u32)0xFF80FFFF;
  116.   /* Disable all interrupts */
  117.   RCC->CIR = 0x00000000;
  118. }
  119. /*******************************************************************************
  120. * Function Name  : RCC_HSEConfig
  121. * Description    : Configures the External High Speed oscillator (HSE).
  122. *                  HSE can not be stopped if it is used directly or through the 
  123. *                  PLL as system clock.
  124. * Input          : - RCC_HSE: specifies the new state of the HSE.
  125. *                    This parameter can be one of the following values:
  126. *                       - RCC_HSE_OFF: HSE oscillator OFF
  127. *                       - RCC_HSE_ON: HSE oscillator ON
  128. *                       - RCC_HSE_Bypass: HSE oscillator bypassed with external
  129. *                         clock
  130. * Output         : None
  131. * Return         : None
  132. *******************************************************************************/
  133. void RCC_HSEConfig(u32 RCC_HSE)
  134. {
  135.   /* Check the parameters */
  136.   assert_param(IS_RCC_HSE(RCC_HSE));
  137.   /* Reset HSEON and HSEBYP bits before configuring the HSE ------------------*/
  138.   /* Reset HSEON bit */
  139.   RCC->CR &= CR_HSEON_Reset;
  140.   /* Reset HSEBYP bit */
  141.   RCC->CR &= CR_HSEBYP_Reset;
  142.   /* Configure HSE (RCC_HSE_OFF is already covered by the code section above) */
  143.   switch(RCC_HSE)
  144.   {
  145.     case RCC_HSE_ON:
  146.       /* Set HSEON bit */
  147.       RCC->CR |= CR_HSEON_Set;
  148.       break;
  149.       
  150.     case RCC_HSE_Bypass:
  151.       /* Set HSEBYP and HSEON bits */
  152.       RCC->CR |= CR_HSEBYP_Set | CR_HSEON_Set;
  153.       break;            
  154.       
  155.     default:
  156.       break;      
  157.   }
  158. }
  159. /*******************************************************************************
  160. * Function Name  : RCC_WaitForHSEStartUp
  161. * Description    : Waits for HSE start-up.
  162. * Input          : None
  163. * Output         : None
  164. * Return         : An ErrorStatus enumuration value:
  165. *                         - SUCCESS: HSE oscillator is stable and ready to use
  166. *                         - ERROR: HSE oscillator not yet ready
  167. *******************************************************************************/
  168. ErrorStatus RCC_WaitForHSEStartUp(void)
  169. {
  170.   ErrorStatus status = ERROR;
  171.   /* Wait till HSE is ready and if Time out is reached exit */
  172.   do
  173.   {
  174.     HSEStatus = RCC_GetFlagStatus(RCC_FLAG_HSERDY);
  175.     StartUpCounter++;  
  176.   } while((HSEStatus == RESET) && (StartUpCounter != HSEStartUp_TimeOut));
  177.   if (RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET)
  178.   {
  179.     status = SUCCESS;
  180.   }
  181.   else
  182.   {
  183.     status = ERROR;
  184.   }  
  185.   return (status);
  186. }
  187. /*******************************************************************************
  188. * Function Name  : RCC_AdjustHSICalibrationValue
  189. * Description    : Adjusts the Internal High Speed oscillator (HSI) calibration
  190. *                  value.
  191. * Input          : - HSICalibrationValue: specifies the calibration trimming value.
  192. *                    This parameter must be a number between 0 and 0x1F.
  193. * Output         : None
  194. * Return         : None
  195. *******************************************************************************/
  196. void RCC_AdjustHSICalibrationValue(u8 HSICalibrationValue)
  197. {
  198.   u32 tmpreg = 0;
  199.   /* Check the parameters */
  200.   assert_param(IS_RCC_CALIBRATION_VALUE(HSICalibrationValue));
  201.   tmpreg = RCC->CR;
  202.   /* Clear HSITRIM[4:0] bits */
  203.   tmpreg &= CR_HSITRIM_Mask;
  204.   /* Set the HSITRIM[4:0] bits according to HSICalibrationValue value */
  205.   tmpreg |= (u32)HSICalibrationValue << 3;
  206.   /* Store the new value */
  207.   RCC->CR = tmpreg;
  208. }
  209. /*******************************************************************************
  210. * Function Name  : RCC_HSICmd
  211. * Description    : Enables or disables the Internal High Speed oscillator (HSI).
  212. *                  HSI can not be stopped if it is used directly or through the 
  213. *                  PLL as system clock.
  214. * Input          : - NewState: new state of the HSI.
  215. *                    This parameter can be: ENABLE or DISABLE.
  216. * Output         : None
  217. * Return         : None
  218. *******************************************************************************/
  219. void RCC_HSICmd(FunctionalState NewState)
  220. {
  221.   /* Check the parameters */
  222.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  223.   *(vu32 *) CR_HSION_BB = (u32)NewState;
  224. }
  225. /*******************************************************************************
  226. * Function Name  : RCC_PLLConfig
  227. * Description    : Configures the PLL clock source and multiplication factor.
  228. *                  This function must be used only when the PLL is disabled.
  229. * Input          : - RCC_PLLSource: specifies the PLL entry clock source.
  230. *                    This parameter can be one of the following values:
  231. *                       - RCC_PLLSource_HSI_Div2: HSI oscillator clock divided
  232. *                         by 2 selected as PLL clock entry
  233. *                       - RCC_PLLSource_HSE_Div1: HSE oscillator clock selected
  234. *                         as PLL clock entry
  235. *                       - RCC_PLLSource_HSE_Div2: HSE oscillator clock divided
  236. *                         by 2 selected as PLL clock entry
  237. *                  - RCC_PLLMul: specifies the PLL multiplication factor.
  238. *                    This parameter can be RCC_PLLMul_x where x:[2,16]
  239. * Output         : None
  240. * Return         : None
  241. *******************************************************************************/
  242. void RCC_PLLConfig(u32 RCC_PLLSource, u32 RCC_PLLMul)
  243. {
  244.   u32 tmpreg = 0;
  245.   /* Check the parameters */
  246.   assert_param(IS_RCC_PLL_SOURCE(RCC_PLLSource));
  247.   assert_param(IS_RCC_PLL_MUL(RCC_PLLMul));
  248.   tmpreg = RCC->CFGR;
  249.   /* Clear PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */
  250.   tmpreg &= CFGR_PLL_Mask;
  251.   /* Set the PLL configuration bits */
  252.   tmpreg |= RCC_PLLSource | RCC_PLLMul;
  253.   /* Store the new value */
  254.   RCC->CFGR = tmpreg;
  255. }
  256. /*******************************************************************************
  257. * Function Name  : RCC_PLLCmd
  258. * Description    : Enables or disables the PLL.
  259. *                  The PLL can not be disabled if it is used as system clock.
  260. * Input          : - NewState: new state of the PLL.
  261. *                    This parameter can be: ENABLE or DISABLE.
  262. * Output         : None
  263. * Return         : None
  264. *******************************************************************************/
  265. void RCC_PLLCmd(FunctionalState NewState)
  266. {
  267.   /* Check the parameters */
  268.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  269.   *(vu32 *) CR_PLLON_BB = (u32)NewState;
  270. }
  271. /*******************************************************************************
  272. * Function Name  : RCC_SYSCLKConfig
  273. * Description    : Configures the system clock (SYSCLK).
  274. * Input          : - RCC_SYSCLKSource: specifies the clock source used as system
  275. *                    clock. This parameter can be one of the following values:
  276. *                       - RCC_SYSCLKSource_HSI: HSI selected as system clock
  277. *                       - RCC_SYSCLKSource_HSE: HSE selected as system clock
  278. *                       - RCC_SYSCLKSource_PLLCLK: PLL selected as system clock
  279. * Output         : None
  280. * Return         : None
  281. *******************************************************************************/
  282. void RCC_SYSCLKConfig(u32 RCC_SYSCLKSource)
  283. {
  284.   u32 tmpreg = 0;
  285.   /* Check the parameters */
  286.   assert_param(IS_RCC_SYSCLK_SOURCE(RCC_SYSCLKSource));
  287.   tmpreg = RCC->CFGR;
  288.   /* Clear SW[1:0] bits */
  289.   tmpreg &= CFGR_SW_Mask;
  290.   /* Set SW[1:0] bits according to RCC_SYSCLKSource value */
  291.   tmpreg |= RCC_SYSCLKSource;
  292.   /* Store the new value */
  293.   RCC->CFGR = tmpreg;
  294. }
  295. /*******************************************************************************
  296. * Function Name  : RCC_GetSYSCLKSource
  297. * Description    : Returns the clock source used as system clock.
  298. * Input          : None
  299. * Output         : None
  300. * Return         : The clock source used as system clock. The returned value can
  301. *                  be one of the following:
  302. *                       - 0x00: HSI used as system clock
  303. *                       - 0x04: HSE used as system clock
  304. *                       - 0x08: PLL used as system clock
  305. *******************************************************************************/
  306. u8 RCC_GetSYSCLKSource(void)
  307. {
  308.   return ((u8)(RCC->CFGR & CFGR_SWS_Mask));
  309. }
  310. /*******************************************************************************
  311. * Function Name  : RCC_HCLKConfig
  312. * Description    : Configures the AHB clock (HCLK).
  313. * Input          : - RCC_SYSCLK: defines the AHB clock divider. This clock is
  314. *                    derived from the system clock (SYSCLK).
  315. *                    This parameter can be one of the following values:
  316. *                       - RCC_SYSCLK_Div1: AHB clock = SYSCLK
  317. *                       - RCC_SYSCLK_Div2: AHB clock = SYSCLK/2
  318. *                       - RCC_SYSCLK_Div4: AHB clock = SYSCLK/4
  319. *                       - RCC_SYSCLK_Div8: AHB clock = SYSCLK/8
  320. *                       - RCC_SYSCLK_Div16: AHB clock = SYSCLK/16
  321. *                       - RCC_SYSCLK_Div64: AHB clock = SYSCLK/64
  322. *                       - RCC_SYSCLK_Div128: AHB clock = SYSCLK/128
  323. *                       - RCC_SYSCLK_Div256: AHB clock = SYSCLK/256
  324. *                       - RCC_SYSCLK_Div512: AHB clock = SYSCLK/512
  325. * Output         : None
  326. * Return         : None
  327. *******************************************************************************/
  328. void RCC_HCLKConfig(u32 RCC_SYSCLK)
  329. {
  330.   u32 tmpreg = 0;
  331.   /* Check the parameters */
  332.   assert_param(IS_RCC_HCLK(RCC_SYSCLK));
  333.   tmpreg = RCC->CFGR;
  334.   /* Clear HPRE[3:0] bits */
  335.   tmpreg &= CFGR_HPRE_Reset_Mask;
  336.   /* Set HPRE[3:0] bits according to RCC_SYSCLK value */
  337.   tmpreg |= RCC_SYSCLK;
  338.   /* Store the new value */
  339.   RCC->CFGR = tmpreg;
  340. }
  341. /*******************************************************************************
  342. * Function Name  : RCC_PCLK1Config
  343. * Description    : Configures the Low Speed APB clock (PCLK1).
  344. * Input          : - RCC_HCLK: defines the APB1 clock divider. This clock is
  345. *                    derived from the AHB clock (HCLK).
  346. *                    This parameter can be one of the following values:
  347. *                       - RCC_HCLK_Div1: APB1 clock = HCLK
  348. *                       - RCC_HCLK_Div2: APB1 clock = HCLK/2
  349. *                       - RCC_HCLK_Div4: APB1 clock = HCLK/4
  350. *                       - RCC_HCLK_Div8: APB1 clock = HCLK/8
  351. *                       - RCC_HCLK_Div16: APB1 clock = HCLK/16
  352. * Output         : None
  353. * Return         : None
  354. *******************************************************************************/
  355. void RCC_PCLK1Config(u32 RCC_HCLK)
  356. {
  357.   u32 tmpreg = 0;
  358.   /* Check the parameters */
  359.   assert_param(IS_RCC_PCLK(RCC_HCLK));
  360.   tmpreg = RCC->CFGR;
  361.   /* Clear PPRE1[2:0] bits */
  362.   tmpreg &= CFGR_PPRE1_Reset_Mask;
  363.   /* Set PPRE1[2:0] bits according to RCC_HCLK value */
  364.   tmpreg |= RCC_HCLK;
  365.   /* Store the new value */
  366.   RCC->CFGR = tmpreg;
  367. }
  368. /*******************************************************************************
  369. * Function Name  : RCC_PCLK2Config
  370. * Description    : Configures the High Speed APB clock (PCLK2).
  371. * Input          : - RCC_HCLK: defines the APB2 clock divider. This clock is
  372. *                    derived from the AHB clock (HCLK).
  373. *                    This parameter can be one of the following values:
  374. *                       - RCC_HCLK_Div1: APB2 clock = HCLK
  375. *                       - RCC_HCLK_Div2: APB2 clock = HCLK/2
  376. *                       - RCC_HCLK_Div4: APB2 clock = HCLK/4
  377. *                       - RCC_HCLK_Div8: APB2 clock = HCLK/8
  378. *                       - RCC_HCLK_Div16: APB2 clock = HCLK/16
  379. * Output         : None
  380. * Return         : None
  381. *******************************************************************************/
  382. void RCC_PCLK2Config(u32 RCC_HCLK)
  383. {
  384.   u32 tmpreg = 0;
  385.   /* Check the parameters */
  386.   assert_param(IS_RCC_PCLK(RCC_HCLK));
  387.   tmpreg = RCC->CFGR;
  388.   /* Clear PPRE2[2:0] bits */
  389.   tmpreg &= CFGR_PPRE2_Reset_Mask;
  390.   /* Set PPRE2[2:0] bits according to RCC_HCLK value */
  391.   tmpreg |= RCC_HCLK << 3;
  392.   /* Store the new value */
  393.   RCC->CFGR = tmpreg;
  394. }
  395. /*******************************************************************************
  396. * Function Name  : RCC_ITConfig
  397. * Description    : Enables or disables the specified RCC interrupts.
  398. * Input          : - RCC_IT: specifies the RCC interrupt sources to be enabled
  399. *                    or disabled.
  400. *                    This parameter can be any combination of the following values:
  401. *                       - RCC_IT_LSIRDY: LSI ready interrupt
  402. *                       - RCC_IT_LSERDY: LSE ready interrupt
  403. *                       - RCC_IT_HSIRDY: HSI ready interrupt
  404. *                       - RCC_IT_HSERDY: HSE ready interrupt
  405. *                       - RCC_IT_PLLRDY: PLL ready interrupt
  406. *                  - NewState: new state of the specified RCC interrupts.
  407. *                    This parameter can be: ENABLE or DISABLE.
  408. * Output         : None
  409. * Return         : None
  410. *******************************************************************************/
  411. void RCC_ITConfig(u8 RCC_IT, FunctionalState NewState)
  412. {
  413.   /* Check the parameters */
  414.   assert_param(IS_RCC_IT(RCC_IT));
  415.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  416.   if (NewState != DISABLE)
  417.   {
  418.     /* Perform Byte access to RCC_CIR[12:8] bits to enable the selected interrupts */
  419.     *(vu8 *) CIR_BYTE2_ADDRESS |= RCC_IT;
  420.   }
  421.   else
  422.   {
  423.     /* Perform Byte access to RCC_CIR[12:8] bits to disable the selected interrupts */
  424.     *(vu8 *) CIR_BYTE2_ADDRESS &= (u8)~RCC_IT;
  425.   }
  426. }
  427. /*******************************************************************************
  428. * Function Name  : RCC_USBCLKConfig
  429. * Description    : Configures the USB clock (USBCLK).
  430. * Input          : - RCC_USBCLKSource: specifies the USB clock source. This clock
  431. *                    is derived from the PLL output.
  432. *                    This parameter can be one of the following values:
  433. *                       - RCC_USBCLKSource_PLLCLK_1Div5: PLL clock divided by 1,5
  434. *                         selected as USB clock source
  435. *                       - RCC_USBCLKSource_PLLCLK_Div1: PLL clock selected as USB
  436. *                         clock source
  437. * Output         : None
  438. * Return         : None
  439. *******************************************************************************/
  440. void RCC_USBCLKConfig(u32 RCC_USBCLKSource)
  441. {
  442.   /* Check the parameters */
  443.   assert_param(IS_RCC_USBCLK_SOURCE(RCC_USBCLKSource));
  444.   *(vu32 *) CFGR_USBPRE_BB = RCC_USBCLKSource;
  445. }
  446. /*******************************************************************************
  447. * Function Name  : RCC_ADCCLKConfig
  448. * Description    : Configures the ADC clock (ADCCLK).
  449. * Input          : - RCC_PCLK2: defines the ADC clock divider. This clock is
  450. *                    derived from the APB2 clock (PCLK2).
  451. *                    This parameter can be one of the following values:
  452. *                       - RCC_PCLK2_Div2: ADC clock = PCLK2/2
  453. *                       - RCC_PCLK2_Div4: ADC clock = PCLK2/4
  454. *                       - RCC_PCLK2_Div6: ADC clock = PCLK2/6
  455. *                       - RCC_PCLK2_Div8: ADC clock = PCLK2/8
  456. * Output         : None
  457. * Return         : None
  458. *******************************************************************************/
  459. void RCC_ADCCLKConfig(u32 RCC_PCLK2)
  460. {
  461.   u32 tmpreg = 0;
  462.   /* Check the parameters */
  463.   assert_param(IS_RCC_ADCCLK(RCC_PCLK2));
  464.   tmpreg = RCC->CFGR;
  465.   /* Clear ADCPRE[1:0] bits */
  466.   tmpreg &= CFGR_ADCPRE_Reset_Mask;
  467.   /* Set ADCPRE[1:0] bits according to RCC_PCLK2 value */
  468.   tmpreg |= RCC_PCLK2;
  469.   /* Store the new value */
  470.   RCC->CFGR = tmpreg;
  471. }
  472. /*******************************************************************************
  473. * Function Name  : RCC_LSEConfig
  474. * Description    : Configures the External Low Speed oscillator (LSE).
  475. * Input          : - RCC_LSE: specifies the new state of the LSE.
  476. *                    This parameter can be one of the following values:
  477. *                       - RCC_LSE_OFF: LSE oscillator OFF
  478. *                       - RCC_LSE_ON: LSE oscillator ON
  479. *                       - RCC_LSE_Bypass: LSE oscillator bypassed with external
  480. *                         clock
  481. * Output         : None
  482. * Return         : None
  483. *******************************************************************************/
  484. void RCC_LSEConfig(u8 RCC_LSE)
  485. {
  486.   /* Check the parameters */
  487.   assert_param(IS_RCC_LSE(RCC_LSE));
  488.   /* Reset LSEON and LSEBYP bits before configuring the LSE ------------------*/
  489.   /* Reset LSEON bit */
  490.   *(vu8 *) BDCR_ADDRESS = RCC_LSE_OFF;
  491.   /* Reset LSEBYP bit */
  492.   *(vu8 *) BDCR_ADDRESS = RCC_LSE_OFF;
  493.   /* Configure LSE (RCC_LSE_OFF is already covered by the code section above) */
  494.   switch(RCC_LSE)
  495.   {
  496.     case RCC_LSE_ON:
  497.       /* Set LSEON bit */
  498.       *(vu8 *) BDCR_ADDRESS = RCC_LSE_ON;
  499.       break;
  500.       
  501.     case RCC_LSE_Bypass:
  502.       /* Set LSEBYP and LSEON bits */
  503.       *(vu8 *) BDCR_ADDRESS = RCC_LSE_Bypass | RCC_LSE_ON;
  504.       break;            
  505.       
  506.     default:
  507.       break;      
  508.   }
  509. }
  510. /*******************************************************************************
  511. * Function Name  : RCC_LSICmd
  512. * Description    : Enables or disables the Internal Low Speed oscillator (LSI).
  513. *                  LSI can not be disabled if the IWDG is running.
  514. * Input          : - NewState: new state of the LSI.
  515. *                    This parameter can be: ENABLE or DISABLE.
  516. * Output         : None
  517. * Return         : None
  518. *******************************************************************************/
  519. void RCC_LSICmd(FunctionalState NewState)
  520. {
  521.   /* Check the parameters */
  522.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  523.   *(vu32 *) CSR_LSION_BB = (u32)NewState;
  524. }
  525. /*******************************************************************************
  526. * Function Name  : RCC_RTCCLKConfig
  527. * Description    : Configures the RTC clock (RTCCLK).
  528. *                  Once the RTC clock is selected it can抰 be changed unless the
  529. *                  Backup domain is reset.
  530. * Input          : - RCC_RTCCLKSource: specifies the RTC clock source.
  531. *                    This parameter can be one of the following values:
  532. *                       - RCC_RTCCLKSource_LSE: LSE selected as RTC clock
  533. *                       - RCC_RTCCLKSource_LSI: LSI selected as RTC clock
  534. *                       - RCC_RTCCLKSource_HSE_Div128: HSE clock divided by 128
  535. *                         selected as RTC clock
  536. * Output         : None
  537. * Return         : None
  538. *******************************************************************************/
  539. void RCC_RTCCLKConfig(u32 RCC_RTCCLKSource)
  540. {
  541.   /* Check the parameters */
  542.   assert_param(IS_RCC_RTCCLK_SOURCE(RCC_RTCCLKSource));
  543.   /* Select the RTC clock source */
  544.   RCC->BDCR |= RCC_RTCCLKSource;
  545. }
  546. /*******************************************************************************
  547. * Function Name  : RCC_RTCCLKCmd
  548. * Description    : Enables or disables the RTC clock.
  549. *                  This function must be used only after the RTC clock was
  550. *                  selected using the RCC_RTCCLKConfig function.
  551. * Input          : - NewState: new state of the RTC clock.
  552. *                    This parameter can be: ENABLE or DISABLE.
  553. * Output         : None
  554. * Return         : None
  555. *******************************************************************************/
  556. void RCC_RTCCLKCmd(FunctionalState NewState)
  557. {
  558.   /* Check the parameters */
  559.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  560.   *(vu32 *) BDCR_RTCEN_BB = (u32)NewState;
  561. }
  562. /*******************************************************************************
  563. * Function Name  : RCC_GetClocksFreq
  564. * Description    : Returns the frequencies of different on chip clocks.
  565. * Input          : - RCC_Clocks: pointer to a RCC_ClocksTypeDef structure which
  566. *                    will hold the clocks frequencies.
  567. * Output         : None
  568. * Return         : None
  569. *******************************************************************************/
  570. void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
  571. {
  572.   u32 tmp = 0, pllmull = 0, pllsource = 0, presc = 0;
  573.   /* Get SYSCLK source -------------------------------------------------------*/
  574.   tmp = RCC->CFGR & CFGR_SWS_Mask;
  575.   switch (tmp)
  576.   {
  577.     case 0x00:  /* HSI used as system clock */
  578.       RCC_Clocks->SYSCLK_Frequency = HSI_Value;
  579.       break;
  580.     case 0x04:  /* HSE used as system clock */
  581.       RCC_Clocks->SYSCLK_Frequency = HSE_Value;
  582.       break;
  583.     case 0x08:  /* PLL used as system clock */
  584.       /* Get PLL clock source and multiplication factor ----------------------*/
  585.       pllmull = RCC->CFGR & CFGR_PLLMull_Mask;
  586.       pllmull = ( pllmull >> 18) + 2;
  587.       pllsource = RCC->CFGR & CFGR_PLLSRC_Mask;
  588.       if (pllsource == 0x00)
  589.       {/* HSI oscillator clock divided by 2 selected as PLL clock entry */
  590.         RCC_Clocks->SYSCLK_Frequency = (HSI_Value >> 1) * pllmull;
  591.       }
  592.       else
  593.       {/* HSE selected as PLL clock entry */
  594.         if ((RCC->CFGR & CFGR_PLLXTPRE_Mask) != (u32)RESET)
  595.         {/* HSE oscillator clock divided by 2 */
  596.           RCC_Clocks->SYSCLK_Frequency = (HSE_Value >> 1) * pllmull;
  597.         }
  598.         else
  599.         {
  600.           RCC_Clocks->SYSCLK_Frequency = HSE_Value * pllmull;
  601.         }
  602.       }
  603.       break;
  604.     default:
  605.       RCC_Clocks->SYSCLK_Frequency = HSI_Value;
  606.       break;
  607.   }
  608.   /* Compute HCLK, PCLK1, PCLK2 and ADCCLK clocks frequencies ----------------*/
  609.   /* Get HCLK prescaler */
  610.   tmp = RCC->CFGR & CFGR_HPRE_Set_Mask;
  611.   tmp = tmp >> 4;
  612.   presc = APBAHBPrescTable[tmp];
  613.   /* HCLK clock frequency */
  614.   RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc;
  615.   /* Get PCLK1 prescaler */
  616.   tmp = RCC->CFGR & CFGR_PPRE1_Set_Mask;
  617.   tmp = tmp >> 8;
  618.   presc = APBAHBPrescTable[tmp];
  619.   /* PCLK1 clock frequency */
  620.   RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc;
  621.   /* Get PCLK2 prescaler */
  622.   tmp = RCC->CFGR & CFGR_PPRE2_Set_Mask;
  623.   tmp = tmp >> 11;
  624.   presc = APBAHBPrescTable[tmp];
  625.   /* PCLK2 clock frequency */
  626.   RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc;
  627.   /* Get ADCCLK prescaler */
  628.   tmp = RCC->CFGR & CFGR_ADCPRE_Set_Mask;
  629.   tmp = tmp >> 14;
  630.   presc = ADCPrescTable[tmp];
  631.   /* ADCCLK clock frequency */
  632.   RCC_Clocks->ADCCLK_Frequency = RCC_Clocks->PCLK2_Frequency / presc;
  633. }
  634. /*******************************************************************************
  635. * Function Name  : RCC_AHBPeriphClockCmd
  636. * Description    : Enables or disables the AHB peripheral clock.
  637. * Input          : - RCC_AHBPeriph: specifies the AHB peripheral to gates its clock.
  638. *                    This parameter can be any combination of the following values:
  639. *                       - RCC_AHBPeriph_DMA1
  640. *                       - RCC_AHBPeriph_DMA2
  641. *                       - RCC_AHBPeriph_SRAM
  642. *                       - RCC_AHBPeriph_FLITF
  643. *                       - RCC_AHBPeriph_CRC
  644. *                       - RCC_AHBPeriph_FSMC
  645. *                       - RCC_AHBPeriph_SDIO
  646. *                    SRAM and FLITF clock can be disabled only during sleep mode.
  647. *                  - NewState: new state of the specified peripheral clock.
  648. *                    This parameter can be: ENABLE or DISABLE.
  649. * Output         : None
  650. * Return         : None
  651. *******************************************************************************/
  652. void RCC_AHBPeriphClockCmd(u32 RCC_AHBPeriph, FunctionalState NewState)
  653. {
  654.   /* Check the parameters */
  655.   assert_param(IS_RCC_AHB_PERIPH(RCC_AHBPeriph));
  656.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  657.   if (NewState != DISABLE)
  658.   {
  659.     RCC->AHBENR |= RCC_AHBPeriph;
  660.   }
  661.   else
  662.   {
  663.     RCC->AHBENR &= ~RCC_AHBPeriph;
  664.   }
  665. }
  666. /*******************************************************************************
  667. * Function Name  : RCC_APB2PeriphClockCmd
  668. * Description    : Enables or disables the High Speed APB (APB2) peripheral clock.
  669. * Input          : - RCC_APB2Periph: specifies the APB2 peripheral to gates its
  670. *                    clock.
  671. *                    This parameter can be any combination of the following values:
  672. *                       - RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
  673. *                         RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,
  674. *                         RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
  675. *                         RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
  676. *                         RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
  677. *                         RCC_APB2Periph_ALL
  678. *                  - NewState: new state of the specified peripheral clock.
  679. *                    This parameter can be: ENABLE or DISABLE.
  680. * Output         : None
  681. * Return         : None
  682. *******************************************************************************/
  683. void RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph, FunctionalState NewState)
  684. {
  685.   /* Check the parameters */
  686.   assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
  687.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  688.   if (NewState != DISABLE)
  689.   {
  690.     RCC->APB2ENR |= RCC_APB2Periph;
  691.   }
  692.   else
  693.   {
  694.     RCC->APB2ENR &= ~RCC_APB2Periph;
  695.   }
  696. }
  697. /*******************************************************************************
  698. * Function Name  : RCC_APB1PeriphClockCmd
  699. * Description    : Enables or disables the Low Speed APB (APB1) peripheral clock.
  700. * Input          : - RCC_APB1Periph: specifies the APB1 peripheral to gates its
  701. *                    clock.
  702. *                    This parameter can be any combination of the following values:
  703. *                       - RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4,
  704. *                         RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7,
  705. *                         RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3,
  706. *                         RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, 
  707. *                         RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2,
  708. *                         RCC_APB1Periph_USB, RCC_APB1Periph_CAN, RCC_APB1Periph_BKP,
  709. *                         RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_ALL
  710. *                  - NewState: new state of the specified peripheral clock.
  711. *                    This parameter can be: ENABLE or DISABLE.
  712. * Output         : None
  713. * Return         : None
  714. *******************************************************************************/
  715. void RCC_APB1PeriphClockCmd(u32 RCC_APB1Periph, FunctionalState NewState)
  716. {
  717.   /* Check the parameters */
  718.   assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));
  719.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  720.   if (NewState != DISABLE)
  721.   {
  722.     RCC->APB1ENR |= RCC_APB1Periph;
  723.   }
  724.   else
  725.   {
  726.     RCC->APB1ENR &= ~RCC_APB1Periph;
  727.   }
  728. }
  729. /*******************************************************************************
  730. * Function Name  : RCC_APB2PeriphResetCmd
  731. * Description    : Forces or releases High Speed APB (APB2) peripheral reset.
  732. * Input          : - RCC_APB2Periph: specifies the APB2 peripheral to reset.
  733. *                    This parameter can be any combination of the following values:
  734. *                       - RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
  735. *                         RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,
  736. *                         RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
  737. *                         RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
  738. *                         RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
  739. *                         RCC_APB2Periph_ALL
  740. *                  - NewState: new state of the specified peripheral reset.
  741. *                    This parameter can be: ENABLE or DISABLE.
  742. * Output         : None
  743. * Return         : None
  744. *******************************************************************************/
  745. void RCC_APB2PeriphResetCmd(u32 RCC_APB2Periph, FunctionalState NewState)
  746. {
  747.   /* Check the parameters */
  748.   assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
  749.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  750.   if (NewState != DISABLE)
  751.   {
  752.     RCC->APB2RSTR |= RCC_APB2Periph;
  753.   }
  754.   else
  755.   {
  756.     RCC->APB2RSTR &= ~RCC_APB2Periph;
  757.   }
  758. }
  759. /*******************************************************************************
  760. * Function Name  : RCC_APB1PeriphResetCmd
  761. * Description    : Forces or releases Low Speed APB (APB1) peripheral reset.
  762. * Input          : - RCC_APB1Periph: specifies the APB1 peripheral to reset.
  763. *                    This parameter can be any combination of the following values:
  764. *                       - RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4,
  765. *                         RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7,
  766. *                         RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3,
  767. *                         RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, 
  768. *                         RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2,
  769. *                         RCC_APB1Periph_USB, RCC_APB1Periph_CAN, RCC_APB1Periph_BKP,
  770. *                         RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_ALL
  771. *                  - NewState: new state of the specified peripheral clock.
  772. *                    This parameter can be: ENABLE or DISABLE.
  773. * Output         : None
  774. * Return         : None
  775. *******************************************************************************/
  776. void RCC_APB1PeriphResetCmd(u32 RCC_APB1Periph, FunctionalState NewState)
  777. {
  778.   /* Check the parameters */
  779.   assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));
  780.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  781.   if (NewState != DISABLE)
  782.   {
  783.     RCC->APB1RSTR |= RCC_APB1Periph;
  784.   }
  785.   else
  786.   {
  787.     RCC->APB1RSTR &= ~RCC_APB1Periph;
  788.   }
  789. }
  790. /*******************************************************************************
  791. * Function Name  : RCC_BackupResetCmd
  792. * Description    : Forces or releases the Backup domain reset.
  793. * Input          : - NewState: new state of the Backup domain reset.
  794. *                    This parameter can be: ENABLE or DISABLE.
  795. * Output         : None
  796. * Return         : None
  797. *******************************************************************************/
  798. void RCC_BackupResetCmd(FunctionalState NewState)
  799. {
  800.   /* Check the parameters */
  801.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  802.   *(vu32 *) BDCR_BDRST_BB = (u32)NewState;
  803. }
  804. /*******************************************************************************
  805. * Function Name  : RCC_ClockSecuritySystemCmd
  806. * Description    : Enables or disables the Clock Security System.
  807. * Input          : - NewState: new state of the Clock Security System..
  808. *                    This parameter can be: ENABLE or DISABLE.
  809. * Output         : None
  810. * Return         : None
  811. *******************************************************************************/
  812. void RCC_ClockSecuritySystemCmd(FunctionalState NewState)
  813. {
  814.   /* Check the parameters */
  815.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  816.   *(vu32 *) CR_CSSON_BB = (u32)NewState;
  817. }
  818. /*******************************************************************************
  819. * Function Name  : RCC_MCOConfig
  820. * Description    : Selects the clock source to output on MCO pin.
  821. * Input          : - RCC_MCO: specifies the clock source to output.
  822. *                    This parameter can be one of the following values:
  823. *                       - RCC_MCO_NoClock: No clock selected
  824. *                       - RCC_MCO_SYSCLK: System clock selected
  825. *                       - RCC_MCO_HSI: HSI oscillator clock selected
  826. *                       - RCC_MCO_HSE: HSE oscillator clock selected
  827. *                       - RCC_MCO_PLLCLK_Div2: PLL clock divided by 2 selected
  828. * Output         : None
  829. * Return         : None
  830. *******************************************************************************/
  831. void RCC_MCOConfig(u8 RCC_MCO)
  832. {
  833.   /* Check the parameters */
  834.   assert_param(IS_RCC_MCO(RCC_MCO));
  835.   /* Perform Byte access to MCO[2:0] bits to select the MCO source */
  836.   *(vu8 *) CFGR_BYTE4_ADDRESS = RCC_MCO;
  837. }
  838. /*******************************************************************************
  839. * Function Name  : RCC_GetFlagStatus
  840. * Description    : Checks whether the specified RCC flag is set or not.
  841. * Input          : - RCC_FLAG: specifies the flag to check.
  842. *                    This parameter can be one of the following values:
  843. *                       - RCC_FLAG_HSIRDY: HSI oscillator clock ready
  844. *                       - RCC_FLAG_HSERDY: HSE oscillator clock ready
  845. *                       - RCC_FLAG_PLLRDY: PLL clock ready
  846. *                       - RCC_FLAG_LSERDY: LSE oscillator clock ready
  847. *                       - RCC_FLAG_LSIRDY: LSI oscillator clock ready
  848. *                       - RCC_FLAG_PINRST: Pin reset
  849. *                       - RCC_FLAG_PORRST: POR/PDR reset
  850. *                       - RCC_FLAG_SFTRST: Software reset
  851. *                       - RCC_FLAG_IWDGRST: Independent Watchdog reset
  852. *                       - RCC_FLAG_WWDGRST: Window Watchdog reset
  853. *                       - RCC_FLAG_LPWRRST: Low Power reset
  854. * Output         : None
  855. * Return         : The new state of RCC_FLAG (SET or RESET).
  856. *******************************************************************************/
  857. FlagStatus RCC_GetFlagStatus(u8 RCC_FLAG)
  858. {
  859.   u32 tmp = 0;
  860.   u32 statusreg = 0;
  861.   FlagStatus bitstatus = RESET;
  862.   /* Check the parameters */
  863.   assert_param(IS_RCC_FLAG(RCC_FLAG));
  864.   /* Get the RCC register index */
  865.   tmp = RCC_FLAG >> 5;
  866.   if (tmp == 1)               /* The flag to check is in CR register */
  867.   {
  868.     statusreg = RCC->CR;
  869.   }
  870.   else if (tmp == 2)          /* The flag to check is in BDCR register */
  871.   {
  872.     statusreg = RCC->BDCR;
  873.   }
  874.   else                       /* The flag to check is in CSR register */
  875.   {
  876.     statusreg = RCC->CSR;
  877.   }
  878.   /* Get the flag position */
  879.   tmp = RCC_FLAG & FLAG_Mask;
  880.   if ((statusreg & ((u32)1 << tmp)) != (u32)RESET)
  881.   {
  882.     bitstatus = SET;
  883.   }
  884.   else
  885.   {
  886.     bitstatus = RESET;
  887.   }
  888.   /* Return the flag status */
  889.   return bitstatus;
  890. }
  891. /*******************************************************************************
  892. * Function Name  : RCC_ClearFlag
  893. * Description    : Clears the RCC reset flags.
  894. *                  The reset flags are: RCC_FLAG_PINRST, RCC_FLAG_PORRST,
  895. *                  RCC_FLAG_SFTRST, RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST,
  896. *                  RCC_FLAG_LPWRRST
  897. * Input          : None
  898. * Output         : None
  899. * Return         : None
  900. *******************************************************************************/
  901. void RCC_ClearFlag(void)
  902. {
  903.   /* Set RMVF bit to clear the reset flags */
  904.   RCC->CSR |= CSR_RMVF_Set;
  905. }
  906. /*******************************************************************************
  907. * Function Name  : RCC_GetITStatus
  908. * Description    : Checks whether the specified RCC interrupt has occurred or not.
  909. * Input          : - RCC_IT: specifies the RCC interrupt source to check.
  910. *                    This parameter can be one of the following values:
  911. *                       - RCC_IT_LSIRDY: LSI ready interrupt
  912. *                       - RCC_IT_LSERDY: LSE ready interrupt
  913. *                       - RCC_IT_HSIRDY: HSI ready interrupt
  914. *                       - RCC_IT_HSERDY: HSE ready interrupt
  915. *                       - RCC_IT_PLLRDY: PLL ready interrupt
  916. *                       - RCC_IT_CSS: Clock Security System interrupt
  917. * Output         : None
  918. * Return         : The new state of RCC_IT (SET or RESET).
  919. *******************************************************************************/
  920. ITStatus RCC_GetITStatus(u8 RCC_IT)
  921. {
  922.   ITStatus bitstatus = RESET;
  923.   /* Check the parameters */
  924.   assert_param(IS_RCC_GET_IT(RCC_IT));
  925.   /* Check the status of the specified RCC interrupt */
  926.   if ((RCC->CIR & RCC_IT) != (u32)RESET)
  927.   {
  928.     bitstatus = SET;
  929.   }
  930.   else
  931.   {
  932.     bitstatus = RESET;
  933.   }
  934.   /* Return the RCC_IT status */
  935.   return  bitstatus;
  936. }
  937. /*******************************************************************************
  938. * Function Name  : RCC_ClearITPendingBit
  939. * Description    : Clears the RCC抯 interrupt pending bits.
  940. * Input          : - RCC_IT: specifies the interrupt pending bit to clear.
  941. *                    This parameter can be any combination of the following values:
  942. *                       - RCC_IT_LSIRDY: LSI ready interrupt
  943. *                       - RCC_IT_LSERDY: LSE ready interrupt
  944. *                       - RCC_IT_HSIRDY: HSI ready interrupt
  945. *                       - RCC_IT_HSERDY: HSE ready interrupt
  946. *                       - RCC_IT_PLLRDY: PLL ready interrupt
  947. *                       - RCC_IT_CSS: Clock Security System interrupt
  948. * Output         : None
  949. * Return         : None
  950. *******************************************************************************/
  951. void RCC_ClearITPendingBit(u8 RCC_IT)
  952. {
  953.   /* Check the parameters */
  954.   assert_param(IS_RCC_CLEAR_IT(RCC_IT));
  955.   /* Perform Byte access to RCC_CIR[23:16] bits to clear the selected interrupt
  956.      pending bits */
  957.   *(vu8 *) CIR_BYTE3_ADDRESS = RCC_IT;
  958. }
  959. /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/