该文档主要是对STM32F4各个模块的库进行翻译和说明。文档中加入了作者的一些理解,建议和小贴士。并且在文档最后,加入了一些使用该库模块的案例。希望大家通过对该文档的阅读,可以更好的使用STM32的库函数进行学习和项目开发。之所以选用1.4.0版本进行翻译和说明,因为该版本群众基础较好,有大量的使用者和相关资料。后续也会推出新版本库和CubeMX库的翻译和说明,希望大家喜欢和支持。如果大家觉得文档有什么问题,麻烦请提出,如果确认问题存在,作者会及时修改。
文档约定:
Ø 小贴士:蓝色字体
Ø 宏定义:土红色字体
本库模块相关术语说明:
RCC:stm32的时钟控制器
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配置函数
这个部分提供的函数允许去配置内部和外部时钟,PLL,CSS和MCO管脚,以下进行说明
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函数使用。
函数参数说明:无
函数返回值说明:
SUCCESS:HSE启动成功,状态稳定。
ERROR:HSE启动失败。
4. void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue)
函数解释:调整内部高速时钟的校准值。
注意:该校准值主要用于补偿不同的电压和温度对内部HSIRC频率的影响。
函数参数说明:HSICalibrationValue:需要调整的校准值
函数返回值说明:无
5. void RCC_HSICmd(FunctionalState NewState)
函数解释:使能或者禁止内部高速时钟HSI。
注意1:当进入停止(STOP)或者待机(STANDBY)模式,HSI会停止。在从复位启动,从STOP和STANDBY模块唤醒或者使用HSE直接或者间接作为系统时钟失败后(如果使能安全系统时钟),使用HSI时钟(由硬件使能)。
注意2:当HSI作为系统时钟源,HSI是不能被停止的。因此,你必须选择另外一个时钟源,然后停止HSI。
注意3:使能HSI以后,软件必须等待HSIRDY标志位置位,以确保HSI时钟稳定,并且可以作为系统时钟源使用。
函数参数说明:NewState:HSI新的状态,这个参数有以下两个宏定义
ENABLE:使能HSI
DISABLE:禁止使用HSI
注意:当HSI停止,在6个HSI振荡器周期后,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)