打印
[其他ST产品]

STM32F030 配置HSI

[复制链接]
292|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
因为之前做的板子都是带外部晶振的,故很多工程拿来就直接用了,这次做的板子没有配置外部晶振,然后去设置内部时钟源,遇到各种问题,以为配置好了,结果程序调试起来各种bug。卡了我两天。总结下整体思路,方便后续使用。


最重要的还是看手册里的时钟图RCC



使用特权

评论回复
沙发
舒伯特玫瑰|  楼主 | 2022-12-31 15:31 | 只看该作者
需要配置的地方都用箭头指出来了,这些大部分都在 RCC_CR  & RCC_CFGR这两个寄存器里,还有附属的一些外设在CFGR2 3 里能找到。

使用特权

评论回复
板凳
舒伯特玫瑰|  楼主 | 2022-12-31 15:33 | 只看该作者
我需要用内部时钟 所以配置大概流程就是  

1. 使能HSI  并等待其稳定

使用特权

评论回复
地板
舒伯特玫瑰|  楼主 | 2022-12-31 15:35 | 只看该作者
设置PLL锁相环时钟来源并倍频

使用特权

评论回复
5
舒伯特玫瑰|  楼主 | 2022-12-31 15:36 | 只看该作者
使能PLL 并等待稳定

使用特权

评论回复
6
舒伯特玫瑰|  楼主 | 2022-12-31 15:37 | 只看该作者
选择系统时钟 SYSCLK 来源  判断标志位稳定

使用特权

评论回复
7
舒伯特玫瑰|  楼主 | 2022-12-31 15:38 | 只看该作者
设置AHB APB的分频因子

使用特权

评论回复
8
舒伯特玫瑰|  楼主 | 2022-12-31 15:39 | 只看该作者
配置外设(uart,iic,adc,flash)的时钟来源分频

使用特权

评论回复
9
舒伯特玫瑰|  楼主 | 2022-12-31 15:39 | 只看该作者
void SetSysClock(void)
{
  __IO uint32_t StartUpCounter = 0, HSIStatus = 0;
  
  /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/
#if defined (PLL_SOURCE_HSI)

        //Enable HSI
        RCC->CR |= RCC_CR_HSION;
        //Wait till Hsi is ready       
        do
  {
   HSIStatus = RCC->CR & RCC_CR_HSIRDY;
    StartUpCounter++;  
  } while((HSIStatus== 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));
         if ((RCC->CR & RCC_CR_HSIRDY) != RESET)
  {
                HSIStatus = (uint32_t)0x01;
  }
  else  
  {
                HSIStatus = (uint32_t)0x00;
  }  
        if(HSIStatus==(uint32_t)0x01)
        {
                /* Enable Prefetch Buffer and set Flash Latency */
                FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
                                //Set AHB prescaler /1  48M
                RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
                //Set APB prescaler /1 48M
                RCC->CFGR |= RCC_CFGR_PPRE_DIV1;
               
                 /* PLL configuration = HSI/2 * 12= 48 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL));
               
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2 | RCC_CFGR_PLLMULL12); //RC时钟2分频后 进行12倍频</font>
               
               
//                //Select Pllsrc as hsi already reset & pllmul *12  8/2*12=48M
//                RCC->CFGR |= RCC_CFGR_PLLMUL12;
               
                /* Enable PLL */
                RCC->CR |= RCC_CR_PLLON;
                /* Wait till PLL is ready */
                while((RCC->CR & RCC_CR_PLLRDY) == 0);
               
                //select system clock as pll
                RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
                RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
               
                //wait pll use as system clock
                while((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL);

                //Set ADC prescaler /4  12M
        //        RCC->CFGR |= RCC_ADCCLK_PCLK_Div4;
                //Set ADC clock source
                RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
                //Set usart clock source
                RCC_USARTCLKConfig(RCC_USART1CLK_PCLK);
                //Set IIC clock source
                RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);       
               
  }

#endif /* PLL_SOURCE_HSI */  
}

使用特权

评论回复
10
Bowclad| | 2023-1-1 16:34 | 只看该作者
不是说内部的晶振不稳定吗?

使用特权

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

本版积分规则

51

主题

264

帖子

2

粉丝