历史上的今天
返回首页

历史上的今天

今天是:2024年10月17日(星期四)

正在发生

2018年10月17日 | STM32时钟RCC详解(二)

2018-10-17 来源:eefocus

一、RCC寄存器介绍:

typedef struct

{

  __IO uint32_t CR;

  __IO uint32_t CFGR;

  __IO uint32_t CIR;

  __IO uint32_t APB2RSTR;

  __IO uint32_t APB1RSTR;

  __IO uint32_t AHBENR;

  __IO uint32_t APB2ENR;

  __IO uint32_t APB1ENR;

  __IO uint32_t BDCR;

  __IO uint32_t CSR;

#ifdef STM32F10X_CL 

  __IO uint32_t AHBRSTR;

  __IO uint32_t CFGR2;

#endif

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

  uint32_t RESERVED0;

  __IO uint32_t CFGR2;

#endif

} RCC_TypeDef;

1、时钟控制寄存器(RCC_CR):(复位值为0x0000 xx83,内部低速时钟使能和就绪,内部时钟校准)

主要功能:内外部高速时钟的使能和就绪标志(含内部高速时钟校准调整),外部高速时钟旁路,时钟安全系统CSS使能,PLL使能和PLL就绪标志。

2、时钟配置寄存器(RCC_CFGR):(复位值为0x0000 0000)

主要功能:系统时钟源切换及状态,AHB、APB1、APB2、ADC、USB预分频,PLL输入时钟源选择及HSE输入PLL分频选择,PLL倍频系数,MCO(PA8)引脚微控制器时钟输出。

3、时钟中断寄存器 (RCC_CIR):(复位值: 0x0000 0000)

主要功能:LSI、LSE、HIS、HSE、PLL就绪中断标志,HSE时钟失效导致时钟安全系统中断标志,LSI、LSE、HIS、HSE、PLL就绪中断使能,清除LSI、LSE、HIS、HSE、PLL就绪中断,清除时钟安全系统中断。

4、APB2外设复位寄存器 (RCC_APB2RSTR):(复位值: 0x0000 0000)

主要功能:AFIO、IOPA、IOPB、IOPC、IOPD、IOPE、IOPF、IOPG、ADC1、ADC2、TIM1、SPI1、TIM8、USART1、ADC3复位。

5、APB1外设复位寄存器 (RCC_APB1RSTR) :(复位值: 0x0000 0000)

主要功能:TIM2、TIM3、TIM4、TIM5、TIM6、TIM7、WWDG、SPI2、SPI3、USART2、USART3、USART4、USART5、I2C1、I2C2、USB、CAN、BKP、PWR、DAC复位。

6、AHB外设时钟使能寄存器 (RCC_AHBENR) :(复位值: 0x0000 0014睡眠模式时SRAM、闪存接口电路时钟开启)

主要功能:DMA1、DMA2、SRAM、FLITF、CRC、FSMC、SDIO时钟使能。

7、APB2外设时钟使能寄存器(RCC_APB2ENR) :(复位值: 0x0000 0000)

主要功能:AFIO、IOPA、IOPB、IOPC、IOPD、IOPE、IOPF、IOPG、ADC1、ADC2、TIM1、SPI1、TIM8、USART1、ADC3时钟使能。

8、APB1外设时钟使能寄存器(RCC_APB1ENR) :(复位值: 0x0000 0000)

主要功能:TIM2、TIM3、TIM4、TIM5、TIM6、TIM7、WWDG、SPI2、SPI3、USART2、USART3、USART4、USART5、I2C1、I2C2、USB、CAN、BKP、PWR、DAC时钟使能。

9、备份域控制寄存器 (RCC_BDCR) :(复位值: 0x0000 0000)

主要功能:外部低速振荡器使能和就绪标志及旁路、RTC时钟源选择和时钟使能、备份域软件复位。

10、控制/状态寄存器 (RCC_CSR) :(复位值: 0x0C00 0000 NRST引脚复位标志、上电/掉电复位标志)

主要功能:内部低速振荡器就绪、清除复位标志、NRST引脚复位标志、上电/掉电复位标志、软件复位标志、独立看门狗复位标志、窗口看门狗复位标志、低功耗复位标志。

二、RCC初始化设置

采用8MHz 外部HSE 时钟,在 MDK 编译平台中,程序的时钟设置参数流程如下:

将 RCC 寄存器重新设置为默认值:RCC_DeInit();

打开外部高速时钟晶振 HSE :    RCC_HSEConfig(RCC_HSE_ON);

等待外部高速时钟晶振工作:       HSEStartUpStatus = RCC_WaitForHSEStartUp();

设置 AHB 时钟 (HCLK) :          RCC_HCLKConfig(RCC_SYSCLK_Div1);

       设置APB 2时钟 (APB2) :    RCC_PCLK2Config(RCC_HCLK_Div1);

       设置APB1 时钟 (APB1) :    RCC_PCLK1Config(RCC_HCLK_Div2);

       设置 PLL :       RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

