您的位置:首页 > 其它

STM32F429HAL库时钟系统学习笔记

2017-09-11 16:12 183 查看
文章部分图片来自于正点原子开发手册。纯属学习用途。

 F4的系统的时钟和F1基本相同,和F1 不同的就是锁相环倍频系数提高,就是系统时钟PLL的时钟频率高达180M(做完电赛控制组,感觉100M以下的单片机以后都不用再学了,图像处理完全做不了)。

HSI:系统内部告诉时钟16M;

HSE:外部高速时钟这里我们一般叫外部晶振正点原子的开发板是25M输入范围是(4-26M)

我们以外部时钟源25M为例外部时钟经过PLL锁仙环(VCO:压控振荡器,这个是电压控制振荡频率的一个元器件没必要深究)

经过*N倍频在/P就得到我们想要的系统时钟频率了

系统时钟=外部晶振/M*N/P;

我们在来看HAL库的配置函数

 RCC->CR |= (uint32_t)0x00000001;//写入

使能内部高速时钟 

 /* Reset CFGR register */

  RCC->CFGR = 0x00000000;

复位配置寄存器

  /* Reset HSEON, CSSON and PLLON bits */

  RCC->CR &= (uint32_t)0xFEF6FFFF;

  /* Reset PLLCFGR register */

  RCC->PLLCFGR = 0x24003010;

  /* Reset HSEBYP bit */

  RCC->CR &= (uint32_t)0xFFFBFFFF;

  /* Disable all interrupts */

  RCC->CIR = 0x00000000;

复位了全部的时钟配置默认开起了HSI系统内部高速时钟

所以我们要自己配置时钟函数程序如下

Stm32_Clock_Init(360,25,2,8); //时钟主频180M 

void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq)

{

    HAL_StatusTypeDef ret = HAL_OK;

    RCC_OscInitTypeDef RCC_OscInitStructure; 

    RCC_ClkInitTypeDef RCC_ClkInitStructure;

    

    __HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟这点我没有深究大概是时钟电源使能

    

    //下面这个设置用来设置调压器输出电压级别,以便在器件未以最大频率工作

    //时使性能与功耗实现平衡,此功能只有STM32F42xx和STM32F43xx器件有,

    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);//设置调压器输出电压级别1

    

    RCC_OscInitStructure.OscillatorType=RCC_OSCILLATORTYPE_HSE;    //时钟源为HSE

    RCC_OscInitStructure.HSEState=RCC_HSE_ON;                      //打开HSE

    RCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON;//打开PLL

    RCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE;//PLL时钟源选择HSE

    RCC_OscInitStructure.PLL.PLLM=pllm; //主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63.

    RCC_OscInitStructure.PLL.PLLN=plln; //主PLL倍频系数(PLL倍频),取值范围:64~432.  

    RCC_OscInitStructure.PLL.PLLP=pllp; //系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!)

    RCC_OscInitStructure.PLL.PLLQ=pllq; //USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15.

    ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化

    if(ret!=HAL_OK) while(1);

    

    ret=HAL_PWREx_EnableOverDrive(); //开启Over-Driver功能

    if(ret!=HAL_OK) while(1);

    

    //选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2

    RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2);

    RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;//设置系统时钟时钟源为PLL

    RCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1;//AHB分频系数为1

    RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV4; //APB1分频系数为4

    RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV2; //APB2分频系数为2

    ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_5);//同时设置FLASH延时周期为5WS,也就是6个CPU周期。

    if(ret!=HAL_OK) while(1);

}

这个程序就直接配置了我们时钟APB1 80M和APB2 40M的时钟配置

初始化配置就完成了,我们以后想要超频也可以在这里修改,以后我会超频做一些功能超频稳定性测试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息