野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13418|回复: 3

STM32F429系统时钟配置问题

[复制链接]
发表于 2016-10-11 17:22:13 | 显示全部楼层 |阅读模式
现在验证固件库例程-RCC-时钟配置用HSE里碰到这样问题
在main()函数里int main(void)
{
   // 程序来到main函数之前,启动文件:statup_stm32f10x_hd.s已经调用
   // SystemInit()函数把系统时钟初始化成72MHZ
   // SystemInit()在system_stm32f10x.c中定义
   // 如果用户想修改系统时钟,可自行编写程序修改   
   // 重新设置系统时钟,这时候可以选择使用HSE还是HSI
   
   // 使用HSE,配置系统时钟为180M
   HSE_SetSysClock(25, 240, 2, 7);
   



我修改HSE_SetSysClock(25, 240, 2, 7);里面的参数,系统时钟一直都是180M



HSE_SetSysClock(m,n,p,q) 4个其中n参数当=360,系统时钟应该为180M,当n=240应该为120M才对,但是系统时钟一直是默认的是180M



这个例程就是光盘里面直接拿出来的,没做修改



我后来只有进去system_stm32f4xx.c文件里修改
#define PLL_M      25
#define PLL_N       240
#define PLL_P       2
#define PLL_Q      7
原先PLL_N=360对应180M,现在修改PLL_N=240时钟=120M才有效




我想光盘里面的例程应该都验证过的吧,为什么达不到修改系统时钟的目的,还是有别的地方需要设置呢?请高手们指教


回复

使用道具 举报

发表于 2016-10-11 18:24:54 | 显示全部楼层
是不是没有使能啊,可能在设置的时候要先关闭时钟,再配置
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-11 19:09:55 | 显示全部楼层
void HSE_SetSysClk(uint32_t m,uint32_t n,uint32_t p,uint32_t q)//系统时钟以及各总线AHB、APB1、APB2时钟配置函数
{
        __IO uint32_t  HSEStartUpStatus = 0;
       
         RCC_HSEConfig(RCC_HSE_ON);//使能HSE
       
         HSEStartUpStatus=RCC_WaitForHSEStartUp();
        if(HSEStartUpStatus==SUCCESS)
          {
                       
      RCC->APB1ENR |= RCC_APB1ENR_PWREN;//Select regulator voltage output Scale 1 mode
      PWR->CR |= PWR_CR_VOS;
                       
                        RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB总线时钟为SYSCLK/1
                       
                        RCC_PCLK1Config(RCC_HCLK_Div4);//配置低速APB1总线时钟为HCLK/4(HCLK为AHB总线时钟)
                       
                        RCC_PCLK2Config(RCC_HCLK_Div2); //配置高速APB2总线时钟为HCLK/2(HCLK为AHB总线时钟)
                       
                        // Configures the main PLL clock source, multiplication and division factors.  
                        RCC_PLLConfig(RCC_PLLSource_HSE, m, n, p, q);//系统时钟SYSCLK=OSCCLK/m*n/p;VCOCLK_IN=OSCCLK/m,且VCOCLK_IN要设置在1M-2M之间
                                                                     //VCOCLK_OUT=VCOCLK_IN*n;PLLCLK_OUT=VCOCLK_OUT/p;USBCLK = VCOCLK_OUT/q;
                                                                     //因为USBCLK时钟最大为48M,VCOCLK_OUT=48*7=336,所以PLLCLK_OUT一般最大配置为168M
                                                                     //如果不需要用到USB,PLLCLK_OUT可以配置到180M
                        RCC_PLLCmd(ENABLE);//使能主锁相环,执行该函数之后要等到PLLRDY位置1表示锁相环时钟稳定并且可以用作系统时钟
                       
                while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}
                       
               
    PWR->CR |= PWR_CR_ODEN;//Enable the Over-drive to extend the clock frequency to 180 Mhz
    while((PWR->CSR & PWR_CSR_ODRDY) == 0)
    {
    }
    PWR->CR |= PWR_CR_ODSWEN;
    while((PWR->CSR & PWR_CSR_ODSWRDY) == 0)
    {
                }
                 // 配置FLASH预取指,指令缓存,数据缓存和等待状态
    FLASH->ACR = FLASH_ACR_PRFTEN
                             | FLASH_ACR_ICEN
                             |FLASH_ACR_DCEN
                             |FLASH_ACR_LATENCY_5WS;
               
                RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//当PLL稳定之后,把PLL时钟切换为系统时钟SYSCLK
  
                while (RCC_GetSYSCLKSource() != 0x08){}//读取时钟切换状态位,确保PLLCLK被选为系统时钟
          }
  else
        {
                while(1){}
        }
       


以上是系统时钟配置函数代码,与光盘的配套教程一样的啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-11 19:19:06 | 显示全部楼层
随风 发表于 2016-10-11 18:24
是不是没有使能啊,可能在设置的时候要先关闭时钟,再配置

您的意思是工程里面启动文件自动配置了系统时钟为180M并且已经开启,如果接下来要更改系统时钟配置要先关闭时钟在更改吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-13 07:32 , Processed in 0.040595 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表