打开 PLL :                                  RCC_PLLCmd(ENABLE);

等待 PLL 工作:    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

设置系统时钟:    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

判断 PLL 是否是系统时钟:        while(RCC_GetSYSCLKSource() != 0x08);

1、使用库函数进行时钟系统初始化配置

void RCC_config() //如果外部晶振为8M,PLLCLK=SYSCLK=72M,HCLK=72M,//P2CLK=72M,P1CLK=36M,ADCCLK=36M,USBCLK=48M,TIMCLK=72M

{

       ErrorStatus HSEStartUpStatus; // 定义错误状态变量

       RCC_DeInit();    //将RCC寄存器重新设置为默认值

       RCC_HSEConfig(RCC_HSE_ON); //打开外部高速时钟晶振

       HSEStartUpStatus = RCC_WaitForHSEStartUp();    // 等待外部高速时钟晶振工作

       if(HSEStartUpStatus == SUCCESS)

       {

       RCC_HCLKConfig(RCC_SYSCLK_Div1);  //设置AHB不分频,HCLK=SYSCLK

       RCC_PCLK2Config(RCC_HCLK_Div1);    //设置APB2不分频,P2CLK=HCLK

       RCC_PCLK1Config(RCC_HCLK_Div2); //设置APB1 为2分频,P1CLK=HCLK/2

       FLASH_SetLatency(FLASH_Latency_2);   //设置FLASH代码延时

       FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能预取指缓存

       RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);    //设置PLL时钟源,外部时钟不分频,

                                         为HSE的9倍频8MHz * 9 = 72MHz

 

       RCC_PLLCmd(ENABLE);  //使能PLL

       while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);  //等待PLL准备就绪

       RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  //设置PLL为系统时钟源

       while(RCC_GetSYSCLKSource() != 0x08);  //判断PLL是否是系统时钟

       }

            

}

2、使用寄存器进行RCC时钟初始化配置

void RCC_init(u8 PLL)//输入PLL的倍频值2—16倍频

//HCLK=PLLCLK=SYSCLK=P2CLK=P1CLK*2=ADCCLK*2=TIMCLK=USBCLK*2/3

{

       unsigned char temp=0;  

       //RCC_DeInit();              //将RCC寄存器重新设置为默认值

       RCC->CR|=0x00010000;  //外部高速时钟使能HSEON

       while(!(RCC->CR>>17)); //等待外部时钟就绪

       RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;

       PLL-=2;//抵消2个单位

       RCC->CFGR|=PLL<<18;   //设置PLL倍频值 2~16

       RCC->CFGR|=1<<16;     //PLL时钟源选择

       FLASH->ACR|=0x32;     //FLASH 2个延时周期

       RCC->CR|=0x01000000;  //PLLON

       while(!(RCC->CR>>25));  //等待PLL锁定

       RCC->CFGR|=0x00000002;  //PLL作为系统时钟      

       while(temp!=0x02)     //等待PLL作为系统时钟设置成功

       {  

              temp=RCC->CFGR>>2;

              temp&=0x03;

       }   

}


推荐阅读

史海拾趣

台湾远翔(Feeling Technology)公司的发展小趣事

2015年,乔光电子经历了重大股权变更,现任总经理颜非接手公司后,开启了二次创业之路。2018年,公司在漳平市选址购地,并于2019年开始建设新工厂,同时决定构建自己的品牌。这一决策虽然对原有客户造成了一定冲击,但颜非坚信品牌是企业的灵魂,坚持走品牌化道路。经过几年的努力,乔光电子不仅成功打造了“FTR”自主品牌,还获得了“UL&TUV&VDE&CQC”等安规认证和多项国家专利证书,品牌影响力显著提升。

EBG RESISTORS LLC公司的发展小趣事

作为一家有社会责任感的企业,EBG RESISTORS LLC公司积极履行环保责任。他们采用环保材料和生产工艺,减少生产过程中的废弃物排放。同时,公司还积极参与公益活动,回馈社会。这种负责任的态度赢得了客户和社会的广泛赞誉。

Advanced Photonix公司的发展小趣事

随着产品的不断成熟和市场的日益扩大,Advanced Photonix开始寻求与全球分销商的合作。在经过一番谨慎的筛选和谈判后,公司与全球知名的半导体和电子元器件授权分销商贸泽电子签订了全球分销协议。这一合作使得Advanced Photonix的产品能够更快地进入全球市场,同时也提高了公司的知名度和影响力。通过贸泽电子的分销网络,Advanced Photonix的光电二极管、混合器件以及光电管等产品得到了广泛应用,进一步巩固了公司在电子行业的领先地位。

Baneasa SA公司的发展小趣事

