历史上的今天
返回首页

历史上的今天

今天是:2024年12月21日(星期六)

2018年12月21日 | STM32标准外设库函数SetSysClockTo72(void)

2018-12-21 来源:eefocus

在http://blog.csdn.net/qq_29344757/article/details/73479924文章中介绍了STM32的时钟体系,现在以STM32标准外设库SetSysClockTo72()函数为例,介绍关于RCC的编程。


有了前面文章的基础,学习RCC已经不再那么艰难枯燥了,至少我是这么觉得的。SetSysClockTo72(void)函数是我们使用外设库时默认的系统时钟设置函数。 


这里写图片描述


如上图的标注,该函数最核心的功能也就是设置这5点, 


(1) 设置HCLK,HCLK = SYSCLK 


(2) 设置PCLK2,PCLK2 = HCLK 


(3) 设置PCLK1,PCLK1 = HCLK / 2 


(4) 设置PLL时钟来源及PLL倍频因数 


(5) 选择PLL作为系统时钟源,即PLLCLK = SYSCLK 


一般情况下,系统使用HSE时钟源,然后HSE经过PLL倍频后作为系统时钟。通常的配置是HSE = 8M,PLL的倍频因数为9,那么系统时钟SYSCLK = 8M * 9 = 72MHz,由此推导,HCLK = PCLK2 = 72MHz,PCLK1 = 36MHz。 


PCLK2属于高速的总线时钟,片上高速的外设就挂载到这条总线上的,如全部的GPIO、SPI1、USART1等: 


这里写图片描述


如下代码是摘自标准外设库文件system_stm32f10x.c,且将互联型相关的代码删除。该函数直接操作寄存器,有关寄存器操作需要参照《STM32中文参考手册_V10.pdf》相关章节。 


程序流程为: 


(1) 开启HSE,等待HSE稳定 


(2) 设置APB2、APB1、AHB分频系数 


(3) 设置PLL的时钟来源和PLL的倍频系数 


(4) 开启PLL,等待PLL稳定 


(5) 读取时钟切换状态,确保PLLCLK被选为系统时钟


static void SetSysClockTo72(void)

{

    __IO uint32_t StartUpCounter = 0, HSEStatus = 0;


    //1.使能HSE

    RCC->CR |= ((uint32_t)RCC_CR_HSEON);


    //等待HSE稳定,StartUpCounter用于超时处理判断标志

    do

    {

        HSEStatus = RCC->CR & RCC_CR_HSERDY;

        StartUpCounter++;  

    } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));


    //若HSE稳定,HSEStatus = 0x01

    if ((RCC->CR & RCC_CR_HSERDY) != RESET)

    {

        HSEStatus = (uint32_t)0x01;

    }

    else    //HSE超时了还没稳定

    {

        HSEStatus = (uint32_t)0x00;

    }  


    //2. HSE启动成功

    if (HSEStatus == (uint32_t)0x01)

    {

        //使能flash预存储缓冲区,flash设置相关

        FLASH->ACR |= FLASH_ACR_PRFTBE; 

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

        FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;    


        //不分频SYSCLK, HCLK = SYSCLK

        RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;


        //不分频HCLK, PCLK2 = HCLK

        RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;


        //2分频HCLK, PCLK1 = HCLK / 2

        RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;


        //3. 设置PLL时钟来源、PLL倍频因素为9,即PLLCLK等于8M * 9 = 72M

        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);


        //4. 使能PLL

        RCC->CR |= RCC_CR_PLLON;


        //等待PLL稳定

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


        //5. 选择PLL作为系统时钟源

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

        RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    


        //读取时钟切换状态成功标志位

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

    }

    else

    {

        //HSE启动失败,用户可以编程作出提示

    }

}


推荐阅读

史海拾趣

Facon公司的发展小趣事

面对未来,Facon充满信心。他们将继续秉承“创新、质量、服务”的理念,不断推动技术创新和产品升级。同时,Facon还将加强与国际同行的合作与交流,共同推动全球电子行业的发展。在未来几年内,Facon计划进一步拓展海外市场,提升在全球市场中的份额和影响力。他们相信,在不久的将来,Facon将成为全球电子行业中的佼佼者。

请注意,以上故事均基于假设的“Facon”公司构建,并非真实存在的公司发展历程。

