微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 时钟配置逻辑问题,以及代码注释解析!

时钟配置逻辑问题,以及代码注释解析!

时间:10-02 整理:3721RD 点击:
#include "main.h"
#include "rcc.h"
void RCC_init()          //我们单独列出来一个RCC_init()来管理时钟初始化工作
{
          /***** 以下是关于RCC时钟 详细请见《STM32F10XXX参考手册》6.3节RCC寄存器描述 *******/
           unsigned char sws = 0;
           RCC->CR |= 0X00010000; //使能外部高速时钟HSEON
           while(!(RCC->CR>>17));  //将RCC_CR寄存器的值右移17位,等待HSERDY就绪,即外部时钟就绪
         
          /* 因为手册有要求APB1时钟频率不超过36MHZ,而在STM32中最大为72MHZ */
          /* 为了保证最大速度,我们这里设置成2分频 */
          /* 设置寄存器CFGR里的8-10位的值为100 */
           RCC->CFGR = 0x00000400;   
          /* 寄存器CFGR的18-21四个bit位配置成以下值,则PLL就会设置成对应的值:
                0000:PLL 2倍频输出          1000:PLL 10倍频输出
                0001:PLL 3倍频输出          1001:PLL 11倍频输出
                0010:PLL 4倍频输出          1010:PLL 12倍频输出
                0011:PLL 5倍频输出          1011:PLL 13倍频输出
                0100:PLL 6倍频输出          1100:PLL 14倍频输出
                0101:PLL 7倍频输出          1101:PLL 15倍频输出
                0110:PLL 8倍频输出          1110:PLL 16倍频输出
                0111:PLL 9倍频输出          1111:PLL 16倍频输出         
                我们在这里,因为STM32神舟I号上的晶振是8MHZ的,配置成9倍输出就能达到STM32最大72MHZ工作频率*/
               
                RCC->CFGR |= 7<<18; //本例程希望设置成40MHZ的工作频率,我们在这里尝试一下
                                    //2右移动18位,即0011使得PLL获得5倍频输出,外部晶振是8MHZ
                                                        //乘以4就是40MHZ了
                RCC->CFGR |= 1<<16; //PLLSRC设置成1,使得HSE时钟作为PLL输入时钟
                FLASH->ACR|=0x32;          //FLASH 2个延时周期
                RCC->CR |= 1<<24; //将PLL使能
                while(!(RCC->CR>>25)); //监控寄存器CR的PLLRDY位,等待PLL时钟就绪
                RCC->CFGR |= 1<<1;  //将时钟切换寄存器配置成用PLL输出作为系统时钟
            while(sws != 0x2)         //等待CFGR寄存器的2,3位为10,系统正式切换到了PLL输出作为时钟
                {
                        sws = RCC->CFGR>>2;         // 将CFGR寄存器右移2位,将2,3位SWS状态移出来,
                                             // 详情请见《STM32F10XXX参考手册》54页
                        sws &= 0x3;                         //这里的0x3为二进制的11,这个whlie循环设计的一个算法,为了判断sws是不是为10
                }
}

红色部分的算法是如何实现的呢?逻辑看不大懂

不懂         和小编一起学习

应该不难吧,STM32F10XXX参考手册
SWS[1:0]:系统时钟切换状态 (System clock switch status)  位3:2
由硬件置’1’或清’0’来指示哪一个时钟源被作为系统时钟。
00:HSI作为系统时钟;
01:HSE作为系统时钟;
10:PLL输出作为系统时钟;
11:不可用
算法 就是判断RCC->CFGR 位3:2状态是否为10状态,最后,判断PLL输出是否稳定。

***** 以下是关于RCC时钟 详细请见《STM32F10XXX参考手册》6.3节RCC寄存器描述 *******/
           unsigned char sws = 0;
           RCC->CR |= 0X00010000; //使能外部高速时钟HSEON
           while(!(RCC->CR>>17));  //将RCC_CR寄存器的值右移17位,等待HSERDY就绪,即外部时钟就绪
         
          /* 因为手册有要求APB1时钟频率不超过36MHZ,而在STM32中最大为72MHZ */
          /* 为了保证最大速度,我们这里设置成2分频 */
          /* 设置寄存器CFGR里的8-10位的值为100 */
           RCC->CFGR = 0x00000400;   

SWS[1:0]:系统时钟切换状态 (System clock switch status)  位3:2
由硬件置’1’或清’0’来指示哪一个时钟源被作为系统时钟。
00:HSI作为系统时钟;
01:HSE作为系统时钟;
10:PLL输出作为系统时钟;
11:不可用
算法 就是判断RCC->CFGR 位3:2状态是否为10状态,最后,判断PLL输出是否稳定。

     sws = RCC->CFGR>>2;      
因为SWS在CFGR的2,3位,所以进行左移,目的是将SWS移动到最低位,方便进行计算。
                                          
       sws &= 0x3;
因为SWS只有两位 所以把其他的高位地址进行屏蔽掉。                    

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top