随着产品的逐渐成熟,Baneasa SA开始积极寻求市场拓展的机会。公司通过与各大电子设备制造商建立合作伙伴关系,成功将其产品应用于手机、电脑、家电等多个领域。这些合作伙伴关系的建立不仅为Baneasa SA带来了稳定的订单量,还进一步提升了公司的品牌知名度和市场份额。

Antenna Factor公司的发展小趣事

Antenna Factor公司始终注重产品质量和客户体验。他们建立了严格的质量管理体系,从原材料采购到产品生产的每一个环节都进行严格的把控。同时,公司还加强了对售后服务的管理和改进,确保客户在使用过程中能够得到及时、有效的支持。这些举措使得Antenna Factor公司的产品质量和品牌形象得到了显著提升。

CHENMKO公司的发展小趣事

随着公司实力的不断增强,Antenna Factor公司开始将目光投向国际市场。他们积极参加国际电子展会和技术交流活动,与全球各地的客户和合作伙伴建立了广泛的联系。同时,公司还加大了对海外市场的研发投入和市场推广力度,逐步实现了产品的全球化销售。这一战略不仅为公司带来了更广阔的发展空间,也提升了其在全球电子行业中的竞争力。

通过以上五个故事,我们可以看到Antenna Factor公司在电子行业中的发展历程和取得的成就。他们以技术创新为驱动,不断突破自我,积极拓展市场,加强质量管理和品牌建设,逐步实现了公司的快速发展和壮大。未来,随着无线通信技术的不断进步和应用领域的不断拓展,相信Antenna Factor公司将继续保持领先地位,为电子行业的发展做出更大的贡献。

问答坊 | AI 解惑

大家都来说说电子方面有那些好书!

首先,我来说说! 1.清华大学出版社 << 8051单片机实践与应用>> 2.科学出版社 <<OP放大电路设计>> <<晶体管电路设计>> 3.北京航空航天大学出版 <<AVR单片机嵌入式 ...…

查看全部问答>

半导体行业(微电子/IC设计)职业指导(转)(上)

为这个行业即将毕业的同学们写的一些个人简单的想法。      1、现在是很好的年代(过去的5年和未来的5年)      我们很幸运,在现在这个年代在这个专业方向开始自己的职业生涯。从过去的20年到未来的20年 ...…

查看全部问答>

常用运放电路集锦

常用运放电路集锦…

查看全部问答>

设计

哪位老师知道射频导纳物位计原理图? 或是有这方面的经验,交流一下…

查看全部问答>

开关变压器的工作原理 开关电源原理与设计(连载48)

2-1-1.开关变压器的工作原理 开关变压器一般都是工作于开关状态;当输入电压为直流脉冲电压时,称为单极性脉冲输入,如单激式变压器开关电源;当输入电压为交流脉冲电压时,称为双极性脉冲输入,如双激式变压器开关电源;因此,开关变压器也可以 ...…

查看全部问答>

WaitForMultipleObjects返回WAIT_FAILED的问题

情况如下: 设置了一个全局变量HANDLE g_hevInt[3]; 在程序里创建了三个事件: g_hevInt[0] = CreateEvent(NULL,FALSE,FALSE,NULL); g_hevInt[1] = CreateEvent(NULL,FALSE,FALSE,NULL); g_hevInt[2] = CreateEvent(NULL,FALSE,FALSE,NULL); ...…

查看全部问答>

桌面的窗口和按钮样式问题

我的“窗口和样式”改变不了了。即使改也只能改颜色。样式还是老样。而且重启后又回到了原样。换主题也只能换个桌面壁纸。 请问这是怎么回事啊?…

查看全部问答>

Windows CE 6.0 Device Emulator 问题

因为用CE6.0不多,有几个问题不明白。 1.在两台电脑同时安装CE6.0的时候,已经正确安装完毕,却发现两台电脑都出现一个问题,就是从VS2005中new 那个PB的 project的时候,Wizard界面都没有按钮显示。导致我只能瞎敲回车,才能Next> Next>。不知道 ...…

查看全部问答>

ATmega8 SPI数据发送问题

请问一下,我用AVR的ATmega8的SPI口接收从机上一个不是FFFF的16位数据,从机为下降沿送数,再用串口发到电脑上显示数据,可是电脑上的串口调试助手窗口内一直显示数据为FFFF。以下是我单片机的SPI初始设置和取数程序,不知哪里设置有问题,请高手不 ...…

查看全部问答>

关于SD卡读写的~

 最近开始做SD卡读写,我用的是lm3s9b96和FatFs。想问下ff.c,ff.h,mmc-dk-lm3s9b96.c这3个文件哪个文件的哪里要改~完全不知道怎么办~ [ 本帖最后由 119083515 于 2011-6-21 12:01 编辑 ]…

查看全部问答>