历史上的今天
返回首页

历史上的今天

今天是:2025年02月13日(星期四)

正在发生

2019年02月13日 | SystemInit()函数详解

2019-02-13 来源:eefocus

1 基于STM32F103的SystemInit()函数详解


1 使用的固件库是,STM32F10x_StdPeriph_Lib_V3.5.0


2 学习板CPU的具体型号为STM32F103VET6


3 软件开发环境为RVMDK3.90


4 未定义STM32F10X_CL,在system_stm32f10x.c(第0115行)中定义了SYSCLK_FREQ_72MHz,具体如下:

#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


5 具体的函数调用顺序如下:

①startup_stm32f10x_hd.s(启动文件)→②SystemInit()→③SetSysClock ()→④SetSysClockTo72()


说明:由于在上面只定义了SYSCLK_FREQ_72MHz,因而在执行SetSysClock ()函数的时候,会选择进入SetSysClockTo72()函数,以设置系统时钟为72MHz


6 说明:以上设置,采用Debud -> Use Simulator模拟调试,能够很清晰地看到程序的具体执行步骤:

RST后如下


 


首先进入SystemInit()函数


 

 


以上由于未定义STM32F10X_CL,STM32F10X_LD_VL等,所以直接跳至0251行执行



接着便会执行SetSysClock函数


 


由于定义的是#define SYSCLK_FREQ_72MHz  72000000,所以会选择SetSysClockTo72()函数执行


【若定义的是#define SYSCLK_FREQ_56MHz  56000000,便会选择SetSysClockTo56()函数执行】


 

 

 


以上由于未定义STM32F10X_CL,所以直接跳至1057行执行


 


跳出SetSysClockTo72()函数

跳出SetSysClock()函数

跳出SystemInit()函数

说明:执行完代码的1057行至1062行时,便已完成将系统时钟设置为72MHz。


至此,基本配置已经完成,配置的时钟如下:

SYSCLK(系统时钟) = 72MHZ(系统最高允许时钟)

AHB总线时钟   = 72MHZ(AHB最高允许时钟)

APB1总线时钟 = 36MHZ(APB1最高允许时钟)

APB2总线时钟 = 72MHZ(APB2最高允许时钟)


2 基于STM32F107的SystemInit()函数详解


STM32的库函数好像只有外部8M倍频到72M,现在用的板子外部25M的晶振,如何倍频到72M呢?

解决办法: STM32F107的时钟分4步的:

     1> 25MHz先除5分频到5MHz;

     2> 再8倍频到40MHz;

     3> 再5分频到8MHz;

     4> 再9倍频到72MHz.

    STM32F103和STM32F105/STM32F107的RCC设置是不一样的,仔细查ST的参考手册,很容易得到答案的,新版的库中,有STM32F105/STM32F107的时钟设置代码,通过全局宏来选定的。看一下《STM32F10x.h》中的开头部分的宏判断。


ErrorStatus HSEStartUpStatus;

RCC_DeInit();

RCC_HSEConfig(RCC_HSE_ON);

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus==SUCCESS)

{

    RCC_HCLKConfig(RCC_SYSCLK_Div1);

    RCC_PCLK2Config(RCC_HCLK_Div1);

    RCC_PCLK1Config(RCC_HCLK_Div2);

    RCC_ADCCLKConfig(RCC_PCLK2_Div4);

 

#ifndef STM32F10X_CL 

    RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);

#else


    RCC_PREDIV2Config(RCC_PREDIV2_Div5);

    RCC_PLL2Config(RCC_PLL2Mul_8);

    RCC_PLL2Cmd(ENABLE);

    while(RCC_GetFlagStatus(RCC_FLAG_PLL2RDY)== RESET)

    {}

    RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2,RCC_PREDIV1_Div5);

    RCC_PLLConfig(RCC_PLLSource_PREDIV1,RCC_PLLMul_9);


    RCC_PLL3Config(RCC_PLL3Mul_11);

    RCC_PLL3Cmd(ENABLE);   

    while(RCC_GetFlagStatus(RCC_FLAG_PLL3RDY)== RESET)

    {}


    RCC_I2S3CLKConfig(RCC_I2S3CLKSource_PLL3_VCO);

    RCC_I2S2CLKConfig(RCC_I2S2CLKSource_PLL3_VCO); 

