stm32.cube(五)——HAL.RCC

发布者:脑电风暴最新更新时间:2018-05-01 来源: eefocus关键字:stm32  cube  HAL  RCC 手机看文章 扫描二维码
随时随地手机看文章

一、RCC特性

1.1 HIS内部高速时钟

HIS 时钟信号通过一个 8MHz 的 RC 振荡器产生,上电复位时,被自动选做系统时钟。但由于HIS的稳定性较差,受温度、电压等环境参数影响较大,一般只作为备用时钟使用。在芯片初始化的startup.s里,通常会调用一个c编写的函数system_init(),里面会将系统时钟源从HIS设置成HSE。

1.2 HSE外部高速时钟

由晶振或者外部时钟源提供的时钟,较为稳定。

1.3 PLL

PLL可用于将 HIS RC 振荡器的输出时钟频率倍频,具体的原理要参考锁相环电路的相关知识。

1.4 LSE外部低速时钟

LSE 振荡器是一个 32.768kHz 的低速外部晶体或者陶瓷共振器,它用于给RTC功能提供实时时钟。

1.5 LSI内部低速时钟

LSI RC 振荡器作为一个低功耗时钟源,它位看门狗和AWU提供时钟。

1.6 时钟源检测

当HSE、LSE、LSI等时钟被选择启用时,在时钟寄存器里有相应的标志它们是否准备好的位,只有当检测通过时,时钟源才会启动。

1.7 时钟安全系统CSS

CSS一旦启动,会检测外部高速时钟是否安全。只要HSE在上检测到一个失效,HSE就会被禁用。

1.8 RTC时钟

RTCCLK 时钟源可以是 HSE/128,LSE 或者 LSI 时钟。不同的时钟源,在不同的电压源供应下,状态会不同。

1.9 看门狗时钟

如果看门狗被启动了,LSI会被强制打开。

1.10 MCO时钟输出性能

HSI、HSE、PLL、SYSCLK都可以被作为时钟输出,从MCO引脚输出。

1.11 外设时钟

AHB的时钟由系统时钟得到,APB1和APB2的时钟由AHB的时钟得到。

PCLK1——外设时钟,由APB1预分频器输出得到,最大频率为36MHz,提供给挂载在APB1总线上的外设,APB1总线上的外设如下:

RCC_APB1Periph_TIM2 TIM2时钟 
RCC_APB1Periph_TIM3 TIM3时钟 
RCC_APB1Periph_TIM4 TIM4时钟 
RCC_APB1Periph_WWDG WWDG时钟 
RCC_APB1Periph_SPI2 SPI2时钟 
RCC_APB1Periph_USART2 USART2时钟 
RCC_APB1Periph_USART3 USART3时钟 
RCC_APB1Periph_I2C1 I2C1时钟 
RCC_APB1Periph_I2C2 I2C2时钟 
RCC_APB1Periph_USB USB时钟 
RCC_APB1Periph_CAN CAN时钟 
RCC_APB1Periph_BKP BKP时钟 
RCC_APB1Periph_PWR PWR时钟 
RCC_APB1Periph_ALL 全部APB1外设时钟

PCLK2——外设时钟,由APB2预分频器输出得到,最大频率可为72MHz,提供给挂载在APB2总线上的外设,APB2总线上的外设如下:

RCC_APB2Periph_AFIO 功能复用IO时钟 
RCC_APB2Periph_GPIOA GPIOA时钟 
RCC_APB2Periph_GPIOB GPIOB时钟 
RCC_APB2Periph_GPIOC GPIOC时钟 
RCC_APB2Periph_GPIOD GPIOD时钟 
RCC_APB2Periph_GPIOE GPIOE时钟 
RCC_APB2Periph_ADC1 ADC1时钟 
RCC_APB2Periph_ADC2 ADC2时钟 
RCC_APB2Periph_TIM1 TIM1时钟 
RCC_APB2Periph_SPI1 SPI1时钟 
RCC_APB2Periph_USART1 USART1时钟 
RCC_APB2Periph_ALL 全部APB2外设时钟

1.12 时钟中断

当某些时钟被检测到准备完毕时,系统会产生中断。当CSS检测到HSE错误时,也同样会产生中断。

1.13 小结

这里写图片描述 
注:此图出处不明,所以没有办法注明全作者。

二、RCC源文件结构

