[其他ST产品] STM32F030 配置HSI

[复制链接]
446|9
 楼主| 舒伯特玫瑰 发表于 2022-12-31 15:24 | 显示全部楼层 |阅读模式
因为之前做的板子都是带外部晶振的,故很多工程拿来就直接用了,这次做的板子没有配置外部晶振,然后去设置内部时钟源,遇到各种问题,以为配置好了,结果程序调试起来各种bug。卡了我两天。总结下整体思路,方便后续使用。


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


8070663afe3bb05653.png
 楼主| 舒伯特玫瑰 发表于 2022-12-31 15:31 | 显示全部楼层
需要配置的地方都用箭头指出来了,这些大部分都在 RCC_CR  & RCC_CFGR这两个寄存器里,还有附属的一些外设在CFGR2 3 里能找到。
 楼主| 舒伯特玫瑰 发表于 2022-12-31 15:33 | 显示全部楼层
我需要用内部时钟 所以配置大概流程就是  

1. 使能HSI  并等待其稳定
 楼主| 舒伯特玫瑰 发表于 2022-12-31 15:35 | 显示全部楼层
设置PLL锁相环时钟来源并倍频
 楼主| 舒伯特玫瑰 发表于 2022-12-31 15:36 | 显示全部楼层
使能PLL 并等待稳定
 楼主| 舒伯特玫瑰 发表于 2022-12-31 15:37 | 显示全部楼层
选择系统时钟 SYSCLK 来源  判断标志位稳定
 楼主| 舒伯特玫瑰 发表于 2022-12-31 15:38 | 显示全部楼层
设置AHB APB的分频因子
 楼主| 舒伯特玫瑰 发表于 2022-12-31 15:39 | 显示全部楼层
配置外设(uart,iic,adc,flash)的时钟来源分频
 楼主| 舒伯特玫瑰 发表于 2022-12-31 15:39 | 显示全部楼层
  1. void SetSysClock(void)
  2. {
  3.   __IO uint32_t StartUpCounter = 0, HSIStatus = 0;
  4.   
  5.   /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/
  6. #if defined (PLL_SOURCE_HSI)

  7.         //Enable HSI
  8.         RCC->CR |= RCC_CR_HSION;
  9.         //Wait till Hsi is ready       
  10.         do
  11.   {
  12.    HSIStatus = RCC->CR & RCC_CR_HSIRDY;
  13.     StartUpCounter++;  
  14.   } while((HSIStatus== 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));
  15.          if ((RCC->CR & RCC_CR_HSIRDY) != RESET)
  16.   {
  17.                 HSIStatus = (uint32_t)0x01;
  18.   }
  19.   else  
  20.   {
  21.                 HSIStatus = (uint32_t)0x00;
  22.   }  
  23.         if(HSIStatus==(uint32_t)0x01)
  24.         {
  25.                 /* Enable Prefetch Buffer and set Flash Latency */
  26.                 FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
  27.                                 //Set AHB prescaler /1  48M
  28.                 RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
  29.                 //Set APB prescaler /1 48M
  30.                 RCC->CFGR |= RCC_CFGR_PPRE_DIV1;
  31.                
  32.                  /* PLL configuration = HSI/2 * 12= 48 MHz */
  33.     RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL));
  34.                
  35.     RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2 | RCC_CFGR_PLLMULL12); //RC时钟2分频后 进行12倍频</font>
  36.                
  37.                
  38. //                //Select Pllsrc as hsi already reset & pllmul *12  8/2*12=48M
  39. //                RCC->CFGR |= RCC_CFGR_PLLMUL12;
  40.                
  41.                 /* Enable PLL */
  42.                 RCC->CR |= RCC_CR_PLLON;
  43.                 /* Wait till PLL is ready */
  44.                 while((RCC->CR & RCC_CR_PLLRDY) == 0);
  45.                
  46.                 //select system clock as pll
  47.                 RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
  48.                 RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
  49.                
  50.                 //wait pll use as system clock
  51.                 while((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL);

  52.                 //Set ADC prescaler /4  12M
  53.         //        RCC->CFGR |= RCC_ADCCLK_PCLK_Div4;
  54.                 //Set ADC clock source
  55.                 RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
  56.                 //Set usart clock source
  57.                 RCC_USARTCLKConfig(RCC_USART1CLK_PCLK);
  58.                 //Set IIC clock source
  59.                 RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);       
  60.                
  61.   }

  62. #endif /* PLL_SOURCE_HSI */  
  63. }
Bowclad 发表于 2023-1-1 16:34 | 显示全部楼层
不是说内部的晶振不稳定吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

266

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部