STM32F429第九篇之stm32f4xx_hal_rcc_ex
文章目录
- 前言
- 函数
- HAL_RCCEx_PeriphCLKConfig
- HAL_RCCEx_GetPeriphCLKConfig
- HAL_RCCEx_GetPeriphCLKFreq
- 结构体
- HAL_StatusTypeDef
- RCC_PeriphCLKInitTypeDef
- 外设时钟管理
- AHB1
- AHB2
- AHB3
- APB1
- APB2
前言
本文主要介绍STM32F429的HAL库中的RCC的剩余函数的用法,主要参考资料为:
- Description of STM32F4 HAL and low-layer drivers
- RM0090 Reference manual
本文承接上文<STM32F429第八篇之stm32f4xx_hal_rcc>
本文使用硬件库版本为:
- STM32Cube_FW_F4_V1.11.0
在HAL库中,名称以_ex为后缀的文件表明该文件中的函数并非通用函数,与具体的硬件支持有关。
这部分函数与RCC时钟频率控制相关。
函数
HAL_RCCEx_PeriphCLKConfig
函数原型
HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig (RCC_PeriphCLKInitTypeDef * PeriphClkInit)
通过指定参数初始化外设时钟。
注意
- 当使用HAL_RCCEx_PeriphCLKConfig()配置RTC时钟源的时候必须小心,因为此时将会把备份域重置,从而,RTC寄存器和RCC_BDCR寄存器同样会被设置为复位值。
参数
- PeriphClkInit:结构体RCC_PeriphCLKInitTypeDef指针,包含外设时钟的配置信息(I2S, SAI, LTDC, RTC 和 TIM)
返回类型
- HAL_StatusTypeDef :HAL状态定义。
HAL_RCCEx_GetPeriphCLKConfig
函数原型
void HAL_RCCEx_GetPeriphCLKConfig (RCC_PeriphCLKInitTypeDef * PeriphClkInit)
根据RCC配置寄存器的参数来填充RCC_PeriphCLKInitTypeDef。
参数
- PeriphClkInit:指向结构体 RCC_PeriphCLKInitTypeDef的指针。
HAL_RCCEx_GetPeriphCLKFreq
函数模型
uint32_t HAL_RCCEx_GetPeriphCLKFreq (uint32_t PeriphClk)
返回给定的外设时钟频率
注意
- 若函数返回0,则说明该外设时钟参数并不支持此API。
- 并不是所有的硬件都支持此函数,在该版本API中,只有446支持此函数。
参数
- PeriphClk:外设时钟参数可以为:
#define RCC_PERIPHCLK_SAI1 ((uint32_t)0x00000004U)
#define RCC_PERIPHCLK_SAI2 ((uint32_t)0x00000008U)
返回值
- 频率值:单位为kHz。
结构体
HAL_StatusTypeDef
/** * @brief HAL Status structures definition */
typedef enum
{HAL_OK = 0x00U,HAL_ERROR = 0x01U,HAL_BUSY = 0x02U,HAL_TIMEOUT = 0x03U
} HAL_StatusTypeDef;
RCC_PeriphCLKInitTypeDef
typedef struct
{uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured.This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */RCC_PLLSAIInitTypeDef PLLSAI; /*!< PLL SAI structure parameters. This parameter will be used only when PLLI2S is selected as Clock Source SAI or LTDC */uint32_t PLLI2SDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock.This parameter must be a number between Min_Data = 1 and Max_Data = 32This parameter will be used only when PLLI2S is selected as Clock Source SAI */uint32_t PLLSAIDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock.This parameter must be a number between Min_Data = 1 and Max_Data = 32This parameter will be used only when PLLSAI is selected as Clock Source SAI */uint32_t PLLSAIDivR; /*!< Specifies the PLLSAI division factor for LTDC clock.This parameter must be one value of @ref RCCEx_PLLSAI_DIVR */uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection. This parameter can be a value of @ref RCC_RTC_Clock_Source */uint8_t TIMPresSelection; /*!< Specifies TIM Clock Prescalers Selection. This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */
#if defined(STM32F469xx) || defined(STM32F479xx)uint32_t Clk48ClockSelection; /*!< Specifies CK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. This parameter can be a value of @ref RCCEx_CK48_Clock_Source */uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */
#endif /* STM32F469xx || STM32F479xx */
}RCC_PeriphCLKInitTypeDef;
PeriphClockSelection(外设时钟选择)
被配置的时钟选择,可以在以下范围中选择:
/*-------- Peripheral Clock source for STM32F42xxx/STM32F43xxx ---------------*/
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)
#define RCC_PERIPHCLK_I2S ((uint32_t)0x00000001U)
#define RCC_PERIPHCLK_SAI_PLLI2S ((uint32_t)0x00000002U)
#define RCC_PERIPHCLK_SAI_PLLSAI ((uint32_t)0x00000004U)
#define RCC_PERIPHCLK_LTDC ((uint32_t)0x00000008U)
#define RCC_PERIPHCLK_TIM ((uint32_t)0x00000010U)
#define RCC_PERIPHCLK_RTC ((uint32_t)0x00000020U)
#define RCC_PERIPHCLK_PLLI2S ((uint32_t)0x00000040U)
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */
/*----------------------------------------------------------------------------*/
PLLI2S(PLL I2S 结构体参数)
只有当PLLI2S用作时钟源时,该参数才有效。参数的具体定义如下:
/** * @brief PLLI2S Clock structure definition */
typedef struct
{uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock.This parameter must be a number between Min_Data = 50 and Max_Data = 432.This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock.This parameter must be a number between Min_Data = 2 and Max_Data = 7. This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI1 clock.This parameter must be a number between Min_Data = 2 and Max_Data = 15. This parameter will be used only when PLLI2S is selected as Clock Source SAI */
}RCC_PLLI2SInitTypeDef;
PLLSAI(PLL SAI 结构体参数)
只有当PPLLSAI用作时钟源时,该参数才有效。具体定义如下:
/** * @brief PLLSAI Clock structure definition */
typedef struct
{uint32_t PLLSAIN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock.This parameter must be a number between Min_Data = 50 and Max_Data = 432.This parameter will be used only when PLLSAI is selected as Clock Source SAI or LTDC */
#if defined(STM32F469xx) || defined(STM32F479xx)uint32_t PLLSAIP; /*!< Specifies division factor for OTG FS and SDIO clocks.This parameter is only available in STM32F469xx/STM32F479xx devices.This parameter must be a value of @ref RCCEx_PLLSAIP_Clock_Divider */
#endif /* STM32F469xx || STM32F479xx */uint32_t PLLSAIQ; /*!< Specifies the division factor for SAI1 clock.This parameter must be a number between Min_Data = 2 and Max_Data = 15.This parameter will be used only when PLLSAI is selected as Clock Source SAI or LTDC */uint32_t PLLSAIR; /*!< specifies the division factor for LTDC clockThis parameter must be a number between Min_Data = 2 and Max_Data = 7.This parameter will be used only when PLLSAI is selected as Clock Source LTDC */}RCC_PLLSAIInitTypeDef;
外设时钟管理
这部分内容主要存在于stm32f4xx_hal_rcc.h和stm32f4xx_hal_rcc_ex.h中。通过宏定义的形式,管理外设的时钟。其主要形式如下:
//其中XXX为外设的名称。
#define __HAL_RCC_XXX_CLK_ENABLE() //外设时钟使能
#define __HAL_RCC_XXX_CLK_DISABLE() //外设时钟禁止
#define __HAL_RCC_XXX_IS_CLK_ENABLED() //外设时钟是否使能
#define __HAL_RCC_XXX_IS_CLK_DISABLED() //外设时钟是否禁止
其中,外设时钟使能宏的实现方式相对比较复杂,详细代码如下(以GPIOA外设为例):
#define __HAL_RCC_GPIOA_CLK_ENABLE() do { \__IO uint32_t tmpreg = 0x00U; \SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN);\/* Delay after an RCC peripheral clock enabling */ \tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN);\UNUSED(tmpreg); \} while(0)
do{ }while(0)
语句表示该括号中的代码必然执行,且执行的次数为1次。- 定义了
uint32_t
型变量tmpreg
。 - 将 外设对应寄存器位 置1,即使能对应外设的时钟,此语句为该功能的核心语句。
- 将写入的寄存器位读出,且赋值在
tmpreg
变量中。此处,并非真的需要获取寄存器值,而是为了将外设时钟使能后,延时一段时间。 - 因为赋值后的
tmpreg
并未使用,仅仅为了延时作用,所以,最后添加一句UNUSED(tmpreg);
使得编译器在此处不报警告。
时钟被管理的外设是挂载在AHB和APB总线的外设。具体如下:
AHB1
AHB2
AHB3
APB1
APB2
更多详细信息可以参考手册 < RM0090 Reference manual>
STM32F429第九篇之stm32f4xx_hal_rcc_ex相关推荐
- CCIE理论-第九篇-IPV6详细介绍
CCIE理论-第九篇-IPV6介绍 应该有人等这个好久了 其实这个可以放NA,可以放NP,也可以放IE 放在这,其实也没啥了,开搞吧! IPV6-VS-IPV4 ipv6对比ipv4最大的区别是,最明 ...
- 学习 spring-cloud-aibaba第九篇,综合应用微信小程序《背诗词》
文章目录 1.背诗词小程序界面和功能点 1.1 界面展示 1.2 功能介绍 2.架构图 2.1 理想中架构图 2.2 实际上的架构图 3 代码开源 4 线上体验 5.披过的荆斩过的棘 6.存在的不足 ...
- 相亲网站平台制作建设,第九篇
多语言交友婚恋相亲平台开发,第九篇,也是后台篇,从这篇开始,主要开始记录后台的功能和的操作部分等. 如果有什么问题需要咨询的,可以加我的扣236-0248-666 这个是预览截图效果 网站设置 cla ...
- 服务拆分的设计和思考(B2B 技术共享第九篇)
本文主要想给大家分享一下,宋小菜这三年来,是如何从单点巨石系统演变成领域驱动的服务化设计的.这个演变现在还在继续,我们在实践过程中遇到了很多坑,也收获了经验和思考. 一.早期的系统 1.1 唯快不破 ...
- java语言程序设计郑莉课后答案_java语言程序设计郑莉第九篇课后习题答案.docx...
java语言程序设计郑莉第九篇课后习题答案.docx 还剩 36页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: ...
- Python成长之路【第九篇】:Python基础之面向对象
一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程–>错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个人 ...
- (转)Python成长之路【第九篇】:Python基础之面向对象
一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...
- 第九篇:强化学习Q-learning算法 通俗介绍
你好,我是郭震(zhenguo) 今天介绍强化学习第九篇:Q-learning算法 前面我们介绍强化学习基本概念,马尔科夫决策过程,策略迭代和值迭代,这些组成强化学习的基础. 从今天开始逐步介绍常用强 ...
- Python学习第九篇:zipfile 库操作压缩包
Python学习第九篇:zipfile 库操作压缩包 -- 活动地址:CSDN21天学习挑战赛 zipfile是python里用来做zip格式编码的压缩和解压缩的 zipfile里有两个非常常用的 ...
最新文章
- LINQ系列:LINQ to ADO.NET概述
- win7中VS2010中安装CSS3.0问题解决方法
- 王小川 python_Python与量化投资:从基础到实战
- linux 变量的继承,solaris移植到linux的大坑:bash和sh中环境变量继承的差异
- Openfire性能优化与压力测试小结
- iTween for Unity
- 互利网上数字金融典型场景: 网络借贷
- 新世相难看的吃相:昨天你交智商税了吗?
- EntityFramework codefirst
- vs2012 设置默认的 include 目录
- pr同时对多个视频进行缩放
- android 测光模式,Android摄像头:设置测光点位置
- python 微信授权 昵称乱码解决
- Ubuntu 16.04 中文输入法(搜狗输入法)安装记录
- java 基础库_Java基础类库
- “健康童乐园”10000户落成促进乡村儿童身心智全面健康成长
- otc焊接机器人编程模拟软件_otc焊接机器人编程
- 【OpenCV人脸识别入门教程之二】人脸检测
- SmallTalkEDI程序
- STC单片机驱动BLDC无刷直流电机(无HALL)官方示例
热门文章
- 对象存储OSS基本概念讲解
- JavaScript最详细攻略
- 微服务实战之春云与刀客(四)—— docker swarm 集群实战
- JS一百只鸡卖一百块钱,公鸡5元,母鸡3元,三只小鸡一元
- 基于RealSense的坐姿检测技术
- 潘多拉路由器搭建php,openwrt PandoraBox(潘多拉)如何安装使用SQM QoS
- 基于MPC的自适应巡航控制
- codeblocks出现Encoding Changed The saved doucument contained characters which were illeal
- php中json字符串值,如何使用PHP从JSON中提取数据?
- gstreamer element创建