文章目录

  • 前言
  • 函数
    • 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)
  1. do{ }while(0)语句表示该括号中的代码必然执行,且执行的次数为1次。
  2. 定义了uint32_t型变量tmpreg
  3. 将 外设对应寄存器位 置1,即使能对应外设的时钟,此语句为该功能的核心语句。
  4. 将写入的寄存器位读出,且赋值在tmpreg变量中。此处,并非真的需要获取寄存器值,而是为了将外设时钟使能后,延时一段时间。
  5. 因为赋值后的tmpreg并未使用,仅仅为了延时作用,所以,最后添加一句UNUSED(tmpreg);使得编译器在此处不报警告。

时钟被管理的外设是挂载在AHB和APB总线的外设。具体如下:

AHB1

AHB2

AHB3

APB1

APB2


更多详细信息可以参考手册 < RM0090 Reference manual>

STM32F429第九篇之stm32f4xx_hal_rcc_ex相关推荐

  1. CCIE理论-第九篇-IPV6详细介绍

    CCIE理论-第九篇-IPV6介绍 应该有人等这个好久了 其实这个可以放NA,可以放NP,也可以放IE 放在这,其实也没啥了,开搞吧! IPV6-VS-IPV4 ipv6对比ipv4最大的区别是,最明 ...

  2. 学习 spring-cloud-aibaba第九篇,综合应用微信小程序《背诗词》

    文章目录 1.背诗词小程序界面和功能点 1.1 界面展示 1.2 功能介绍 2.架构图 2.1 理想中架构图 2.2 实际上的架构图 3 代码开源 4 线上体验 5.披过的荆斩过的棘 6.存在的不足 ...

  3. 相亲网站平台制作建设,第九篇

    多语言交友婚恋相亲平台开发,第九篇,也是后台篇,从这篇开始,主要开始记录后台的功能和的操作部分等. 如果有什么问题需要咨询的,可以加我的扣236-0248-666 这个是预览截图效果 网站设置 cla ...

  4. 服务拆分的设计和思考(B2B 技术共享第九篇)

    本文主要想给大家分享一下,宋小菜这三年来,是如何从单点巨石系统演变成领域驱动的服务化设计的.这个演变现在还在继续,我们在实践过程中遇到了很多坑,也收获了经验和思考. 一.早期的系统 1.1 唯快不破 ...

  5. java语言程序设计郑莉课后答案_java语言程序设计郑莉第九篇课后习题答案.docx...

    java语言程序设计郑莉第九篇课后习题答案.docx 还剩 36页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: ...

  6. Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程–>错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个人 ...

  7. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  8. 第九篇:强化学习Q-learning算法 通俗介绍

    你好,我是郭震(zhenguo) 今天介绍强化学习第九篇:Q-learning算法 前面我们介绍强化学习基本概念,马尔科夫决策过程,策略迭代和值迭代,这些组成强化学习的基础. 从今天开始逐步介绍常用强 ...

  9. Python学习第九篇:zipfile 库操作压缩包

    ​ Python学习第九篇:zipfile 库操作压缩包 -- 活动地址:CSDN21天学习挑战赛 zipfile是python里用来做zip格式编码的压缩和解压缩的 zipfile里有两个非常常用的 ...

最新文章

  1. LINQ系列:LINQ to ADO.NET概述
  2. win7中VS2010中安装CSS3.0问题解决方法
  3. 王小川 python_Python与量化投资:从基础到实战
  4. linux 变量的继承,solaris移植到linux的大坑:bash和sh中环境变量继承的差异
  5. Openfire性能优化与压力测试小结
  6. iTween for Unity
  7. 互利网上数字金融典型场景: 网络借贷
  8. 新世相难看的吃相:昨天你交智商税了吗?
  9. EntityFramework codefirst
  10. vs2012 设置默认的 include 目录
  11. pr同时对多个视频进行缩放
  12. android 测光模式,Android摄像头:设置测光点位置
  13. python 微信授权 昵称乱码解决
  14. Ubuntu 16.04 中文输入法(搜狗输入法)安装记录
  15. java 基础库_Java基础类库
  16. “健康童乐园”10000户落成促进乡村儿童身心智全面健康成长
  17. otc焊接机器人编程模拟软件_otc焊接机器人编程
  18. 【OpenCV人脸识别入门教程之二】人脸检测
  19. SmallTalkEDI程序
  20. STC单片机驱动BLDC无刷直流电机(无HALL)官方示例

热门文章

  1. 对象存储OSS基本概念讲解
  2. JavaScript最详细攻略
  3. 微服务实战之春云与刀客(四)—— docker swarm 集群实战
  4. JS一百只鸡卖一百块钱,公鸡5元,母鸡3元,三只小鸡一元
  5. 基于RealSense的坐姿检测技术
  6. 潘多拉路由器搭建php,openwrt PandoraBox(潘多拉)如何安装使用SQM QoS
  7. 基于MPC的自适应巡航控制
  8. codeblocks出现Encoding Changed The saved doucument contained characters which were illeal
  9. php中json字符串值,如何使用PHP从JSON中提取数据?
  10. gstreamer element创建