从系统上电到HSE的启动,这些时钟操作都由startup函数来执行,此过程与HAL的RCC模块无关,不做叙述。

要了解HAL里RCC模块的结构,其实是要回答这么几个问题。面对较为复杂的时钟系统,在输出接口内容已知的提前下,HAL是如何实现它的功能的?它建立了哪些结构体(或单个变量)用以标记设置和状态?它使用哪些函数来支持对RCC的各种操作?整个源文件里代码的逻辑结构是怎样的?

假设我们自己需要写一个RCC通用模块,第一步就是将整个模块根据可以被区分的属性进行分层。

从上面的图可以看出,整个RCC从逻辑上可以分成3层:

  • 最上层的是5个时钟源,HSE、HIS、PLL、LSE和HIS。CSS和MCO直接依赖与这五个时钟源,也可以被划在这一层。

  • 中间层是系统时钟SYSCLK和外设总线时钟APB。

  • 最底层是外设时钟。

对于第一层,RCC模块提供以下函数:


HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef  *RCC_ClkInitStruct, uint32_t FLatency);

RCC_ClkInitStruct结构体里包含5个时钟源的设置参数,开启或者关闭、HSE的预分频参数、HIS的校准量。如果不想一次性设置所有的时钟源,对单个时钟源的操作可以通过许多HAL提供的宏定义来进行。

MCO设置函数:

void              HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv)


CSS设置函数和CSS中断处理函数:


void              HAL_RCC_EnableCSS(void);

void              HAL_RCC_DisableCSS(void);


void              HAL_RCC_NMI_IRQHandler(void);


/* User Callbacks in non blocking mode (IT mode) */

void           


第二层


HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef  *RCC_OscInitStruct);

1

RCC_OscInitStruct结构体里包含的信息是系统时钟源的选择、APB1和APB2的分频量。


第三层


对于每个外设时钟,HAL都有两个宏来开关它的时钟。   HAL_RCC_CSSCallback(void);

#define __HAL_RCC_I2C1_CLK_ENABLE()   do { \

                                        __IO uint32_t tmpreg; \

                                        SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\

                                        /* Delay after an RCC peripheral clock enabling */ \

                                        tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\

                                        UNUSED(tmpreg); \

                                      } while(0)


#define __HAL_RCC_BKP_CLK_ENABLE()   do { \

                                        __IO uint32_t tmpreg; \

                                        SET_BIT(RCC->APB1ENR, RCC_APB1ENR_BKPEN);\

                                        /* Delay after an RCC peripheral clock enabling */ \

                                        tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_BKPEN);\

                                        UNUSED(tmpreg); \

                                      } while(0)

除了设置以外,HAL提供了一系列的Get函数用以获得当前时钟设置。


uint32_t          HAL_RCC_GetSysClockFreq(void);

uint32_t          HAL_RCC_GetHCLKFreq(void);

uint32_t          HAL_RCC_GetPCLK1Freq(void);

uint32_t          HAL_RCC_GetPCLK2Freq(void);

void              HAL_RCC_GetOscConfig(RCC_OscInitTypeDef  *RCC_OscInitStruct);

void              HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef  *RCC_ClkInitStruct, uint32_t *pFLatency)


对于RCC模块的结构梳理完毕,从中可以看到HAL在结构上较之与Stmlib的简化。它把复杂度更多的放到了函数里。牺牲了一点执行效率,增强了代码的可读性和可维护性。



关键字:stm32  cube  HAL  RCC 引用地址:stm32.cube(五)——HAL.RCC

上一篇:stm32.cube(七)——arm-gcc.helloworld
下一篇:stm32.cube(四)——HAL.ADC

推荐阅读最新更新时间:2024-03-16 16:01

