• 【STM32】SYSCLK配置|学习笔记


    一、RCC原理

    所有stm32的外设都是挂载在相应的时钟上的,如下

    挂载在AHB上的外设

    挂载在APB1上的

    APB2上的

    所以RCC很重要,特别像TIM这种对时钟特别敏感的外设就必须把SYSCLK确定好,才能正常使用TIM外设。

    那么问题来了,SYSCLK如何产生,或者如何配置?

    其实不做任何配置芯片外设也是可以正常工作的,一般是默认设置,使用SYSCLK=HSI。对于F1就是8M,F2就是16M。

    要配置自己想要的SYSCLK频率其实很简单。

    1.确定好时钟源

    RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);

    不难发现这里可以选择的时钟有三种HSI/HSE/PLLCLK三种。

    前两种很好理解,HSE或HSI频率是多少SYSCLK的频率就是多少,直等关系。缺点是可选的频率少。

    2.使用PLL产生需要的时钟频率

    锁相环PLL理论上可以生成任意频率的时钟,PLL不产生时钟他也需要时钟源,如下图PLL可选HSI或SHE作为其时钟源。

    RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ);

     然后需要设置其倍频分频系数,暂且设PLL的时钟源为S

    PLLCLK = S*N/M*P

    举个例子S=16M,需要PLLCLK=120M,怎么选择系数。

    120 = 16N/M*P,  N/M*P = 120/16(因为N要>192) = 240/32 = 240/16*2 = 240/8*4 配置方法不一

    要注意的是时钟振荡频率不能大于120M对于F2系列来说。

    二、代码实现(HSE版)

    1.清除之前设置,还原默认值  RCC_DeInit();

    2.打开HSE  RCC_HSEConfig(RCC_HSE_ON);

    3.等待起振  RCC_WaitForHSEStartUp() == SUCCESS

    4.设置AHB    RCC_HCLKConfig(RCC_SYSCLK_Div1);//AHB = 120M
       设置高速AHB  RCC_PCLK1Config(RCC_HCLK_Div1);//APB2 = 120M
       设置低速AHB  RCC_PCLK2Config(RCC_HCLK_Div1);//APB2 = 120M

    5.设置PLL  RCC_PLLConfig(RCC_SYSCLKSource_HSI,8,240,4,0);//PLL=120M(NOTICE:CAN NOT OVER 120M)
       开启PLL  RCC_PLLCmd(ENABLE);

       等待PLL  RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET

    6.选择SYSCLK为PLL  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
       等待SYSCLK启动 (RCC_GetSYSCLKSource() != 0x08  

    HSI版:

    void RCC_Config()
    {
        RCC_DeInit();
    //    RCC_HSEConfig(RCC_HSE_ON);外部晶振不准暂不启用
    //    if(RCC_WaitForHSEStartUp() == SUCCESS)
    //    {
    //    }
        RCC_HCLKConfig(RCC_SYSCLK_Div1);//AHB = 120M
        RCC_PCLK1Config(RCC_HCLK_Div1);//APB2 = 120M
        RCC_PCLK2Config(RCC_HCLK_Div1);//APB2 = 120M
    //    /*设置FLASH存储器延时时钟周期数*/
    //    FLASH_SetLatency(FLASH_Latency_2);//FLASH_Latency_2  2延时周期
    //    /*选择FLASH预取指缓存的模式*/  
    //    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // 预取指缓存使能
        RCC_HSICmd(ENABLE);
        RCC_PLLConfig(RCC_SYSCLKSource_HSI,8,240,4,0);//PLL=120M(NOTICE:CAN NOT OVER 120M)
        RCC_PLLCmd(ENABLE);
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)//等待PLL启动
        {
        }
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        while(RCC_GetSYSCLKSource() != 0x08)//等待SYSCLK启动
        {
        }
    }
  • 相关阅读:
    函数和常用模块【day04】:函数式编程(六)
    函数和常用模块【day04】:递归(五)
    函数和常用模块【day04】:函数参数及调用(二)
    函数和常用模块【day04】:函数介绍(一)
    第一模块:python基础语法
    Python基础【day03】:集合进阶(四)
    Python基础【day03】:字典进阶(二)
    Python基础【day02】:数据运算(二)
    Python基础【day01】:表达式if ...else语句(三)
    Python基础【day01】:Hello World程序(二)
  • 原文地址:https://www.cnblogs.com/VergilYang/p/8572090.html
Copyright © 2020-2023  润新知