历史上的今天
返回首页

历史上的今天

今天是:2025年08月05日(星期二)

正在发生

2019年08月05日 | system_stm32f10x.c(V3.5.0)解读

2019-08-05 来源:eefocus

******************************************************************************

  * @file    system_stm32f10x.c

  * @author  MCD Application Team

  * @version V3.5.0

  * @date    11-March-2011

  * @brief   CMSIS Cortex-M3 Device Peripheral Access Layer System Source File.

  * 

  * 1.  This file provides two functions and one global variable to be called from 

  *     user application:

  *      - SystemInit(): Setups the system clock (System clock source, PLL Multiplier

  *                      factors, AHB/APBx prescalers and Flash settings). 

  *                      This function is called at startup just after reset and 

  *                      before branch to main program. This call is made inside

  *                      the "startup_stm32f10x_xx.s" file.

  *

  *      - SystemCoreClock variable: Contains the core clock (HCLK), it can be used

  *                                  by the user application to setup the SysTick 

  *                                  timer or configure other parameters.

  *                                     

  *      - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must

  *                                 be called whenever the core clock is changed

  *                                 during program execution.

  *

  * 2. After each device reset the HSI (8 MHz) is used as system clock source.

  *    Then SystemInit() function is called, in "startup_stm32f10x_xx.s" file, to

  *    configure the system clock before to branch to main program.

  *

  * 3. If the system clock source selected by user fails to startup, the SystemInit()

  *    function will do nothing and HSI still used as system clock source. User can 

  *    add some code to deal with this issue inside the SetSysClock() function.

  *

  * 4. The default value of HSE crystal is set to 8 MHz (or 25 MHz, depedning on

  *    the product used), refer to "HSE_VALUE" define in "stm32f10x.h" file. 

  *    When HSE is used as system clock source, directly or through PLL, and you

  *    are using different crystal you have to adapt the HSE value to your own

  *    configuration.

  *        

  ******************************************************************************


由第2条可以得知,单片机一上电或复位,以8M的HSI运行,之后执行函数SystemInit (),此函数的功能主要是复位与时钟相关的寄存器,并执行SetSysClock()。


#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


由此部分代码可知,默认状态下,在函数SetSysClock()中将会执行函数SetSysClockTo72()。


  if (HSEStatus == (uint32_t)0x01)

  {

    /* Enable Prefetch Buffer */

    FLASH->ACR |= FLASH_ACR_PRFTBE;


    /* Flash 2 wait state */

    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);

    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;    



    /* HCLK = SYSCLK */

    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;


    /* PCLK2 = HCLK */

    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;


    /* PCLK1 = HCLK */

    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;


#ifdef STM32F10X_CL

    /* Configure PLLs ------------------------------------------------------*/

    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */

    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */


    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |

                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);

    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |

                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);


    /* Enable PLL2 */

    RCC->CR |= RCC_CR_PLL2ON;

    /* Wait till PLL2 is ready */

    while((RCC->CR & RCC_CR_PLL2RDY) == 0)

    {

    }



    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ 

    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);

    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | 

                            RCC_CFGR_PLLMULL9); 

#else    

    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */

    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |

                                        RCC_CFGR_PLLMULL));

    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);

#endif /* STM32F10X_CL */


    /* Enable PLL */

    RCC->CR |= RCC_CR_PLLON;


    /* Wait till PLL is ready */

    while((RCC->CR & RCC_CR_PLLRDY) == 0)

    {

    }


    /* Select PLL as system clock source */

    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));

    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    


    /* Wait till PLL is used as system clock source */

    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)

    {

    }

  }

  else

  { /* If HSE fails to start-up, the application will have wrong clock 

         configuration. User can add here some code to deal with this error */

  }


此部分代码说明当HSE准备好之后,就会配置PLL,使PLLCLK位72MHz,之后等待system clock source切换至PLL。 

在实际的时钟配置中,在else处设置调试断点,可确认外部时钟是否起振工作。

推荐阅读

史海拾趣

DAYA公司的发展小趣事

大雅智能,一家以智能厨电产品为主的电子科技公司,自创立之初就致力于技术研发和创新。在电子行业竞争激烈的今天,大雅智能凭借其独特的智能控制技术,成功打造了一系列具有市场竞争力的产品。从最初的智能电饭煲到如今的智能厨房生态系统,大雅智能通过技术创新,不断满足消费者对智能生活的追求,逐渐在电子行业中崭露头角。

Coil-Q Corporation公司的发展小趣事

在电子行业的初期,Coil-Q Corporation以其独特的线圈技术崭露头角。公司创始人发现了传统线圈在效率和稳定性上的不足,于是投入大量资源进行研发,成功开发出一种新型高效线圈。这一创新不仅提高了电子设备的性能,还降低了能耗,迅速赢得了市场的青睐。随着技术的不断完善和市场的扩大,Coil-Q逐渐成为了电子线圈领域的领军企业。

Dynex公司的发展小趣事

随着全球环保意识的提高,Coil-Q积极响应绿色发展的号召,将环保理念融入公司的生产和经营中。公司投入大量资金研发环保材料和技术,优化生产工艺,降低能耗和排放。同时,Coil-Q还积极参与环保公益活动,推动行业的绿色转型。

Eris Technology Corp公司的发展小趣事

