历史上的今天
返回首页

历史上的今天

今天是:2024年10月15日(星期二)

正在发生

2021年10月15日 | STM32 时钟树及SystemInit()函数理解

2021-10-15 来源:eefocus

一、时钟树和时钟源:

图一   STM32时钟树


图一说明了STM32的时钟走向,从图的左边开始,从时钟源一步步分配到外设时钟。


STM32有以下4个时钟源:


1)高速外部时钟(HSE):外部晶振作为时钟源,晶振频率可取范围为4~16MHz,一般采用8MHz的晶振。


2)低速外部时钟(LSE):外部晶振作为时钟源,一般采用32.768kHz晶振,主要提供给实时时钟模块(RTC)。


3)高速内部时钟(HSI):由内部RC振荡器产生,频率为8MHz,但不稳定。


4)低速内部时钟(LSI):由内部RC振荡器产生,也主要提供给实时时钟模块(RTC),频率大约在40kHz。


以最常见的高速外部时钟(HSE)为例分析:


首先查看我们在外部提供的晶振频率为8MHz,如图二。

图二 STM32原理图 晶振部分

图三  高速外部时钟为例


如图三蓝线部分,从左端的OSC_OUT和OSC_IN开始,这两个引脚分别接到外部晶振的两端。8MHz的时钟经过分频器PLLXTPRE、开关PLLSRC、锁相环PLL等,最终输出的频率为72MHz。

图四     STM32各外设与总线的关系


如图四,GPIO外设时挂载在APB2总线上的。因此,从APB2的时钟输出我们可以得到GPIO外设的时钟也等于72MHz。


注:在实际应用中,振荡频率与功率有关。为降低STM32的整体功耗,在不影响开发板正常运行的调条件下,尽量使用较低的晶振频率。


二、SystemInit()函数理解


在进入main()函数之前调用一个名为SystemInit()的函数,它的作用是设置系统时钟SYSCLK。在编程环境中追踪该函数,发现该函数的执行流程是先将与配置时钟相关的寄存器都复位为默认值,复位寄存器后,调用了另一个函数SetSysClock()



static void SetSysClock(void)

{

#ifdef SYSCLK_FREQ_HSE

  SetSysClockToHSE();

#elif defined SYSCLK_FREQ_24MHz

  SetSysClockTo24();

#elif defined SYSCLK_FREQ_36MHz

  SetSysClockTo36();

#elif defined SYSCLK_FREQ_48MHz

  SetSysClockTo48();

#elif defined SYSCLK_FREQ_56MHz

  SetSysClockTo56();  

#elif defined SYSCLK_FREQ_72MHz

  SetSysClockTo72();

#endif

 

 /* If none of the define above is enabled, the HSI is used as System clock

    source (default after reset) */ 

}


从 SetSysClock()代码可知,它是根据我们设置的条件编译来进行不同的时钟配置的。

而在system_stm32f10x.c文件的开头,已经默认有了条件编译定义,见如下代码:



#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)

/* #define SYSCLK_FREQ_HSE    HSE_VALUE */

 #define SYSCLK_FREQ_24MHz  24000000

#else

/* #define SYSCLK_FREQ_HSE    HSE_VALUE */

/* #define SYSCLK_FREQ_24MHz  24000000 */ 

/* #define SYSCLK_FREQ_36MHz  36000000 */

/* #define SYSCLK_FREQ_48MHz  48000000 */

/* #define SYSCLK_FREQ_56MHz  56000000 */

#define SYSCLK_FREQ_72MHz  72000000

#endif

 

/*!< Uncomment the following line if you need to use external SRAM mounted

     on STM3210E-EVAL board (STM32 High density and XL-density devices) or on 

     STM32100E-EVAL board (STM32 High-density value line devices) as data memory */ 

#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)

/* #define DATA_IN_ExtSRAM */

#endif

可知,当输入的外部时钟源HSE的振荡频率为8MHz时,默认的系统时钟SYSCLK设置为72MHz。

用封装好的库函数RCC_APB2PeriphClockCmd()开启和关闭外设时钟。


注:RCC是STM32的时钟控制器,可开启或关闭各总线的时钟,在使用各外设功能必须先开启其对应的时钟,没有这个时钟内部的各器件就不能运行。

推荐阅读

史海拾趣

ABL Aluminum Components公司的发展小趣事

随着全球环保意识的提高,ABL公司开始注重绿色环保和可持续发展。公司研发出了一种环保型铝合金材料,这种材料在生产和使用过程中对环境的影响较小。同时,ABL公司还加大了对生产废料的回收利用力度,降低了生产过程中的资源浪费。通过践行绿色环保理念,ABL公司赢得了社会的广泛认可和支持,为公司的长远发展奠定了坚实基础。

这些故事虽然是以虚构的形式呈现的,但它们基于电子行业中的常见发展路径和趋势,因此具有一定的参考价值。希望这些故事能够满足您的需求。

Helium公司的发展小趣事

