因为之前做的板子都是带外部晶振的,故很多工程拿来就直接用了,这次做的板子没有配置外部晶振,然后去设置内部时钟源,遇到各种问题,以为配置好了,结果程序调试起来各种bug。卡了我两天。总结下整体思路,方便后续使用。
最重要的还是看手册里的时钟图RCC
?需要配置的地方都用箭头指出来了,这些大部分都在 RCC_CR? & RCC_CFGR这两个寄存器里,还有附属的一些外设在CFGR2 3 里能找到。
我需要用内部时钟 所以配置大概流程就是??
1. 使能HSI? 并等待其稳定
2. 设置PLL锁相环时钟来源并倍频?
3. 使能PLL 并等待稳定
4. 选择系统时钟 SYSCLK 来源? 判断标志位稳定
5. 设置AHB APB的分频因子
6. 配置外设(uart,iic,adc,flash)的时钟来源分频
代码如下(系统进入SystemInit 复位后,进入SetSysClock, 默认是等待HSE起振,这里直接贴HSI的代码)
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 */
}
?
|