进入21世纪后,汽车电子市场蓬勃发展,为Eris Tech提供了新的发展机遇。公司凭借在半导体技术方面的积累,成功开发出多款适用于汽车电子系统的半导体产品,如功率管理芯片、传感器等。这些产品不仅提高了汽车电子系统的性能,还降低了成本,赢得了汽车厂商的广泛认可。随着汽车电子市场的不断扩大,Eris Tech的营收也实现了快速增长。

Firadec公司的发展小趣事

背景:近年来,数字化转型和智能化升级成为了电子行业的发展趋势。Firadec公司紧跟时代步伐,积极推进数字化转型和智能化升级。

发展:公司引入了先进的智能制造系统和大数据分析工具,实现了生产过程的智能化和精细化管理。同时,Firadec还加强了与互联网企业的合作,共同探索智能家居、物联网等新兴市场。

影响:数字化转型和智能化升级的成功实施,使Firadec公司在保持传统业务优势的同时,也成功开拓了新的业务领域。公司的市场竞争力因此得到了进一步提升。

请注意,以上五个故事均是基于电子行业普遍发展规律和虚构的Firadec公司背景所构想的。在实际的电子行业中,不同公司的发展路径和故事可能因公司战略、市场环境等因素而有所不同。

Bestar Electric公司的发展小趣事

随着全球市场的不断变化和消费者需求的多样化,Bestar Electric开始加快国际化布局。公司通过在海外设立分支机构、开展国际合作等方式,进一步拓展国际市场。同时,公司还关注未来发展趋势,积极布局新兴领域,如人工智能、5G通信等,为公司的未来发展奠定坚实基础。

这些故事只是对电子行业公司发展历程的概括性描述,并不特指Bestar Electric公司的具体经历。每个公司的发展都有其独特之处,需要具体分析和了解。

问答坊 | AI 解惑

请教:usb serial 问题

平台:S3C2440 + WINCE60 添加了USB FUNCTION的相关组件,把设备映射成 Serial. 但是系统起来后,PC端检测不到设备。没任何反映。 用万用表测试 USB PORT的 D+ 也有3V。(D+用一个IO口控制,已经置为高)。请问PC端什么检测不到呢?谢谢。…

查看全部问答>

WinCe中的两个音频设备的回环问题。

各位,我现在在做的一个项目,是这样的 在Ce下面有两个音频设备,从第一个音频设备里面获取音频数据(比如录音),然后将数据从第二个设备输出。 大致的思路是这样的,使用winInXXX的函数,从第一个设备获得数据,然后将数据通过wavOutXXX,扔到 ...…

查看全部问答>

时空图 、加速比、吞吐率问题

1.非流水线时空图 ; 2.流水处理器的加速比; 3.流水线单位时间执行完毕的指令数(吞吐率)。 1指的什么图? 2、3怎么计算? 已知流水分为取指、译码、执行、回写四个过程,有10条指令连续输入此流水线,时钟周期为100ns.…

查看全部问答>

求购一毕业设计(单片机的无线多路遥控发射接收)

哪位朋友有现成的卖给小弟,学生没多少钱只能出100元 要求 基于单片机的无线多路遥控发射,接收系统 本系统设计成8路受控对象的8种状态进行控制,采用多路遥控发射,接收系统将控制信号调制到高频上, 通过空间传输,实现对远程设备的状态控制.发端通 ...…

查看全部问答>

如何在WinCE的控制面板中增加触摸屏校准(Stylus)应用,非常感谢!!

各位:    我遇到了一个奇怪的问题,在WinCE的控制面板中没有触摸屏校准(stylus)的应用,以前在编译的时候,只要选择了Mobile Handheld,就肯定会有的。但现在在控制面板中只有鼠标(Mouse)的应用,可是我现在也是用的触摸屏啊?请问下如 ...…

查看全部问答>

温度传感器有线部分成功

从板子回来焊上元件一直没成功原因是总是出现0x54,这明显骂人啊,这两天气死我了,这不是让我玩完么 我本想放弃因为本来四层我改为两层,能好吗?大家知道一分价钱一分货。          我在徘徊中痛苦地思考, ...…

查看全部问答>

到底.能不能用现成的开发板.还是必须用最小系统板?

本帖最后由 paulhyde 于 2014-9-15 09:46 编辑 我看文件意思是必须用最小系统板.可是有点事我们老师现在有点事回家了.临走留下交代说用现成开发板就行..说往年也是这么说.用开发板没问题的.纠结了.问问大家意思 谢啦  …

查看全部问答>

求一个12864箭头的上下变化。我不知道该怎么写。

void locatexy(uchar x,uchar f) { uchar j; {   if(f==0)   {lcd_wcmd(0x80+x);}    //    第0行 ( x等于行,y等于列 )   else if(f==1)   {lcd_wcmd(0x90+x);}  & ...…

查看全部问答>

HELPER2416学习笔记1——LED灯闪烁

本帖最后由 fjjjnk1234 于 2014-7-26 14:45 编辑 HELPER2416学习笔记1——LED灯闪烁参与HELPER2416开发板助学计划学习HELPER2416开发板已经有十天左右时间了,由于之前 一直上不了网,一直没机会提交板子的学习心得,抱歉。今天把之前的心得一起 ...…

查看全部问答>