#endif

    RCC_PLLCmd(ENABLE);

    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)

    {

    }

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    while(RCC_GetSYSCLKSource()!=0x08)

    {

    }

}


函数库的不断升级,到3.0以上时,我们就不用再这样编写时钟设置了,我们只要做如下两部即可:


第一个: system_stm32f10x.c 中 #define SYSCLK_FREQ_72MHz 72000000 

第二个:调用SystemInit()


说明:在stm32固件库3.0中对时钟频率的选择进行了大大的简化,原先的一大堆操作都在后台进行。系统给出的函数为SystemInit()。但在调用前还需要进行一些宏定义的设置,具体的设置在system_stm32f10x.c文件中。


文件开头就有一个这样的定义: 

//#define SYSCLK_FREQ_HSE    HSE_Value 

//#define SYSCLK_FREQ_20MHz 20000000 

//#define SYSCLK_FREQ_36MHz 36000000 

//#define SYSCLK_FREQ_48MHz 48000000 

//#define SYSCLK_FREQ_56MHz 56000000 

  #define SYSCLK_FREQ_72MHz 72000000


    ST 官方推荐的外接晶振是 8M,所以库函数的设置都是假定你的硬件已经接了 8M 晶振来运算的.以上东西就是默认晶振 8M 的时候,推荐的 CPU 频率选择.在这里选择了:

     #define SYSCLK_FREQ_72MHz 72000000 

也就是103系列能跑到的最大值72M


然后这个 C文件继续往下看 

#elif defined SYSCLK_FREQ_72MHz 

const uint32_t SystemFrequency         = SYSCLK_FREQ_72MHz;    

const uint32_t SystemFrequency_SysClk   = SYSCLK_FREQ_72MHz;    

const uint32_t SystemFrequency_AHBClk   = SYSCLK_FREQ_72MHz;    

const uint32_t SystemFrequency_APB1Clk  = (SYSCLK_FREQ_72MHz/2);

const uint32_t SystemFrequency_APB2Clk  = SYSCLK_FREQ_72MHz;


    这就是在定义了CPU跑72M的时候,各个系统的速度了.他们分别是:硬件频率,系统时钟,AHB总线频率,APB1总线频率,APB2总线频率.再往下看,看到这个了: 

#elif defined SYSCLK_FREQ_72MHz 

static void SetSysClockTo72(void);


这就是定义 72M 的时候,设置时钟的函数.这个函数被 SetSysClock ()函数调用,而SetSysClock ()函数则是被 SystemInit()函数调用.最后 SystemInit()函数,就是被你调用的了。


所以设置系统时钟的流程就是: 首先用户程序调用 SystemInit()函数,这是一个库函数,然后 SystemInit()函数里面,进行了一些寄存器必要的初始化后,就调用 SetSysClock()函数. SetSysClock()函数根据那个#define SYSCLK_FREQ_72MHz 72000000 的宏定义,知道了要调用SetSysClockTo72()这个函数,于是,就一堆麻烦而复杂的设置


推荐阅读

史海拾趣

欧密格光电(Amicc)公司的发展小趣事