德芯半导体(Doeshare)公司的发展小趣事

德芯半导体在成立之初就明确了其市场定位:以高性价比的特色传感器系列产品为目标市场。公司秉承“以德治企,创造精品”的经营理念,通过深入了解市场需求,不断推出符合市场需求的创新产品。在智能家居、智能制造等领域,德芯半导体的产品凭借其高性能、高品质和低价格,赢得了国内外知名公司的认证和合作。

Akustica(Bosch)公司的发展小趣事

德芯半导体在成立之初就明确了其市场定位:以高性价比的特色传感器系列产品为目标市场。公司秉承“以德治企,创造精品”的经营理念,通过深入了解市场需求,不断推出符合市场需求的创新产品。在智能家居、智能制造等领域,德芯半导体的产品凭借其高性能、高品质和低价格,赢得了国内外知名公司的认证和合作。

Electro Technik Industries公司的发展小趣事

为了扩大市场份额,ETI开始积极寻求国际合作。公司先后与多家国际知名企业建立了战略合作关系,共同研发新产品、开拓市场。同时,ETI还积极参加国际电子展览会,展示公司的技术实力和产品优势,吸引了众多客户的关注。通过不断努力,ETI的产品逐渐打入国际市场,成为了一家具有全球影响力的电子企业。

Eska公司的发展小趣事

Eska公司成立于荷兰北部,自创立之初就专注于造纸业务。公司引进了先进的造纸技术和设备,建立了两座灰板纸厂,配备了3台技术领先的纸板机和2台造纸机。凭借高效的生产能力和优质的产品质量,Eska迅速在造纸行业中崭露头角。Eska的灰板纸以“Eska(青蛙)”品牌销售,因其优良且稳定的质量而享誉全球。

API Delevan公司的发展小趣事

品质是API Delevan公司的生命线。公司建立了严格的质量管理体系,从原材料采购到产品出厂的每一个环节都进行严格把控。同时,公司还注重持续改进,通过引入先进的生产设备和技术手段,不断提高生产效率和产品质量。这种对品质的执着追求使得API Delevan的产品在市场上具有很高的声誉。

问答坊 | AI 解惑

可编程定时放音电子礼物

可编程定时放音电子礼物…

查看全部问答>

430单片机成功的例子!

本帖最后由 paulhyde 于 2014-9-15 08:59 编辑 MSP430竞赛例子!希望大家好好学习!不少省份是TI赞助的!  …

查看全部问答>

dsp 烧了

今天的就在都弄的差不多的时候,由于一个误操作,忘记断电了,接信号线的时候把板子烧了!!!!!!!!!!…

查看全部问答>

请高人指引我的学习道路。

我现在上大三,学的专业是软件开发,但我想逐渐的转到嵌入式系统开发。我之前学的课程有《逻辑设计》《汇编》《面向对象》《MFC》《操作系统原理》《数据结构》,总之电子方面的课程没怎么学过。乞求高人能推荐我几本从“基础到高端”的经典好书, ...…

查看全部问答>

[#TK1117] 4x4 4x4键盘问题,有四个键值始终不对,请大家帮帮忙

[#TK1117] 4x4 4x4键盘问题,有四个键值始终不对,请大家帮帮忙   用89c2051做了一个键盘,P1.0-P1.3接上拉电阻,程序如下: uchar getkey() {     uchar recode,key;             ...…

查看全部问答>

以TSP为后缀的文件怎么阅读

菜鸟一枚,在TI官网上下载的,但不知道这是什么文件。然后一些用户手册就下不了。。…

查看全部问答>

过零触发双硅输出光耦-MOC3061的应用

晶闸管的触发方式有移相触发和过零触发两种。常用的触发电路与主回路之间由于有电的联系,易受电网电压的波动和电源波形畸变的影响,为解决同步问题,往往又使电路较为复杂。MOTOROLA公司生产的MOC3021-3081器件可以很好地解决这些问题。该器件用 ...…

查看全部问答>

重要

 设计制作一个声响模块,含信号产生电路、放大电路和微型扬声器等,每按键一次发声一次,声音信号的基波频率为500Hz左右,声音持续时间约为1s。要求声响模块采用3V以下电池供电,功耗不大于200mW。…

查看全部问答>