打印
[STM32]

立创商城STM32F系列——STM32F4时钟使能和配置

[复制链接]
1384|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小乐Tzz|  楼主 | 2018-8-23 10:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32F4时钟使能和配置
/**********************************************************/
在 STM32F4 标准固件库里,时钟源的选择以及时钟使能等函数都是在RCC相关固件库文件 stm32f4xx_rcc.h 和 stm32f4xx_rcc.c 中声明和定义的。大家打开 stm32f4xx_rcc.h 文件可以看到文件开头有很多宏定义标识符,然后是一系列时钟配置和时钟使能函数申明。这些函数大致可以归结为三类,一类是外设时钟使能函数,一类是时钟源和分频因子配置函数,还有一类是外设复位函数。当然还有几个获取时钟源配置的函数。下面我们以几种常见的操作来简要介绍一下这些库函数的使用。
首先是时钟使能函数。时钟使能相关函数包括外设设置使能和时钟源使能两类。首先我们来看看外设时钟使能相关的函数:
void   RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);
void   RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState);
void   RCC_AHB3PeriphClockCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState);
void   RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
void   RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
这里主要有 5 个外设时钟使能函数。5 个函数分别用来使能 5 个总线下面挂载的外设时钟,这些总线分别为:AHB1总线,AHB2总线,AHB3总线,APB1总线以及APB2总线。要使能某个外设,调用对应的总线外设时钟使能函数即可。
  这里我们要特别说明一下,STM32F4 的外设在使用之前,必须对时钟进行使能,如果没有使能时钟,那么外设是无法正常工作的。对于哪个外设是挂载在哪个总线之下,虽然我们也可以查手册查询到,但是这里如果大家使用的是库函数的话,实际上是没有必要去查询手册的,这里我们给大家介绍一个小技巧。
  比如我们要使能GPIOA,我们只需要在stm32f4xx_rcc.h 头文件里面搜索GPIOA,就可以搜索到对应的时钟使能函数的第一个入口参数为 RCC_AHB1Periph_GPIOA,从这个宏定义标识符一眼就可以看出,GPIOA 是挂载在 AHB1 下面。同理,对于串口 1 我们可以搜索 USART1,找到标识符为RCC_APB2Periph_USART1,那么很容易知道串口1是挂载在APB2之下。这个知识在我们后面的“4.7 快速组织代码技巧”小节也有讲解,这里顺带提一下。
  如果我们要使能 GPIOA,那么我们可以在头文件 stm32f4xx_rcc.h 里面查看到宏定义标识符 RCC_AHB1Periph_GPIOA,顾名思义 GPIOA 是挂载在 AHB1 总线之下,所以,我们调用AHB1总线下外设时钟使能函数RCC_AHB1PeriphClockCmd 即可。具体调用方式入如下:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能 GPIOA时钟
同理,如果我们要使能串口1 的时钟,那么我们调用的函数为:
void   RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);
具体的调用方法是:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
还有一类时钟使能函数是时钟源使能函数,前面我们已经讲解过 STM32F4 有 5 大类时钟源。这里我们列出来几种重要的时钟源使能函数:
        void   RCC_HSICmd(FunctionalState NewState);
void   RCC_LSICmd(FunctionalState NewState);
void   RCC_PLLCmd(FunctionalState NewState);
void   RCC_PLLI2SCmd(FunctionalState NewState);
void   RCC_PLLSAICmd(FunctionalState NewState);
void   RCC_RTCCLKCmd(FunctionalState NewState);
这些函数是用来使能相应的时钟源。比如我们要使能PLL时钟,那么调用的函数为:
void   RCC_PLLCmd(FunctionalState NewState);
具体调用方法如下:
        RCC_PLLCmd(ENABLE);
我们要使能相应的时钟源,调用对应的函数即可。
  接下来我们要讲解的是第二类时钟功能函数:时钟源选择和分频因子配置函数。这些函数是用来选择相应的时钟源以及配置相应的时钟分频系数。比如我们之前讲解过系统时钟SYSCLK,我们可以选择HSI,HSE以及PLL三个中的一个时钟源为系统时钟。那么到底选择哪一个,这是可以配置的。下面我们列举几种时钟源配置函数:
        void       RCC_LSEConfig(uint8_t RCC_LSE);
void        RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);
void        RCC_HCLKConfig(uint32_t RCC_SYSCLK);
void      RCC_PCLK1Config(uint32_t RCC_HCLK);
void      RCC_PCLK2Config(uint32_t RCC_HCLK);
void       RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource);
void        RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM,   
uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ);
比如我们要设置系统时钟源为HSI,那么我们可以调用系统时钟源配置函数:
void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);
具体配置方法如下:
void RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);//配置时钟源为HSI
  又如我们要设置APB1 总线时钟为HCLK的 2分频,也就是设置分频因子为2分频,那么 如果我们要使能HSI,那么调用的函数为:
void    RCC_PCLK1Config(uint32_t RCC_HCLK);
  具体配置方法如下:
RCC_PCLK1Config(RCC_HCLK_Div2);
  接下来我们看看第三类外设复位函数。如下:
void   RCC_AHB1PeriphResetCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);
void   RCC_AHB2PeriphResetCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState);
void   RCC_AHB3PeriphResetCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState);
void   RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
void   RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
  这类函数跟前面讲解的外设时钟函数使用方法基本一致,不同的是一个是用来使能外设时钟,一个是用来复位对应的外设。这里大家在调用函数的时候一定不要混淆。
  对于这些时钟操作函数,我们就不一一列举出来,大家可以打开RCC对应的文件仔细了解。
/**********************************************************/


【立创商城】STM32F103CBT6 托盘  https://item.szlcsc.com/8796.html

相关帖子

沙发
ayb_ice| | 2018-8-23 14:31 | 只看该作者
这都是老库驱动了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

70

帖子

0

粉丝