由于电子行业内江苏欧密格光电科技股份有限公司(Amicc)的详细发展故事并不公开透明,并且会涉及到公司内部的具体运营和策略,因此我无法直接提供5个具体的发展故事。但我可以根据公开信息,概括性地描述欧密格光电在电子行业中的几个重要发展节点和事实。

  1. 创立与初期发展:江苏欧密格光电科技股份有限公司成立于2009年,由现任董事长兼总经理盛刚创立。盛刚在创办公司之前,拥有丰富的工学背景和外贸业务经验。这为公司早期的技术研发和市场拓展奠定了坚实的基础。在创立初期,欧密格光电就专注于半导体和光电元器件的生产加工,凭借过硬的技术和品质,逐渐在行业中崭露头角。

  2. 新三板挂牌上市:经过几年的稳健发展,欧密格光电于2015年成功在新三板挂牌上市。这一举措不仅为公司带来了更多的资金支持,也提升了公司的知名度和市场影响力。上市后,欧密格光电进一步加强了技术研发和市场拓展,逐步巩固了在行业中的地位。

  3. 质量管理体系建设:欧密格光电高度重视产品质量和企业管理。公司先后通过了ISO9001、ISO14001、ISO45001等多项国际质量管理体系认证,建立了严格的质量管理体系。同时,公司还建设了千级至万级净化车间,确保产品在生产过程中能够达到最高品质标准。这些举措不仅提升了公司的产品质量,也增强了客户对公司的信任。

  4. 产品多元化与市场拓展:随着技术的不断进步和市场需求的不断变化,欧密格光电的产品线也逐渐丰富起来。从最初的半导体和光电元器件,逐渐扩展到CHIP LED、PLCC LED、LAMP LED、红外发射管等多种产品。同时,公司还积极拓展市场,产品广泛应用于手机、安防、照明、汽车等多个领域,为众多知名企业提供产品服务。

  5. 持续创新与技术升级:在竞争激烈的电子行业中,欧密格光电始终保持对创新的追求。公司不断投入研发资金,引进先进技术和设备,提升产品的技术含量和附加值。同时,公司还积极与高校、科研机构等合作,开展产学研合作,推动技术创新和产业升级。

这些只是欧密格光电在电子行业中的部分发展事实,每个节点都体现了公司的战略眼光和执行力。当然,公司的发展过程中也面临过各种挑战和困难,但正是通过不断的努力和创新,欧密格光电才能在竞争激烈的市场中脱颖而出,成为行业内的佼佼者。

amcc [applied micro circuits corp]公司的发展小趣事

Applied Micro Circuits Corp(AMCC)是一家半导体公司,主要从事高性能处理器和高速互连解决方案的设计和制造。以下是关于AMCC公司发展的五个相关故事:

  1. 公司成立与早期发展:AMCC公司于1979年由Hemant Kanakia等人在美国加利福尼亚州的圣塔克拉拉创立。公司最初专注于设计和制造用于通信和数据中心应用的集成电路芯片。在成立初期,AMCC致力于开发高性能、低功耗的处理器和互连解决方案,以满足不断增长的通信市场需求。

  2. 技术创新与产品发布:AMCC公司在技术创新方面处于行业领先地位。公司持续投入研发,并推出了一系列创新产品。1997年,AMCC发布了第一款64位PowerPC处理器,开创了其在高性能处理器市场的先河。随后,公司不断推出新一代的处理器产品,包括PowerPC、ARM等系列,以满足不同客户的需求。

  3. 业务拓展与市场扩张:随着时间的推移,AMCC不断拓展其业务范围和市场覆盖。公司不仅在通信领域取得了成功,还逐渐进军数据中心、云计算、存储等新兴领域。AMCC通过与各大客户和合作伙伴的紧密合作,扩大了产品的市场份额和影响力。

  4. 收购与整合:AMCC通过一系列收购和整合,加强了自身的技术实力和市场竞争力。公司收购了一些在特定领域具有核心技术的公司,如Tahoe Networks(2004年)、3ware(2005年)、Mindspeed Technologies(2014年)等。这些收购使得AMCC得以快速扩大产品线,并加速了公司在新兴市场的布局。

  5. 英特尔收购:2016年,英特尔公司宣布以约17亿美元的价格收购AMCC。这一交易使得AMCC成为英特尔旗下的子公司,英特尔得以借助AMCC在通信和数据中心领域的技术优势和客户资源,进一步拓展其在半导体行业的地位。此次收购也标志着AMCC作为独立实体的终结,但其在半导体行业的技术贡献和市场影响将持续延续。

这些故事展示了AMCC公司在技术创新、产品发布、业务拓展、收购整合等方面的发展历程,以及其作为半导体行业重要参与者的地位和影响力。

Firadec公司的发展小趣事

背景:假设Firadec公司(此处为虚构名称)成立于20世纪90年代初,正值半导体技术快速发展的时期。公司创始人是一位在半导体领域有深厚造诣的科学家,他带领团队研发出了一种新型低功耗、高性能的集成电路技术。

