查看: 1962|回复: 6

[经验] STM32库函数说明及示例(版本V1.4.0) ----第二篇:RCC库(上...

[复制链接]
  • TA的每日心情
    开心
    2019-11-4 13:48
  • 签到天数: 14 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2020-4-30 09:30:47 | 显示全部楼层 |阅读模式
    分享到:
    STM32库函数说明及示例(版本V1.4.0
    ----第二篇:RCC库(上)

    文档说明和约定:
    该文档主要是对STM32F4各个模块的库进行翻译和说明。文档中加入了作者的一些理解,建议和小贴士。并且在文档最后,加入了一些使用该库模块的案例。希望大家通过对该文档的阅读,可以更好的使用STM32的库函数进行学习和项目开发。之所以选用1.4.0版本进行翻译和说明,因为该版本群众基础较好,有大量的使用者和相关资料。后续也会推出新版本库和CubeMX库的翻译和说明,希望大家喜欢和支持。如果大家觉得文档有什么问题,麻烦请提出,如果确认问题存在,作者会及时修改。
    文档约定:
    Ø  小贴士:蓝色字体
    Ø  宏定义:土红色字体
    本库模块相关术语说明:
    RCCstm32的时钟控制器
    HSE:外部高速时钟
    HSI:内部高速时钟
    LSE:外部低速时钟
    LSI:内部低速时钟
    PLL:锁相环,主要用作倍频
    CSS:系统安全时钟
    MCO1:微控制器时钟输出1
    MCO2:微控制器时钟输出2

    注意:RCC库因为内容太多,因此分为上中下三篇

    1      RCC库说明
    库文件名:stm32f4xx_rcc.c
    库函数注释部分翻译:
    RCC的特性
    TIPS:建议大家在看RCC特性的时候 配合时钟树图进行理解,以下附上时钟树图,完整的时钟树图请参考STM32F4XX英文参考手册7.2章 212页
    (注意 帖子里面图片显示不出,大家可以下载附件中的PDF文档,里面有图片)

    以下为翻译库函数注释部分:
    (1)            复位以后,设备使用内部高速时钟(HSI)开始运行,以下单元包括Flash 0 wait state, Flash prefetch buffer, D-Cache被禁用,并且除了内部SRAM,FLSAH和JTAG的所有控制器均被禁用。
    l  这个时候,所有的低速和高速总线没有被分频,所有映射在这些总线上的控制器以HIS时钟速度运行。(即16MHZ)
    l  除了SRAM和FLASH,所有控制器的时钟选择被关闭
    l  除了用作下载和调试目的的JTAG接口外,所有的IO处于浮空状态,

    (2)            一旦设备从复位状态启动,用户需要做以下事情:
    l  配置系统时钟使用的时钟源(如果你的应用需要更高的频率或者性能)
    l  配置系统时钟频率和设置FLASH
    l  配置AHB和APB总线的分频
    l  为要使用的控制器使能时钟
    l  为不是从系统时钟产生时钟源的控制器配置时钟源(如I2S,RTC,USB OTG FS/SDIO/RNG)

    2      具体函数说明
    (1)   内部和外部时钟,PLL,CSS和MCO配置函数
    这个部分提供的函数允许去配置内部和外部时钟,PLLCSSMCO管脚,以下进行说明
    l  HSI(内部高速时钟),芯片自带的16MHZ高精度RC振荡器,该时钟可以直接或者通过PLL作为系统时钟源。
    l  LSI(内部低速时钟),芯片自带的32KHZ低功耗的RC振荡器,主要用于IWDG和RTC时钟源
    l  HSE(外部高速时钟),4---26MHZ的振荡器,可以直接作为系统时钟源,或者通过PLL用作系统时钟源。也可以作为RTC的时钟源。
    l  LSE(外部低速时钟),用作RTC时钟源的32K振荡器。
    l  PLL(由HSI或者HSE提供时钟),提供两种不同的输出时钟
    Ø  第一种时钟是用来产生高速系统时钟的(最高可达168MHZ(不超频))
    Ø  第二种是用于产生USB OTG FS(48MHZ),随机模拟发生器(小于等于48MHZ),SDIO(小于等于48MHZ)的时钟,
    Tips:PLL解释
    PLL(Phase Locked Loop): 为锁相回路或锁相环, 用来统一整合时脉讯号,使高频器件正常工作,如内存的存取资料等。PLL用于振荡器中的反馈技术。 许多电子设备要正常工作,通常需要外部的输入信号与内部的振荡信号同步。一般的晶振由于工艺与成本原因,做不到很高的频率,而在需要高频应用时,有相应的 器件VCO,实现转成高频,但并不稳定,故利用锁相环路就可以实现稳定且高频的时脉冲讯号。
    l  PLLI2S(由HSI或者HSE提供时钟),用于产生精准的时钟,该时钟用于基于I2S接口的高保真音频或者STM32F429x/439x设备的SAI接口。
    l  PLLSAI(由HSI或者HSE提供时钟),用于产生精准的时钟,该时钟用于SAI接口和STM32F429x/439x设备的LCD控制器接口。
    l  CSS(系统安全时钟),一旦使能,并且如果一个HSE时钟发生失败(把HSE直接用于产生系统时钟或者通过PLL产生系统时钟),系统时钟会自动切换到HIS并且会产生一个中断。这个中断连接与Cortex-M4的NMI(不可屏蔽中断)异常向量。
    l  MCO1(微控制器时钟输出),通过PA8管脚经过一个可配置的分频器输出HSI,LSE,HSE或者PLL时钟。
    l  MCO2(微控制器时钟输出),通过PC9管脚经过一个可配置的分频器输出HSE,PLL,系统时钟或者PLLI2S时钟。

    1.  void RCC_DeInit(void)
    函数解释RCC的反初始化函数,该函数的作用是把RCC相关的寄存器配置成上电复位后的默认状态,在第一次初始化RCC前可以调用该函数。复位后时钟的默认状态如下(所以大家要注意,如果不配置RCC的话,是有一个默认状态的):
    Ø  HIS打开并且作为系统时钟源
    Ø  HSE,PLL和PLLI2S关闭
    Ø  AHB,APB1和APB2的分频器设置为1
    Ø  CSS,MCO1和MCO2关闭
    Ø  所有的中断关闭
    注意,该函数不能修改如下配置:
    Ø  外设控制器的时钟
    Ø  LSI,LSE和RTC的时钟
    函数参数说明:

    2.  void RCC_HSEConfig(uint8_t RCC_HSE)
    函数解释HSE的配置函数。
    注意1:在使能HSE以后(RCC_HSE_ON 或者 RCC_HSE_Bypass),软件必须等待HSERDY标志置位,以确保HSE时钟稳定并且可以被用于PLL或者系统时钟。(这一点请大家尤其注意,尤其是没有硬件编程的同学,因为HSE时钟使能后,需要一定的时间才能稳定下来)。
    注意2:当HSE直接的或者通过PLL间接的用于系统时钟时,HSE是不能被改变的。因此,在你改变HSE之前,你必须选择使用另一个时钟源,然后改变HSE的状态(比如,禁止使用HSE)。
    注意3:当进入停止或者待机模式时,HSE停止。
    注意4:这个函数会复位CSSON位,因此如果之前使能了时钟安全系统(CSS),你就必须在调用这个函数后重新使能CSS
    函数参数说明:RCC_HSE:指定HSE的新状态,这个参数可以选择使用如下三个宏定义之一
    RCC_HSE_OFF:关闭HSE振荡器,在6个HSE振荡器时钟周期后,HSERDY标志位会变低。
    RCC_HSE_ON:打开HSE振荡器
    RCC_HSE_Bypass:使用外部时钟旁路HSE振荡器(就是直接使用外部时钟源作为HSE时钟)


    3.  ErrorStatus RCC_WaitForHSEStartUp(void)
    函数解释:等待HSE稳定。
    注意:该函数等待HSERDY标志位置位,当该标志位置位后会返回SUCCESS。如果时间超时并且标志位没有置位,则会返回ERROR。超时时间的值由一个定义在stm32f4xx.h头文件中的常量HSE_STARTUP_TIMEOUT来进行配置,你可以根据你系统中的HSE振荡器来调整这个值。该函数配合RCC_HSEConfig函数使用。
    函数参数说明:
    函数返回值说明:
    SUCCESSHSE启动成功,状态稳定。
    ERRORHSE启动失败。

    4.  void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue)
    函数解释:调整内部高速时钟的校准值。
    注意:该校准值主要用于补偿不同的电压和温度对内部HSIRC频率的影响。
    函数参数说明:HSICalibrationValue:需要调整的校准值
    函数返回值说明:无
    5.  void RCC_HSICmd(FunctionalState NewState)
    函数解释:使能或者禁止内部高速时钟HSI
    注意1:当进入停止(STOP)或者待机(STANDBY)模式,HSI会停止。在从复位启动,从STOPSTANDBY模块唤醒或者使用HSE直接或者间接作为系统时钟失败后(如果使能安全系统时钟),使用HSI时钟(由硬件使能)。
    注意2:当HSI作为系统时钟源,HSI是不能被停止的。因此,你必须选择另外一个时钟源,然后停止HSI
    注意3:使能HSI以后,软件必须等待HSIRDY标志位置位,以确保HSI时钟稳定,并且可以作为系统时钟源使用。
    函数参数说明:NewStateHSI新的状态,这个参数有以下两个宏定义
    ENABLE:使能HSI
    DISABLE:禁止使用HSI
    注意:当HSI停止,在6HSI振荡器周期后,HSIRDY变低。
    函数返回值说明:无
    6.  void RCC_LSEConfig(uint8_t RCC_LSE)
    函数解释:配置外部低速振荡器。
    注意1:由于LSE在备份区域,并且在复位以后的写访问依赖于这个区域,因此在配置LSE前,你必须使用函数PWR_BackupAccessCmd(ENABLE)(复位后即操作一次)来使能写访问。
    注意2:使能LSE后(RCC_LSE_ON或者RCC_LSE_Bypass,软件必须等待LSERDY标志位置位,来表明LSE时钟稳定并且可以用于RTC时钟。
    函数参数说明:RCC_LSE:指定LSE的新状态
    这个参数可以是以下三个值之一:
    RCC_LSE_OFF:关闭LSE振荡器,在6个振荡器周期后,LSERDY标志会变成0
    RCC_LSE_ON:打开LSE振荡器
    RCC_LSE_Bypass:使用外部时钟旁路LSE振荡器
    函数返回值说明:无
    7.  void RCC_LSICmd(FunctionalState NewState)
    函数解释:使能或者禁止内部低速时钟振荡器。注意1:使能LSI以后,软件必须等待LSIRDY标志位置位,确保LSI稳定,并且可以用于IWDG或者RTC时钟.注意2:如果IWDG(独立看门狗)运行,LSI是不能被禁用的。函数参数说明:NewState:LSI新的状态这个参数可以是ENABLE 或者 DISABLE 注意:LSI停止后,在6个LSI的振荡器周期后,LSIRDY标志位变成0函数返回值说明:无
    8.  void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM, uint32_tPLLN, uint32_t PLLP, uint32_t PLLQ)
    字数超限  请大家下载PDF文档观看该函数详细解释

    9.  void RCC_PLLI2SConfig(uint32_t PLLI2SN, uint32_t PLLI2SR)
    字数超限  请大家下载PDF文档观看该函数详细解释
    游客,如果您要查看本帖隐藏内容请回复


    回复

    使用道具 举报

  • TA的每日心情

    2021-6-21 14:45
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2021-6-21 13:21:02 | 显示全部楼层
    学习一下  谢谢啦
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2022-4-13 22:20:14 | 显示全部楼层
    学习一下看看
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-18 06:14 , Processed in 0.182700 second(s), 29 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.