【STM32单片机工作笔记】--01.时钟

本文详细介绍了STM32的时钟系统,包括时钟树、三种时钟来源、系统时钟选择、RCC寄存器等内容。还阐述了stm32f10x_rcc.c文件里的函数功能及参数。最后给出了启用外部时钟的一般步骤,包含RCC时钟配置重置、等待时钟就绪等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 时钟树:

 2. 三种时钟来源

    ● HSI振荡器时钟

    ● HSE振荡器时钟

    ● PLL时钟

2.1.二级时钟源

    ● 40kHz低速内部RC(LSI RC)振荡器,可以用于驱动独立看门狗或通过程序选择驱动RTC

    ● 选择32.768kHz低速外部晶体(LSE晶体)用来驱动RTC(RTCCLK)

2.2.HSE 时钟

    以下两种时钟源产生:

    ● HSE外部晶体/陶瓷谐振器
    ● HSE用户外部时钟

2.3.HSI 时钟

    由内部8MHz的RC振荡器产生,可直接作为系统时钟或在2分频后作为PLL输入。

2.4.PLL 时钟

    产生倍频的输出,主PLL以下述时钟源之一为输入:

    ● HSI时钟除以2
    ● HSE或通过一个可配置分频器的PLL2时钟

2.5.LSE 时钟

    是一个32.768kHz的低速外部晶体或陶瓷谐振器,为实时时钟或者其他定时功能提供一个低功耗且精确的时钟源

2.6.LSI 时钟

    担当一个低功耗时钟源的角色,它可以在停机和待机模式下保持运行,为独立看门狗和自动唤醒单元提供时钟。大约40kHz(在30kHz和60kHz之间)

2.7.时钟安全系统(CSS)

    CSS 被激活,并且 HSE 时钟出现故障, CSS 中断就产生,并且 NMI 也自动产生。在 NMI 的处理程序中必须通过设置时钟中断寄存器(RCC_CIR) 里的 CSSC 位来清除 CSS 中断。

    如果HSE振荡器被直接或间接地作为系统时钟,时钟故障将导致系统时钟自动切换到HSI振荡器。

3.系统时钟(SYSCLK) 选择

    系统复位后,HSI振荡器被选为系统时钟。目标时钟源就绪了,从一个时钟源到另一个时钟源的切换才会发生。在时钟控制寄存器(RCC_CR)里的状态位指示哪个时钟已经准备好了,哪个时钟目前被用作系统时钟。

3.1.RTC 时钟

    通过设置 里的RTCSEL[1:0]位,RTCCLK时钟源可以由HSE/128、LSE或LSI时钟提供。

3.2.看门狗时钟

   如果独立看门狗已经由硬件选项或软件启动,LSI振荡器将被强制在打开状态,并且不能被关
闭。在LSI振荡器稳定后,时钟供应给IWDG。

3.3.时钟输出

    允许输出时钟信号到外部MCO引脚,GPIO端口寄存器必须被配置为相应功能。小于50MHz(这是I/O端口的最大速度),时钟的选择寄存器(RCC_CFGR)中的MCO[3:0]位控制 。可被选作MCO的时钟:

    ● SYSCLK
    ● HSI
    ● HSE
    ● 除2的PLL时钟
    ● PLL2时钟
    ● PLL3时钟除以2
    ● XT1外部3~25MHz振荡器(用于以太网)
    ● PLL3时钟(用于以太网)

4.RCC 寄存器

4.1.时钟控制寄存器(RCC_CR)

    

    4.2.时钟配置寄存器(RCC_CFGR)

        

5.stm32f10x_rcc.c文件里的函数

5.1    void RCC_DeInit(void)

    功能:将RCC时钟配置重置为默认重置状态

