[STM32L1]

stm32l151使用HSI跑到了16M,但是怎么PLL到32M呢?

[复制链接]
6107|10
手机看帖
扫描二维码
随时随地手机跟帖
windit|  楼主 | 2014-9-22 09:18 | 显示全部楼层 |阅读模式
本帖最后由 windit 于 2014-9-22 11:39 编辑

stm32l151使用HSI跑到了16M,但是怎么PLL到32M呢?函数里面应该怎么修改,求大神指导啊!!!

void RCC_Configuration(void)
{  

  /* Enable HSI Clock */
  RCC_HSICmd(ENABLE);

  /*!< Wait till HSI is ready */
  while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)
  {}

  RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);

  RCC_MSIRangeConfig(RCC_MSIRange_6);

  RCC_HSEConfig(RCC_HSE_OFF);  
  if(RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET )
  {
    while(1);
  }

  /* Enable  comparator clock LCD and PWR mngt */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_LCD | RCC_APB1Periph_PWR, ENABLE);

  /* Enable ADC clock & SYSCFG */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_SYSCFG, ENABLE);

}

小浣熊| | 2014-9-22 21:33 | 显示全部楼层

使用特权

评论回复
qrsgcslqg| | 2014-9-23 09:58 | 显示全部楼层
可以参考SystemInit函数,修改pll的参数就可以

使用特权

评论回复
小小刀| | 2014-10-10 16:14 | 显示全部楼层
参考的L050的示例代码:16*4/2 = 32Mhz
void SystemClock_Config(void)
{

  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_OscInitTypeDef RCC_OscInitStruct;

  __PWR_CLK_ENABLE();

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4;
  RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);

  __SYSCFG_CLK_ENABLE();

}

使用特权

评论回复
啊啊顺顺| | 2014-12-9 17:21 | 显示全部楼层
void Driver_TIME_Init()
{
        ErrorStatus HSEStartUpStatus;
        //RCC reset
        RCC_DeInit();
        //Enable HSI
        RCC_HSICmd(ENABLE);
        //wait HSI
        while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)== RESET);
        FLASH_PrefetchBufferCmd(ENABLE);
        FLASH_SetLatency(FLASH_Latency_1);
        //Set bus clock
  RCC_HCLKConfig(RCC_SYSCLK_Div1);
        RCC_PCLK1Config(RCC_HCLK_Div1);
        RCC_PCLK2Config(RCC_HCLK_Div1);
        //HSI16M PLL-> 64M
        RCC_PLLConfig(RCC_PLLSource_HSI,RCC_PLLMul_4, RCC_PLLDiv_3);
        RCC_PLLCmd(ENABLE);
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
        //Select PLL as system clock source
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        while(RCC_GetSYSCLKSource() != 0x0C);
}

使用特权

评论回复
s284630173| | 2015-3-12 10:50 | 显示全部楼层
楼主你解决了么?
我现在也遇到相同的状况,无法倍频到32M,如果解决了给我发个邮件可以吗?
123mmmne@163.com,谢谢了

使用特权

评论回复
s284630173| | 2015-3-12 10:51 | 显示全部楼层
啊啊顺顺 发表于 2014-12-9 17:21
void Driver_TIME_Init()
{
        ErrorStatus HSEStartUpStatus;

你这个我看了,你这个是倍频到21M的,32M的按照你的方法行不通,你倍频到32M成功了么?
给我发给邮件吧,谢谢

使用特权

评论回复
lglour1978| | 2016-3-2 14:47 | 显示全部楼层
我也遇到同样问题了,21M也不行,只有16M不跑飞。调成其他参数立马程序跑飞或者停到 while(RCC_GetSYSCLKSource() != 0x0C);

使用特权

评论回复
qxhome| | 2017-1-23 17:29 | 显示全部楼层
HSI最高能到24m。  想用32m,要接一个HSE

使用特权

评论回复
yoghen| | 2017-6-14 11:40 | 显示全部楼层
本帖最后由 yoghen 于 2017-6-14 11:52 编辑

陈年老帖了,楼主应该解决了,我提供一个可能的原因:

stm32l152 能跑 32MHz,这个应该可以(具体看 stm32cubemx 配置或手册)。可能要注意 FLASH 取指等待周期配置,我用 cube 生成 24MHz 时,等待周期配置为 FLASH_LATENCY_1 (大于 24MHz 时建议配置),但我的实际测试还是要改为 FLASH_LATENCY_0 ,不然程序会有可能跑乱。32MHz 时配置为 FLASH_LATENCY_1 正常。


/** System Clock Configuration
*/
void SystemClock_Config(void)
{
    .
    .
    .

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
    .
    .
    .}




使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

20

帖子

2

粉丝