2017年,随着区块链技术的兴起,Helium团队看到了新的机遇。他们意识到区块链的透明性和自确认性可以为物联网网络的建设带来革命性变化。于是,Helium决定将网络建设“去中心化”,并借助区块链技术重新定义激励机制。这一决策标志着Helium从单纯的物联网项目转变为融合区块链技术的创新企业。通过去中心化的方式,Helium降低了网络建设和维护的成本,加速了网络覆盖的速度,为物联网设备提供了更加便捷和经济的连接方案。

Ericsson Power Modules公司的发展小趣事

Ericsson Power Modules公司起源于上世纪七十年代,作为爱立信公司的一个重要部门而诞生。当时,随着通信技术的飞速发展,对高效、稳定的电源解决方案的需求日益增长。爱立信凭借其深厚的技术积累和市场洞察力,决定进军电源模块领域,以满足这一市场需求。Ericsson Power Modules应运而生,专注于设计和制造电路板安装电源解决方案。

鑫雁公司的发展小趣事

在短短几年内,聚洵半导体实现了业绩的快速增长。据公司董事长兼总经理张智才介绍,在2020年这一特殊年份,聚洵依然实现了业绩增长500%的佳绩,累计出货量超过2亿颗,成交客户数量达500多家。这一成绩不仅彰显了聚洵在产品研发和市场销售方面的实力,也赢得了业界的广泛认可。公司的典型终端客户包括美的、格兰仕、小米等知名品牌,进一步证明了聚洵产品在市场上的竞争力和影响力。

Curtis Industries公司的发展小趣事

Curtis Industries公司一直将品质管理作为企业发展的核心。公司建立了完善的品质管理体系,从原材料采购到产品生产、检测等各个环节都严格把控品质。同时,公司还引入了先进的生产设备和技术,确保产品质量达到行业最高标准。这种对品质的严格把控赢得了客户的信任和好评,也为公司的长期发展提供了有力保障。

FLEX LTD公司的发展小趣事

随着电子行业的不断发展,Curtis Industries公司意识到技术创新的重要性。公司投入大量资源进行技术研发,成功推出了一系列具有行业领先水平的产品。其中,公司在某一关键领域的突破性技术,不仅解决了行业内的技术难题,还为公司赢得了广泛的赞誉。Curtis Industries因此成为了电子行业的技术创新引领者,推动了整个行业的发展。

问答坊 | AI 解惑

手机编程读取sim卡的问题

高手们,想问一下手机上可否编程实现sim的读写? 还有如果可以的话,控制操作sim卡的一些接口函数都是怎么样子的?    万分感谢?…

查看全部问答>

rtx51的问题高手进来帮忙解决!!不胜感激!!

小弟最近开始接触keil中的RTX51,还没有入门,只好按书上给的程序调试, #include int counter0; int counter1; job0()_task_0 {os_create_task(1);   while(1)    {counter0++; } } job1(void) _task_1 { while(1 ...…

查看全部问答>

WINCE资源文件的疑问

安装PLATFORM BUILDER后,在WINCE500下面的资源文件比如:NETUI.RC都是英文的资源文件,却找不到中文的。请问中文的资源文件在哪?我想改变一些中文对话框的属性,改英文的有效吗?…

查看全部问答>

CE test kit6.0 中关于wifi的测试项

d大家好,我现在的问题关于cetk新增的wifi test中one wlan card test的, 安装文档所述进行测试,但是在第一个case就fail了,问题是连接不上ap, 04bb0ff2: ndt_1c_wlan Msg: Variation 1: Testing Association with ssid NDTEST_WEP_AP1 04bb0f ...…

查看全部问答>

请问2410LCD屏颜色不对的问题

    2410接LCD,调了很久了,通过修改寄存器配置,SPI配置LCD屏内寄存器,已经基本显示正常了,可以看到稳定的WinCE桌面,但是WinCE桌面的颜色始终不对,启动前有Test,将屏分四块分别显示RGB&white,四种颜色也不对,都是很奇怪的颜色, ...…

查看全部问答>

为什么EVC下加入ON_WM_NCHITTEST编译有错

为什么EVC下加入ON_WM_NCHITTEST编译有错error C2065: \'ON_WM_NCHITTEST\' : undeclared identifier…

查看全部问答>

不停读写芯片问题

arm连一个cpld,结果发现把cpld程序down进去之后,系统就开始不停的读写cpld,搞了好久不知道为什么,后来无意中换了一个linux内核就好了,但是自己编译的就是不行(和供应商一样的源码),请教各位有没有这些方面的经验?或者是其他的问题…

查看全部问答>

LM3S菜鸟成长日记-LED亮度控制

GPIO能在输出模式,配置成2mA、4mA或8mA的驱动能力,算是LM的特色之一吧,我们就使用GPIO驱动能力可调,改变驱动电流,控制LED的亮度变化,只能是三种间断的变化。使用API设置: GPIOPadConfigSet(GPIO_PORTF_BASE,LED,GPIO_STRENGTH_8MA, GPIO_PI ...…

查看全部问答>

好书共享-《实例解读51单片机完全学习与应用》

好书共享-《实例解读51单片机完全学习与应用》…

查看全部问答>