历史上的今天
今天是:2024年09月29日(星期日)
2018年09月29日 | STM32F4时钟使能和配置
2018-09-29 来源:eefocus
在 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对应的文件仔细了解。
下一篇:STM32F4时钟初始化配置
史海拾趣
|
装了一天的dsp builder,都没有安装成功。网上有个安装说明照着做了,但是在MATLAB中运行setup_dspbuilder时出现了错误,屏幕上显示:???Undefined function or variable \'setup_dspbuilder\'.:\'( MATLAB是R2009版本,quartus,modelsim是8.1 ...… 查看全部问答> |
|
本问节选自《嵌入式系统Linux内核开发实战指南(ARM平台)》一书 每次系统上电/复位启动时,处理器都处于一种最低性能即只有最基本功能的状态,此时它只能从复位向量地址处去读取指令,其他功能模块都处于禁止或者不可 ...… 查看全部问答> |
|
sw笨笨的STM32学前班教程之五:给等待入门的人一点点建议 入门必须阅读的相关文档1、 几个重要官方文档的功能:a) Datasheet——芯片基本数据,功能参数封装管脚定义和性能规范。b) 固件函数库用户手册——函数库功能,库函数 ...… 查看全部问答> |
|
在ccs中的TIresource explorer中没有controlsuit,已经在 安装了controlsuite。。。而且是在TI那个安装目录下。。。请问大家有没有遇到这个情况?求解释。。。… 查看全部问答> |
|
前几天刚接触430吧,属于菜鸟,然后就想把各个模块过一遍,心里有个大概,然后写了一段程序:如下 #include void main(void) { WDTCTL=WDTPW+WDTHOLD+WDTNMI+WDTNMIES; //RST/NMI引脚为非屏蔽中断输入, 时钟禁止输 ...… 查看全部问答> |
|
Boost英语解释是:VT 促进 增加;支援,pack是包果.自然是增强包了. 今天在网上看到Hercules TMS570LS04x/03x and RM42x LaunchPads 的原理图,为了方便传一下,我看到有BoosterPack的接口,也传一下,我想是否同那个风火轮能接下呢,大家有没有试过的呢? ...… 查看全部问答> |
|
http://tc.people.com.cn/n/2013/1108/c183175-23479227.html 原标题:调查显示多数人成为手机奴隶:手机不见感到恐慌 到底是我们在玩手机,还是手机在玩我们?《南都周刊》的调查显示,14%的人夜间醒来的第一件事就是去看手机,11%的人甚至 ...… 查看全部问答> |