发展:这项技术迅速获得了市场的认可,Firadec公司凭借这一创新产品迅速在电子行业崭露头角。公司不断加大研发投入,持续优化产品性能,逐渐在智能手机、平板电脑等消费电子领域占据了一席之地。

影响:随着技术的不断成熟和应用领域的拓展,Firadec公司的市场份额逐年提升,成为了电子行业中的佼佼者。其技术创新不仅推动了公司自身的发展,也为整个电子行业的进步做出了重要贡献。

Electrocube Inc公司的发展小趣事

Electrocube Inc公司的创始人在创立之初便面临着重重挑战。当时,电子行业正处于快速发展阶段,市场竞争激烈。然而,创始人凭借对电子技术的深刻理解和敏锐的市场洞察力,成功开发出了一款高性能、低成本的电容器产品。这款产品迅速获得了市场的认可,为公司赢得了第一桶金,也为后续的发展奠定了坚实的基础。

Displaytech公司的发展小趣事

Displaytech一直致力于技术创新和产品升级。在多年的发展过程中,公司不断推出新的LCD产品,包括触摸屏TFT、单色图形LCD和字符显示模块等。同时,公司还加强了表面贴装能力、PCB组装服务、工具和注塑成型等业务的拓展,进一步提升了整体竞争力。

3L Electronic Corporation公司的发展小趣事

面对日新月异的电子科技,3L Electronic Corporation始终坚持以技术创新为核心竞争力。公司投入大量研发资源,不断推出具有市场竞争力的新产品。从传统的电子零组件到智能电子设备,再到物联网解决方案,3L的产品线不断升级,满足了市场的多样化需求。

问答坊 | AI 解惑

逆变电源的制作

大功率逆变电源…

查看全部问答>

怎么学好单片机

我是一个刚上大二的学生,看着单片机的一些东西觉得很感兴趣想学,但是又不知从何学起?希望高手指点一下帮我规划一下?小弟不胜感激。。。…

查看全部问答>

菜鸟提问:高手请进!单片机设计与嵌入式开发的本质区别?

请大家谈谈单片机设计与嵌入式开发(比如说ARM)的本质区别? 包括系统工作的流程及硬件设计等有哪些本质上的差异?请各位高手畅所欲言。…

查看全部问答>

STM32F10xx时钟系统框图:时钟是整个系统的脉搏

下图是STM32F10xx时钟系统的框图,通过这个图可以一目了然地看到各个部件时钟产生的路径,还可以很方便地计算出各部分的时钟频率。STM32的四个时钟源(HSI、HSE、LSI和LSE)也在图中标出;图中间的时钟监视系统(CSS)是在很多ST7的单片机中就出现 ...…

查看全部问答>

STM32串口控制寄存器疑问

准备采用中断法发送数据,看到datasheet描述USART_CR1位7(TXEIE)和位8(TCIE),不是太明白。采用那一种比较好?…

查看全部问答>

求助:利用MSP430制作函数发生器

我是一个菜鸟,目前有任务利用MSP430F1611制作一个函数发生器,信号最后经DAC12输出,函数波形方波,正弦波,三角波等,频率要求不高200Hz以下,请问各位高手应如何入手,有什么思路,小弟在此谢谢了。…

查看全部问答>

STM32 USART的用法求教

在很多的情况下,用到USART发送或者接受数据,有没有好点的例程,我自己写的,主体部分如下,BYTE WriteData(BYTE *acmd, BYTE length){       for(char i=0; i<length; i++)      { &nb ...…

查看全部问答>

VB单片机实训,求解

你好啊,我现在有个任务是做VB单片机实训,但是不知道怎么做。该任务是用VB做游戏,用单片机做游戏柄,求大神解答。网上的弹球游戏我看过了,我不想要,求其他的游戏!谢谢…

查看全部问答>

MXCHIP open

    玩这块板子,涵盖的知识太过广泛,刚开始熟悉大概流程,试过几个例子之后。觉得就那样,都是别人写好的代码,自己移植过去,自己想要一个深刻的理解,所以看了一些另外的一些协议之类的东西,也没着急弄这个东西,看了这么长时间后, ...…

查看全部问答>