5.2    void RCC_HSEConfig(uint32_t RCC_HSE)

    功能:配置外部高速振荡器(HSE)(被直接或间接用到的时候不能停止)

    参数:改变HSE新状态

              RCC_HSE_OFF: 外部高速振荡器HSE关闭

              RCC_HSE_ON: 外部高速振荡器HSE打开

              RCC_HSE_Bypass: 外部时钟绕过HSE振荡器

5.3    ErrorStatus RCC_WaitForHSEStartUp(void)

    功能:等待HSE启动

    返回值:错误状态枚举值

                  SUCCESS:  振荡器HSE稳定,随时可用        

                  ERROR:  振荡器HSE尚未就绪

5.4    void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue)

    功能:调整内部高速振荡器(HSI)校准值

    参数:指定校准微调值

               0-0x1F

5.5    void RCC_HSICmd(FunctionalState NewState)

    功能:启用或禁用内部高速振荡器(HSI)

    参数:NewState

             ENABLE

             DISABLE

5.6    void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul)

    功能:配置锁相环源与倍频因子(在PLL失效时配置)

    参数1:RCC_PLLSource

             RCC_PLLSource_HSI_Div2:选择HSI/2作为PLL时钟源

             RCC_PLLSource_HSE_Div1:选择HSE作为PLL时钟源

             RCC_PLLSource_HSE_Div2:选择HSE/2时钟作为PLL时钟源

    参数2:RCC_PLLMul

             此参数可以是rcc_pllmul_x,其中x:[2,16]

5.7    void RCC_PLLCmd(FunctionalState NewState)

    功能:启用或禁用PLL 

    参数:NewState:

             ENABLE

             DISABLE

5.8    void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource)    

    功能:配置系统时钟(sysclk)

    参数:RCC_SYSCLKSource:

             RCC_SYSCLKSource_HSI

             RCC_SYSCLKSource_HSE

             RCC_SYSCLKSource_PLLCLK

5.9    uint8_t RCC_GetSYSCLKSource(void)

    功能:返回用作系统时钟的时钟源

    返回值:

                0x00: 系统时钟为 HSI

                0x04:系统时钟为 HSE

                0x08:系统时钟为 PLL

5.10    void RCC_HCLKConfig(uint32_t RCC_SYSCLK)

     功能:设置AHB时钟(HCLK)

     参数:RCC_SYSCLK

              RCC_SYSCLK_Div1:  AHB = SYSCLK
              RCC_SYSCLK_Div2: AHB = SYSCLK/2
              RCC_SYSCLK_Div4: AHB = SYSCLK/4
              RCC_SYSCLK_Div8: AHB = SYSCLK/8
              RCC_SYSCLK_Div16: AHB = SYSCLK/16
              RCC_SYSCLK_Div64: AHB = SYSCLK/64
              RCC_SYSCLK_Div128: AHB = SYSCLK/128
              RCC_SYSCLK_Div256: AHB = SYSCLK/256
              RCC_SYSCLK_Div512: AHB = SYSCLK/512

5.11    void RCC_PCLK1Config(uint32_t RCC_HCLK)

    功能:配置低速ABP时钟(PCLK1)

    参数:RCC_HCLK

             RCC_HCLK_Div1:   APB1 = HCLK
             RCC_HCLK_Div2:   APB1 = HCLK/2
             RCC_HCLK_Div4:   APB1 = HCLK/4
             RCC_HCLK_Div8:   APB1 = HCLK/8
             RCC_HCLK_Div16: APB1 = HCLK/16

5.12    void RCC_PCLK2Config(uint32_t RCC_HCLK)    

     功能: 配置高速ABP时钟(PCLK2)

    参数:RCC_HCLK

             RCC_HCLK_Div1:   APB2 = HCLK
             RCC_HCLK_Div2:   APB2 = HCLK/2
             RCC_HCLK_Div4:   APB2 = HCLK/4
             RCC_HCLK_Div8:   APB2 = HCLK/8
             RCC_HCLK_Div16: APB2 = HCLK/16             

