愧為新手,公司有個以前做的項目,拿到前人留下的程序,想學習學習。剛上來就被時鐘搞混了。
這塊板子用的是STM32L151,外接3.6864MHz晶振,OSC32IN和OSC32out沒接晶振。這塊板子需要精確延時的。
按我理解,時鐘應該是3.6864*8/2=14.7456M,但是我看代碼里還是基于8M來設置的。
RCC_GetClocksFreq(&RCC_Clocks); //獲取系統時鐘頻率,外部晶振8.00M,倍頻后系統時鐘8.000*8/2=32.00M
注釋是說外部晶振8M,可實際上沒有接8M,只接的是3.6864MHz晶振。
對應的RCC_GetClocksFreq如下:
void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
{
uint32_t tmp = 0, pllmul = 0, plldiv = 0, pllsource = 0, presc = 0, msirange = 0;
/* Get SYSCLK source -------------------------------------------------------*/
tmp = RCC->CFGR & RCC_CFGR_SWS;
switch (tmp)
{
case 0x00: /* MSI used as system clock */
msirange = (RCC->ICSCR & RCC_ICSCR_MSIRANGE ) >> 13;
RCC_Clocks->SYSCLK_Frequency = (((1 << msirange) * 64000) - (MSITable[msirange] * 24000));
break;
case 0x04: /* HSI used as system clock */
RCC_Clocks->SYSCLK_Frequency = HSI_VALUE;
break;
case 0x08: /* HSE used as system clock */
RCC_Clocks->SYSCLK_Frequency = HSE_VALUE;
break;
case 0x0C: /* PLL used as system clock */
/* Get PLL clock source and multiplication factor ----------------------*/
pllmul = RCC->CFGR & RCC_CFGR_PLLMUL;
plldiv = RCC->CFGR & RCC_CFGR_PLLDIV;
pllmul = PLLMulTable[(pllmul >> 18)];
plldiv = (plldiv >> 22) + 1;
pllsource = RCC->CFGR & RCC_CFGR_PLLSRC;
if (pllsource == 0x00)
{
/* HSI oscillator clock selected as PLL clock entry */
RCC_Clocks->SYSCLK_Frequency = (((HSI_VALUE) * pllmul) / plldiv);
}
else
{
/* HSE selected as PLL clock entry */
RCC_Clocks->SYSCLK_Frequency = (((HSE_VALUE) * pllmul) / plldiv);
}
break;
default:
RCC_Clocks->SYSCLK_Frequency = HSI_VALUE;
break;
}
在system_stm32lxx.c里,看到倍頻分頻設置值跟外接8M一樣,幾乎沒改動。
/* PLL configuration: PLLCLK = (HSE * 8) / 2 = 32MHz */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL |
RCC_CFGR_PLLDIV));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMUL8 | RCC_CFGR_PLLDIV2);
我揣測是利用的內部的HSI 8M來計算的,我在相關代碼里沒找到使用HSI的語句,郁悶啊。也沒有發現用此晶振3.6864MHz晶振代替系統默認的8M。 哪位懇請幫理一下。新手琢磨了幾天了,對RCC還是有點糊涂。
|