STM32F407VG使用内部时钟PLL不能超过48M?

2019-07-20 15:20发布

一块STM32F407VG板子,使用外部8M晶振正常,使用407的16M HSI做锁相环的输入,锁相环输出只能最大输出48M,大于48M时调式进不去main()函数。手册中没有见到用HSI总线频率不能超过48M啊,哪位大侠用过HSI,请指点下。谢谢。部分代码如下:
system_stm32f4xx.c中,修改了下面这个函数,使用了HSI。
static void SetSysClock(void)
{
__IO uint32_t StartUpCounter = 0, HSIStatus = 0;


  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSIStatus = RCC->CR & RCC_CR_HSIRDY;
    StartUpCounter++;
  } while((HSIStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  if ((RCC->CR & RCC_CR_HSIRDY) != RESET)
  {
    HSIStatus = (uint32_t)0x01;//我的代码下面没判断这个HSIStatus的值
  }
  else
  {
    HSIStatus = (uint32_t)0x00;
  }
       

     RCC->APB1ENR |= RCC_APB1ENR_PWREN;
     PWR->CR |= PWR_CR_VOS;//这个不知道干吗用,去掉我的程序也能运行
     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择系统时钟源为PLL
     RCC_HCLKConfig(RCC_SYSCLK_Div1);//选择HCLK时钟源
     RCC_PCLK1Config(RCC_HCLK_Div4);//选择AHB1总线时钟源
     RCC_PCLK2Config(RCC_HCLK_Div2);

     RCC_PLLConfig(RCC_PLLSource_HSI,8,192,8,8);//主要是这个函数配置,PLLM=8,PLLN=192,PLLP=8,这样算出的PLL输出是16M*192/(8*8)=48M,把PLLP设置成6,4,2的话程序不能运行到main函数中去
     RCC_PLLCmd(ENABLE);
     while(((RCC->CR )& (RCC_CR_PLLRDY)) == 0)
    {                       
    }
                  /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
   FLASH->ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
                 /* Select the main PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= RCC_CFGR_SW_PLL;

    /* Wait till the main PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
    {
    }

}




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
jinggx
1楼-- · 2019-07-21 14:57
 精彩回答 2  元偷偷看……
qq997758497
2楼-- · 2019-07-21 20:14
jinggx 发表于 2016-11-17 21:59
论坛开发板的例子程序,都有啊,库函数,寄存器的,都有啊

例程用的都是外部晶振把 刚才找到问题了 卡死是因为没有焊上外部晶振而等待的是外部的就绪 改成等待内部的就好了 算是找到问题了把

一周热门 更多>