|
愧為新手,公司有個(gè)以前做的項(xiàng)目,拿到前人留下的程序,想學(xué)習(xí)學(xué)習(xí)。剛上來(lái)就被時(shí)鐘搞混了。
這塊板子用的是STM32L151,外接3.6864MHz晶振,OSC32IN和OSC32out沒(méi)接晶振。這塊板子需要精確延時(shí)的。
按我理解,時(shí)鐘應(yīng)該是3.6864*8/2=14.7456M,但是我看代碼里還是基于8M來(lái)設(shè)置的。
RCC_GetClocksFreq(&RCC_Clocks); //獲取系統(tǒng)時(shí)鐘頻率,外部晶振8.00M,倍頻后系統(tǒng)時(shí)鐘8.000*8/2=32.00M
注釋是說(shuō)外部晶振8M,可實(shí)際上沒(méi)有接8M,只接的是3.6864MHz晶振。
對(duì)應(yīng)的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里,看到倍頻分頻設(shè)置值跟外接8M一樣,幾乎沒(méi)改動(dòng)。
/* 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);
我揣測(cè)是利用的內(nèi)部的HSI 8M來(lái)計(jì)算的,我在相關(guān)代碼里沒(méi)找到使用HSI的語(yǔ)句,郁悶啊。也沒(méi)有發(fā)現(xiàn)用此晶振3.6864MHz晶振代替系統(tǒng)默認(rèn)的8M。 哪位懇請(qǐng)幫理一下。新手琢磨了幾天了,對(duì)RCC還是有點(diǎn)糊涂。
|
|