6回答

1收藏

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

#其他 #其他 3282 人阅读 | 6 人回复 | 2020-04-30

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-***的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文档观看该函数详细解释
游客,如果您要查看本帖隐藏内容请回复


分享到:
回复

使用道具 举报

回答|共 6 个

倒序浏览

5#

boyjia-302358

发表于 2021-6-21 13:21:02 | 只看该作者

学习一下  谢谢啦
回复 支持 反对

使用道具 举报

6#

守候^_^

发表于 2022-4-13 22:20:14 | 只看该作者

学习一下看看
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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