5.13    void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState)

    功能: 启用或禁用指定的RCC中断

    参数1:RCC_IT

              RCC_IT_LSIRDY:   LSI 就绪中断
              RCC_IT_LSERDY: LSE 就绪中断 
              RCC_IT_HSIRDY:  HSI 就绪中断
              RCC_IT_HSERDY: HSE 就绪中断
              RCC_IT_PLLRDY:  PLL 就绪中断

    参数1:NewState

              ENABLE

              DISABLE

5.14    void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource)

    功能:配置USB时钟(USBCLK)  

    参数:RCC_USBCLKSource

             RCC_USBCLKSource_PLLCLK_1Div5: USB = PLL/5

             RCC_USBCLKSource_PLLCLK_Div1:   USB = PLL

5.15    void RCC_ADCCLKConfig(uint32_t RCC_PCLK2)

    功能:配置ADC时钟(ADCCLK)

    参数:RCC_PCLK2

             RCC_PCLK2_Div2: ADC = PCLK2/2
             RCC_PCLK2_Div4: ADC = PCLK2/4
             RCC_PCLK2_Div6: ADC = PCLK2/6
             RCC_PCLK2_Div8: ADC = PCLK2/8

5.16    void RCC_LSEConfig(uint8_t RCC_LSE)

    功能:配置外部低速时钟(LSE)

    参数:RCC_LSE

              arg RCC_LSE_OFF:  关闭外部低速时钟 LSE
              RCC_LSE_ON:          关闭外部低速时钟 LSE
              RCC_LSE_Bypass:    绕过外部低速时钟 LSE


5.17    void RCC_LSICmd(FunctionalState NewState)

    功能:使能或禁止外部低速时钟(LSE)(IDDG运行则不能关闭 LSE)

    参数:NewState

             ENABLE

             DISABLE


5.18    void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource)

    功能:配置 RTC 时钟(RTCCLK)(被选择后不能改变,除非后备重置)

    参数:RCC_RTCCLKSource

             RCC_RTCCLKSource_LSE:                LSE 作为 RTC 时钟
             RCC_RTCCLKSource_LSI:                 LSI 作为 RTC 时钟
             RCC_RTCCLKSource_HSE_Div128:  HSE/128 作为 RTC 时钟


5.19    void RCC_RTCCLKCmd(FunctionalState NewState)

    功能:使能或禁止 RTC 时钟

    参数:NewState

             ENABLE

             DISABLE


5.20    void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)

    功能: 返回不同片上时钟的频率

    参数: RCC_Clocks

             指向将保存时钟频率的 RCC 时钟结构的指针


5.21    void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState)

    功能:使能或禁止 AHB 时钟

    参数1:RCC_AHBPeriph

              RCC_AHBPeriph_DMA1
              RCC_AHBPeriph_DMA2
              RCC_AHBPeriph_SRAM
              RCC_AHBPeriph_FLITF
              RCC_AHBPeriph_CRC
              RCC_AHBPeriph_FSMC
              RCC_AHBPeriph_SDIO

    参数2:NewState

              ENABLE

              DISABLE


5.22    void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

    功能:使能或禁止 APB2 高速外设时钟

    参数1:RCC_APB2Periph

              RCC_APB2Periph_AFIO,   RCC_APB2Periph_GPIOA,   RCC_APB2Periph_GPIOB,
              RCC_APB2Periph_GPIOC,   RCC_APB2Periph_GPIOD,   RCC_APB2Periph_GPIOE,
              RCC_APB2Periph_GPIOF,   RCC_APB2Periph_GPIOG,  RCC_APB2Periph_ADC1,
              RCC_APB2Periph_ADC2,   RCC_APB2Periph_TIM1,   RCC_APB2Periph_SPI1,
              RCC_APB2Periph_TIM8,   RCC_APB2Periph_USART1,   RCC_APB2Periph_ADC3,
              RCC_APB2Periph_TIM15,   RCC_APB2Periph_TIM16,   RCC_APB2Periph_TIM17,
              RCC_APB2Periph_TIM9,   RCC_APB2Periph_TIM10,   RCC_APB2Periph_TIM11  

    参数2:NewState

              ENABLE

              DISABLE