STM32自动ISP电路设计
STM32支持仿真器和串口下载程序。将要介绍的内容,属于串口下载,即我们通常说的ISP下载。 手动ISP下载程序,我们已经知道了,控制BOOT0引脚实现。STM32上电,会自动检测BOOT0引脚是什么电平,如果是高电平,等待用户下载程序;如果是低电平,运行用户之前下载到单片机的程序。所以我们需要把BOOT0引脚引出,然后控制其接地或接VCC来下载程序或者运行程序。在调试过程中,我们需要不断的控制BOOT0,非常麻烦。那么,自动ISP就该出场了。 自动ISP,把BOOT0与地直接连接,那么每次上电就会运行程序,而且只要点击电脑上的“下载”按钮,就开始下载程序,下载完程序,就开始执行。实现此目的,需要借助串口握手信号DTR和RTS。
[单片机]
<font color='red'>STM32</font>自动ISP电路设计
STM32学习笔记七——LED闪烁的三种控制方法
法一:软件延时(不精准) void delay_nms(u16 time) { u16 i=0; while(time--) { i=12000; while(i--); } } 方法二: main.c #include stm32f10x.h __IO uint32_t TimingDelay; /****************** *函数名称: LED_GPIO_Config() *功 能:实现LED等GPIO的配置 *参 数:无 *返 回 值:无 *作 者:Katter ******************/ void LED_GPIO_Config(void) {
[单片机]
stm32之SysTick的理解
1、SysTick的介绍(以上资料来自CM3中文参考手册) SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。 Cortex‐M3处理器内部包含了一个简单的定时器。因为所有的CM3芯片都带有这个定时器,软件在不同 CM3
[单片机]
关于STM32的GPIO配置不同输出速度会有什么影响
今天有人问:GPIO配置不同输出速度会有什么影响?你知道答案吗? 1写在前面 这个问题看起来比较简单,我相信很多人都能说出答案。 但是,很多人都只是停留在表面,至于深层次的含义,估计很少有人思考。 需要更深理解其中含义,可能需要结合特定场景来说,我自己也是在项目中才深刻体会其中含义。 2GPIO输出速度 不管标准外设库,还是STM32CubeMX配置GPIO输出引脚,都会有速度GPIO_InitStruct.Speed这个选项。 类似如下: GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStru
[单片机]
关于<font color='red'>STM32</font>的GPIO配置不同输出速度会有什么影响
HC-SR505红外感应模块驱动(STM32
一、前期准备 单片机:STM32F103ZET6 开发环境:MDK5.14 库函数:标准库V3.5 HC-SR505红外感应模块:淘宝有售 二、实验效果 三、驱动原理 这个模块比较简单,当有人靠近时候其IO输出3.3V,STM32可以直接采集。 需要完整工程或者有问题的请加QQ:1002521871,验证:呵呵。 四、驱动代码 HC_SR505.h #ifndef __HC_SR505_H__ #define __HC_SR505_H__ #include stm32f10x.h #include gpio.h #define HC_SR505 PAin(0) #define HC_SR505_
[单片机]
HC-SR505红外感应模块驱动(<font color='red'>STM32</font>)
STM32单片机知识汇总
1、 AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2 1,意思是APB2接高速设备 2、 Stm32f10x.h相当于reg52.h(里面有基本的位操作定义),另一个为stm32f10x_conf.h专门控制外围器件的配置,也就是开关头文件的作用 3、 HSE Osc(High Speed External Oscillator)高速外部晶振,一般为8MHz,HSI RC(High Speed InternalRC)高速内部RC,8MHz 4、 LSE Osc(Low Speed External Oscillator)低速外部晶振,一般为32.768KHz,LSI RC(Low Speed Intern
[单片机]
STM32 DSP库函数详解
对于每个函数,都存在浮点数和定点数的类型,由于使用方法是一致的,这里我们仅以32为浮点数为例来说明。 一.BasicMathFunctions 1.绝对值 pDst = abs(pSrc ), 0 = n blockSize 示例 float32_t *pSrc; float32_t *pDst; uint32_t blocksize; arm_add_f32(pSrc,pDst,blocksize); 2.求和 pDst = pSrcA + pSrcB , 0 = n blockSize. 示例 float32_t *pSrcA; float32_t *pSrcB; float32_t *pD
[单片机]
STM32实现命令行
一、前言 工作中的开发环境都是基于linux命令行交互,作为命令行的重度使用者,玩单片机也要使用命令行工具,百度了一些命令行工具,有几个不错的开源 cmd 交互工具,主要看了 finsh和 nr_micro_shell 两个开源项目。Finsh 功能上限较多,但资源占用比较高,nr 有基本功能,且占用 MCU 资源较少,Github 给出的对比列表如下: Nr 和 Finsh 编译资源对比: 原始工程 添加nr_micro_shell增加量 添加finsh增加量 ROM 63660 +3832 +26908 RAM 4696 +1104 +1304 综合衡量了一下,移植 nr 作为后续项目的一个命令行交互。本篇文章分
[单片机]
在<font color='red'>STM32</font>实现命令行
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved