|
本帖最后由 chou_robin 于 2012-9-22 01:07 编辑
用库开发STM32的大神们肯定都用过这样的函数SystemInit().但是它为我们做了一些什么呢?
今天把借来的开发板上的外部高速晶振(25M)换成了8M。然后我试着下载了一个原来的程序,发现正常运行。于是便开始了对SystemInit()函数的思考。
这个是函数的原型:
void SystemInit (void)
{
/* Reset the RCC clock configuration to the default reset state(for debug purpose) */
/* Set HSION bit */
RCC->CR |= (uint32_t)0x00000001;
/* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
#ifndef STM32F10X_CL
RCC->CFGR &= (uint32_t)0xF8FF0000;
#else
RCC->CFGR &= (uint32_t)0xF0FF0000;
#endif /* STM32F10X_CL */
/* Reset HSEON, CSSON and PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF;
/* Reset HSEBYP bit */
RCC->CR &= (uint32_t)0xFFFBFFFF;
/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
RCC->CFGR &= (uint32_t)0xFF80FFFF;
#ifndef STM32F10X_CL
/* Disable all interrupts and clear pending bits */
RCC->CIR = 0x009F0000;
#else
/* Reset PLL2ON and PLL3ON bits */
RCC->CR &= (uint32_t)0xEBFFFFFF;
/* Disable all interrupts and clear pending bits */
RCC->CIR = 0x00FF0000;
/* Reset CFGR2 register */
RCC->CFGR2 = 0x00000000;
#endif /* STM32F10X_CL */
/* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */
/* Configure the Flash Latency cycles and enable prefetch buffer */
SetSysClock();
}
其实这个函数还看不出来到底是怎样设置主频的。关键在SetSysClock();
static void SetSysClock(void)
{
#ifdef SYSCLK_FREQ_HSE
SetSysClockToHSE();
#elif defined SYSCLK_FREQ_24MHz
SetSysClockTo24();
#elif defined SYSCLK_FREQ_36MHz
SetSysClockTo36();
#elif defined SYSCLK_FREQ_48MHz
SetSysClockTo48();
#elif defined SYSCLK_FREQ_56MHz
SetSysClockTo56();
#elif defined SYSCLK_FREQ_72MHz
SetSysClockTo72(); //我设置的就是这个
#endif
/* If none of the define above is enabled, the HSI is used as System clock
source (default after reset) */
}
在SetSysClockTo72();函数中可以发现实际上这个里面配置的是内部的8M振荡器,然后经过锁相环得到72M。
呵呵,打这里,于是疑问也就消失了。
同时,也让我明白了为什么在直接配置systeminit()时候的串口程序发送的时候易出现乱码(内部振荡器不稳定的原因)。
以上均是个人的想法,有误之处还请大家多多指正。
|
|