历史上的今天
返回首页

历史上的今天

今天是: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对应的文件仔细了解。


推荐阅读

史海拾趣

Datatronic公司的发展小趣事

随着全球化趋势的加速,Datatronic公司开始将目光投向国际市场。公司通过参加国际展览、设立海外办事处等方式,积极拓展海外市场。同时,公司还加强了与国际企业的合作,引进先进的技术和管理经验。这些努力使得Datatronic公司在国际市场上逐渐获得了认可,品牌影响力得到了提升。

Bestar Electric公司的发展小趣事

在电子行业的早期,Bestar Electric公司应运而生。作为一家初创企业,公司凭借对技术的深刻理解和市场需求的敏锐洞察,专注于电子元器件的研发与生产。通过不断的技术创新和产品优化,Bestar Electric逐渐在行业内建立起良好的声誉,并获得了初步的市场份额。

DC Components公司的发展小趣事

DC Components公司成立于1992年,总部位于台湾台中市。公司自创立之初,就专注于二极管桥式整流器的研发与生产。在创立初期,公司面临着资金、技术和市场的诸多挑战。然而,凭借对技术的执着追求和对市场的敏锐洞察,DC Components公司逐渐在二极管桥式整流器领域树立了专业形象,为未来的发展奠定了坚实基础。

Electro-Films Inc Semi-Films Div公司的发展小趣事

进入21世纪后,随着全球电子产业的蓬勃发展,Semi-Films Division 开始积极拓展国际市场。公司参加了多个国际性的电子产品展览会,与全球各地的客户建立了联系。同时,公司还加大了对海外市场的投入,设立了多个海外办事处和代理商,为客户提供更加便捷的服务。这些举措使得 Semi-Films 的产品逐渐走向世界,成为国际知名的薄膜材料供应商。

AVG [AVG Semiconductors(HITEK)]公司的发展小趣事

随着全球对可持续发展的关注度不断提高,AVG也积极响应这一趋势,将可持续发展理念融入公司的战略和运营中。公司注重环保和节能减排,采用环保材料和生产工艺,减少对环境的影响;同时,AVG还积极参与社会公益事业,为社会做出贡献。这些举措不仅提升了AVG的社会形象,也为公司的长远发展奠定了坚实的基础。

这些故事只是AVG Semiconductors(HITEK)在电子行业发展中众多精彩瞬间的一部分。通过技术创新、市场扩张、合作伙伴关系的建立以及应对挑战和危机的能力,AVG不断壮大自身实力,为电子行业的发展做出了重要贡献。未来,AVG将继续秉持创新精神和社会责任感,在电子行业中书写更加辉煌的篇章。

General Semiconductor ( Vishay )公司的发展小趣事

1997年,Vishay正式进入分立半导体领域,收购了Lite-On Power Semiconductor公司65%的股份。这一举措标志着Vishay在半导体技术上的重大突破。随后,在1998年,Vishay又收购了TEMIC的半导体业务部分,包括特洛芬肯(Telefunken)和硅尼克斯(Siliconix)两家公司的大部分股份。这些收购为Vishay带来了先进的晶体管、二极管、光电子装置等半导体技术,进一步巩固了其在半导体领域的地位。

问答坊 | AI 解惑

dsp builder的安装问题

装了一天的dsp builder,都没有安装成功。网上有个安装说明照着做了,但是在MATLAB中运行setup_dspbuilder时出现了错误,屏幕上显示:???Undefined function or variable \'setup_dspbuilder\'.:\'( MATLAB是R2009版本,quartus,modelsim是8.1 ...…

查看全部问答>

ARM处理器系统初始化过程

本问节选自《嵌入式系统Linux内核开发实战指南(ARM平台)》一书      每次系统上电/复位启动时,处理器都处于一种最低性能即只有最基本功能的状态,此时它只能从复位向量地址处去读取指令,其他功能模块都处于禁止或者不可 ...…

查看全部问答>

sw笨笨的STM32学前班教程之五:给等待入门的人一点点建议

入门必须阅读的相关文档1、    几个重要官方文档的功能:a)    Datasheet——芯片基本数据,功能参数封装管脚定义和性能规范。b)    固件函数库用户手册——函数库功能,库函数 ...…

查看全部问答>

那个能破解STM8S103K3程序 我出3万大洋

那个能破解STM8S103K3程序  我出3万大洋 联系13358052018…

查看全部问答>

ccs controlsuite

在ccs中的TIresource explorer中没有controlsuit,已经在  安装了controlsuite。。。而且是在TI那个安装目录下。。。请问大家有没有遇到这个情况?求解释。。。…

查看全部问答>

iar编译问题

用iar编译程序时出现如下问题 Error[e46]: Undefined external \"sensors\" referred in sensors ( E:\\新建文件夹\\ contiki-2.6\\Debug\\Obj\\sensors.r43 ) Error[e46]: Undefined external \"sensors_flags\" referred in sensors ( E:\\ ...…

查看全部问答>

能让芯片睡死的一段程序??!!

前几天刚接触430吧,属于菜鸟,然后就想把各个模块过一遍,心里有个大概,然后写了一段程序:如下 #include void main(void) {    WDTCTL=WDTPW+WDTHOLD+WDTNMI+WDTNMIES;    //RST/NMI引脚为非屏蔽中断输入, 时钟禁止输 ...…

查看全部问答>

BoosterPack 是否通用

Boost英语解释是:VT 促进 增加;支援,pack是包果.自然是增强包了. 今天在网上看到Hercules TMS570LS04x/03x and RM42x LaunchPads 的原理图,为了方便传一下,我看到有BoosterPack的接口,也传一下,我想是否同那个风火轮能接下呢,大家有没有试过的呢? ...…

查看全部问答>

到底是我们在玩手机,还是手机在玩我们?

http://tc.people.com.cn/n/2013/1108/c183175-23479227.html 原标题:调查显示多数人成为手机奴隶:手机不见感到恐慌   到底是我们在玩手机,还是手机在玩我们?《南都周刊》的调查显示,14%的人夜间醒来的第一件事就是去看手机,11%的人甚至 ...…

查看全部问答>

通宵画pcb.

本帖最后由 ienglgge 于 2014-4-8 21:43 编辑 昨天,通宵画这个电路图。今天又画半天,才画完,还不算之前花的时间,真的是太慢了。用的是pads-9.3. 现将电路图献上。期待各位的指教。 …

查看全部问答>