5.23    void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)

    功能:使能或禁止 APB1 低速外设时钟

    参数1:RCC_APB1Periph

              RCC_APB1Periph_TIM2,   RCC_APB1Periph_TIM3,   RCC_APB1Periph_TIM4,
              RCC_APB1Periph_TIM5,   RCC_APB1Periph_TIM6,   RCC_APB1Periph_TIM7,
              RCC_APB1Periph_WWDG,   RCC_APB1Periph_SPI2,   RCC_APB1Periph_SPI3,
              RCC_APB1Periph_USART2,   RCC_APB1Periph_USART3,   RCC_APB1Periph_USART4, 
              RCC_APB1Periph_USART5,   RCC_APB1Periph_I2C1,   RCC_APB1Periph_I2C2,
              RCC_APB1Periph_USB,   RCC_APB1Periph_CAN1,   RCC_APB1Periph_BKP,
              RCC_APB1Periph_PWR,   RCC_APB1Periph_DAC,   RCC_APB1Periph_CEC,
              RCC_APB1Periph_TIM12,   RCC_APB1Periph_TIM13,   RCC_APB1Periph_TIM14

    参数2:NewState

              ENABLE

              DISABLE

 

5.24    void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

    功能:强制或释放高速 APB2 外围设备重置

    参数1:RCC_APB2Periph

              RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
              RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,
              RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
              RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
              RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
              RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,
              RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11

    参数2:NewState

              ENABLE

              DISABLE

 

5.25    void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)

    功能:强制或释放高速 APB1 外围设备重置

    参数1:RCC_APB1Periph

             RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4,
              RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7,
              RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3,
              RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, 
              RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2,
              RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP,
              RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC,
              RCC_APB1Periph_TIM12, RCC_APB1Periph_TIM13, RCC_APB1Periph_TIM14

    参数2:NewState

              ENABLE

              DISABLE

      
5.26    void RCC_BackupResetCmd(FunctionalState NewState)

    功能:强制或释放备份域重置

    参数:NewState

              ENABLE

              DISABLE


5.27    void RCC_ClockSecuritySystemCmd(FunctionalState NewState)

    功能:启用或禁用时钟安全系统

    参数:NewState

              ENABLE

              DISABLE


5.28    void RCC_MCOConfig(uint8_t RCC_MCO)

    功能:选择要在 MCO 引脚上输出的时钟源

    参数:RCC_MCO

             RCC_MCO_NoClock:           无输出
             RCC_MCO_SYSCLK:           系统时钟输出
             RCC_MCO_HSI:                   HSI 时钟输出
             RCC_MCO_HSE:                  HSE 时钟输出
             RCC_MCO_PLLCLK_Div2:   PLL/2 输出


5.29    FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG)

    功能:检查是否设置了指定的RCC标志

    参数:RCC_FLAG

             RCC_FLAG_HSIRDY:        HSI 时钟准备
             RCC_FLAG_HSERDY:       HSE 时钟准备
             RCC_FLAG_PLLRDY:        PLL 时钟准备
             RCC_FLAG_LSERDY:        LSE 时钟准备
             RCC_FLAG_LSIRDY:          LSI 时钟准备
             RCC_FLAG_PINRST:          引脚复位
             RCC_FLAG_PORRST:        POR/PDR 复位
             RCC_FLAG_SFTRST:         软件复位
             RCC_FLAG_IWDGRST:      独立看门狗复位
             RCC_FLAG_WWDGRST:    窗口看门狗复位
             RCC_FLAG_LPWRRST:      低电压复位

    返回值:

             SET

             RESET


