
STM32F429第八篇之stm32f4xx_hal_rcc
发布日期:2021-05-14 11:31:18
浏览次数:15
分类:精选文章
本文共 3895 字,大约阅读时间需要 12 分钟。
STM32F429 HAL库中RCC用法详解
创新设计手册
目录
综述
特性
复位之后,芯片的时钟源为HSI。Flash预取缓存,D缓存,I缓存和所有外设全部禁用。此时,只有内部SRAM,FLASH和JTAG还在工作。
- 在高速总线和低速总线上都没有预分频,这些总线上映射的设备全都以HSI速度在运行。
- 所有外设的时钟都关闭,除了SRAM和FLASH。
- 所有GPIO为浮空输入状态,除了JTAG,其用于特定的debug功能。
一旦设备复位,用户软件必须做以下工作:
- 配置时钟源来驱动系统时钟(SYSCLK)。
- 配置系统时钟频率和Flash设定。
- 配置AHB和APB的预分频。
- 使能将要使用的GPIO。
- 配置不是SYSCLK驱动的外设时钟源。
为了管理外设读写寄存器,应该考虑到:外设有效使能相比于RCC外设时钟使能有一个延时:
- 延时取决于外设映射。
- 若外设映射在AHB总线上,延时为2个AHB时钟。
- 若外设映射在APB总线上,延时为2个APB时钟。
解决方案:对于AHB和APB外设中,虚拟读取外设已经插入到每一个 __HAL_RCC_PPP_CLK_ENABLE()
宏中。
初始化和反初始化函数
这个模块的函数实现以下功能:
- 配置内部/外部振荡器:HSE,HSI,LSE,LSI,PLL,CSS,MCO
- 系统总线时钟:SYSCLK,AHB,APB1,APB2
内部/外部时钟和PLL配置
- 高速内部时钟(HSI):16MHz,工厂校正RC振荡器,可以直接使用或者间接用作系统时钟(SYSCLK)源。
- 低速内部时钟(LSI):32kHz,低功耗RC振荡器,可以用于IWDG或者RTC时钟源。
- 高速外部时钟(HSE):4-26MHz晶振,可以直接使用或者间接作用系统时钟(SYSCLK)源。另外还可以作为RTC时钟源。
- 低速外部时钟(LSE):32kHz晶振,可以用作RTC时钟源。
系统,AHB,APB总线时钟配置
- 可以作为SYSCLK时钟源的有:HSI, HSE, PLL。
- AHB时钟(HCLK)从SYSCLK分频而来,可以用于驱动CPU,存储器和映射到AHB上的外设。
- APB1(PCLK1)和APB2(PCLK2)时钟从AHB时钟分频而来,且用于驱动映射到该总线的外设。
注意
更多关于时钟树等更多的信息,可以参考<博客>。
外设控制函数
这部分函数用于控制RCC时钟频率。此外,这部分包含以下API:
...
函数介绍
HAL_RCC_DeInit
函数原型:
void HAL_RCC_DeInit(void)
复位RCC时钟到默认状态。
注意:
默认状态如下所示:
- HSI打开且用作系统时钟源。
- HSE和PLL关闭
- CSS,MCO1和MCO2关闭
- 所有中断关闭。
这个函数并不修改以下配置:
- 外设时钟
- LSI,LSE,和RTC时钟
HAL_RCC_OscConfig
函数原型:
HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef * RCC_OscInitStruct)
通过RCC_OscInitStruct中的参数初始化RCC 晶振的特定参数。
注意:
- 当PLL用作系统时钟的时候,不可以被禁用。
- 该API不适用于将LSE Bypass转换成LSE On或者将LSE On 转化成LSE Bypass。
- 该API不适用于将HSE Bypass转换成HSE On或者将HSE On 转化成HSE Bypass。用户需要首先将转换成HSE OFF,然后在去转换HSE Bypass或者HSE On.
HAL_RCC_ClockConfig
函数原型:
HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef * RCC_ClkInitStruct, uint32_t FLatency)
根据特定参数RCC_ClkInitStruct来初始化CPU,AHB,APB系统时钟。
注意:
- CMSIS变量用来存储系统时钟频率,且通过本函数调用的HAL_RCC_GetHCLKFreq()函数来更新数据。
结构体
HAL_StatusTypeDef
这个枚举类型定义了HAL的状态。
typedef enum { HAL_OK = 0x00U, HAL_ERROR = 0x01U, HAL_BUSY = 0x02U, HAL_TIMEOUT = 0x03U} HAL_StatusTypeDef;
RCC_OscInitTypeDef
OscillatorType(振荡器类型)
/** @defgroup RCC_Oscillator_Type Oscillator Type */#define RCC_OSCILLATORTYPE_NONE ((uint32_t)0x00000000U)#define RCC_OSCILLATORTYPE_HSE ((uint32_t)0x00000001U)#define RCC_OSCILLATORTYPE_HSI ((uint32_t)0x00000002U)#define RCC_OSCILLATORTYPE_LSE ((uint32_t)0x00000004U)#define RCC_OSCILLATORTYPE_LSI ((uint32_t)0x00000008U)
HSEState(HSE状态)
/** @defgroup RCC_HSE_Config HSE Config */#define RCC_HSE_OFF ((uint8_t)0x00U)#define RCC_HSE_ON ((uint8_t)0x01U)#define RCC_HSE_BYPASS ((uint8_t)0x05U)
LSEState(LSE状态)
/** @defgroup RCC_LSE_Config LSE Config */#define RCC_LSE_OFF ((uint8_t)0x00U)#define RCC_LSE_ON ((uint8_t)0x01U)#define RCC_LSE_BYPASS ((uint8_t)0x05U)
HSIState(HSI状态)
/** @defgroup RCC_HSI_Config HSI Config */#define RCC_HSI_OFF ((uint8_t)0x00U)#define RCC_HSI_ON ((uint8_t)0x01U)#define RCC_HSICALIBRATION_DEFAULT ((uint32_t)0x10U)
LSIState(LSI状态)
/** @defgroup RCC_LSI_Config LSI Config */#define RCC_LSI_OFF ((uint8_t)0x00U)#define RCC_LSI_ON ((uint8_t)0x01U)
PLL(PLL初始化)
typedef struct { uint32_t PLLState; /*!PLL状态*/ uint32_t PLLSource; /*!RCC_PLLSource: PLL输入时钟源*/ uint32_t PLLM; /*!PLLM: PLL VCO输入时钟分割器*/ uint32_t PLLN; /*!PLLN: PLL VCO输出时钟乘数器*/ uint32_t PLLP; /*!PLLP: 主系统时钟(SYSCLK)分割器*/ uint32_t PLLQ; /*!PLLQ: OTG FS,SDIO和RNG时钟分割器*/} RCC_PLLInitTypeDef;
RCC_ClkInitTypeDef
typedef struct { uint32_t ClockType; /*!时钟类型*/ uint32_t SYSCLKSource; /*!系统时钟源*/ uint32_t AHBCLKDivider; /*!AHB时钟预分频器*/ uint32_t APB1CLKDivider; /*!APB1时钟预分频器*/ uint32_t APB2CLKDivider; /*!APB2时钟预分频器*/} RCC_ClkInitTypeDef;
结论
通过适当配置RCC振荡器和时钟系结构件,开发者可以实现对STM32F429的精确控制。在实际应用中,需要注意时钟源的设置和外设时钟的有效使能延时。
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年05月03日 04时03分15秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
解决微信小程序中 calc 失效问题
2019-03-11
JS数组去重的方法
2019-03-11
堆的应用_topK算法和堆排序
2019-03-11
并查集(求连通块数量)
2019-03-11
最大半连通子图
2019-03-11
Remove Extra one 维护前缀最大最小值
2019-03-11
跳台阶
2019-03-11
另类加法,走方格的方案数,最近公共祖先
2019-03-11
线程学习5
2019-03-11
[Java Path Finder][JPF学习笔记][7]JPF输出详细程度设置
2019-03-11
GitHub完整记录数据库GHTorrent的下载和安装经验
2019-03-11
设计模式—— 三:依赖倒置原则
2019-03-11
SpringBoot打包之后乱码
2019-03-11
因SGA分配错误无法启动数据库
2019-03-11
Oracle修改字段类型方法总结
2019-03-11
ORA-00020 超过当前最大连接数
2019-03-11
合理控制oracle数据库具有DBA权限的用户
2019-03-11
喝红茶是否会上火
2019-03-11
Android进阶解密读书笔记2——第2章:Android系统启动——第1、2小节
2019-03-11