高级会员

- 积分
- 628
- 金钱
- 628
- 注册时间
- 2016-3-3
- 在线时间
- 68 小时
|
5金钱
STM系统时钟:
在SystemInit函数执行刚开始的时候,代码已经对RCC_CFGR中的PLLSRC、PLLXTPRE和PLLMUL位进行了清0操作;
然后在继续向下执行调用SetSysClock()中的SetSysClockTo72()函数(以72MHz为例)的时候,下面有这样一段代码(问的问题式其中的两行,在代码完了之后):、
(以下代码在system_stm32f10x.c文件的line1030——line1057)
#ifdef STM32F10X_CL
/* Configure PLLs ------------------------------------------------------*/
/* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
/* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
/* Enable PLL2 */
RCC->CR |= RCC_CR_PLL2ON;
/* Wait till PLL2 is ready */
while((RCC->CR & RCC_CR_PLL2RDY) == 0)
{
}
/* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |
RCC_CFGR_PLLMULL9);
#else
/* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
#endif /* STM32F10X_CL */
其中最后else里面的这两行代码:
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
其中:
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLMULL));
是将PLLSRC、PLLXTPRE和PLLMULL都置为了0;
所以第一个问题就是:
在调用SetSysClock()函数之前,SystemInit中的代码就已经将PLLSRC、PLLXTPRE和PLLMULL都置为了0,为什么这里又配置一遍?
然后这一行代码:
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
是将PLLSRC置1,PLLMULL置1得到8*9=72MHz系统时钟;
那既然要设置系统时钟来源为HSE,为什么还有在前一行代码中先设置系统时钟来源为HSI?
谢谢大家!
|
|