5.30    void RCC_ClearFlag(void)

    功能:清 RCC 复位标志位

             RCC_FLAG_PINRST, RCC_FLAG_PORRST, RCC_FLAG_SFTRST,
             RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST, RCC_FLAG_LPWRRST

 


5.31    ITStatus RCC_GetITStatus(uint8_t RCC_IT)

    功能:检查是否发生了指定的RCC中断

    参数:RCC_IT

              RCC_IT_LSIRDY:     LSI 就绪中断
              RCC_IT_LSERDY:    LSE 就绪中断
              RCC_IT_HSIRDY:     HSI 就绪中断
              RCC_IT_HSERDY:    HSE 就绪中断
              RCC_IT_PLLRDY:     PLL 就绪中断
              RCC_IT_CSS:            检查系统安全中断


5.32    void RCC_ClearITPendingBit(uint8_t RCC_IT)

    功能:清除 RCC 的中断挂起标志位

    参数:RCC_IT

             RCC_IT_LSIRDY:    LSI 就绪中断
             RCC_IT_LSERDY:   LSE 就绪中断
             RCC_IT_HSIRDY:    HSI 就绪中断
             RCC_IT_HSERDY:   HSE 就绪中断
             RCC_IT_PLLRDY:    PLL 就绪中断

6.启用外部时钟的一般步骤

INT8U RCC_Configuration(void)
{

    ErrorStatus HSEStartUpStatus;
    INT8U Count, Result = 0;

    RCC_DeInit();                                     // 1、将RCC时钟配置重置为默认重置状态
    RCC_HSEConfig(RCC_HSE_ON);    // 2、Enable HSE
    HSEStartUpStatus = RCC_WaitForHSEStartUp();  //  3、等待HSE就绪

    if(HSEStartUpStatus == SUCCESS)
    {
        
// 基础应用1,FLASH时序延迟几个周期,等待总线同步操作。
        // 推荐按照单片机系统运行频率:0―24MHz时,取Latency=0;
        // 24―48MHz时,取Latency=1;48~72MHz时,取Latency=2。
        // 位置:RCC初始化子函数里面,时钟起振之后。 
        FLASH_SetLatency(FLASH_Latency_1);     

     
        
// 基础应用2,开启FLASH预读缓冲功能,加速FLASH的读取。
        // 位置:RCC初始化子函数里面,时钟起振之后。 */
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  

        // 4、AHB时钟:HCLK = SYSCLK / 1 
        RCC_HCLKConfig(RCC_SYSCLK_Div1);    


        // 5、高速AHB时钟:PCLK2 = HCLK / 8
        RCC_PCLK2Config(RCC_HCLK_Div8);         

        // 6、低速AHB时钟:PCLK1 = HCLK / 8
        RCC_PCLK1Config(RCC_HCLK_Div8);   

        // 7、设置PLL PLLCLK = 7.3728 MHz * 4 =  29.4912 MHz 
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);

        // 8、Enable PLL 
        RCC_PLLCmd(ENABLE);

        // 9、等待PLL 就绪
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

        // 10、选择PLL作系统时钟源 
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

       //         或选择外部时钟作系统时钟源    
       // RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);  

       // 11、等待 PLL 作系统时钟源
        while(RCC_GetSYSCLKSource() != 0x08);
    }
    else
    {
        Result = 1;
    }

    // 12、打开要使用的外设时钟 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 
                                                   | RCC_APB2Periph_GPIOA , ENABLE);

 

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3
                                                   | RCC_APB1Periph_CAN1 , ENABLE);

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);    
    RCC_ADCCLKConfig(RCC_PCLK2_Div8);

    //SysTick_Config(f(SYSCLK) / 1000) (ms)
    Count = 5;
    do{
        if(0 == SysTick_Config(29491))    // 1ms
        {
            break;
        }
    } while(Count--);

    if(0 == Count)
    {
        Result |= 2;
    }

    return Result;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值