新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > stm32變更外部晶振時(shí)如何配置時(shí)鐘、以及HSI的使用

stm32變更外部晶振時(shí)如何配置時(shí)鐘、以及HSI的使用

作者: 時(shí)間:2016-11-17 來源:網(wǎng)絡(luò) 收藏
由于stm32的庫默認(rèn)是外部晶振8M的情況下實(shí)現(xiàn)的,所以配置串口波特率的時(shí)候也是按8M,包括主頻。
如果采用外部晶振12M,配置時(shí)鐘為72MHZ。

1)PLL倍頻這樣改:
8M:
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);//8*9=72
12M:
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6);//12*6=72
庫函數(shù):voidRCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul)
例:RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6);

2)stm32f10x.h中修改:
8M:
#define HSE_Value ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
12M:
#define HSE_Value ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */
接下來說一下內(nèi)部時(shí)鐘,內(nèi)部時(shí)鐘是由RC振蕩產(chǎn)生的,精度不高。用內(nèi)部時(shí)鐘產(chǎn)生的功耗更小,還可以節(jié)約印制板的空間,程序配置如下:
void RCC_Configuration(void)
{
/* RCC system reset(for debug purpose) */
RCC_DeInit();
RCC_HSICmd(ENABLE); //打開內(nèi)部高速時(shí)鐘
//等待HSI準(zhǔn)備好
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //開啟FLASH預(yù)取指功能
//FLASH時(shí)序控制
//推薦值:SYSCLK = 0~24MHz Latency=0
// SYSCLK = 24~48MHz Latency=1
// SYSCLK = 48~72MHz Latency=2
FLASH_SetLatency(FLASH_Latency_2);
RCC_HCLKConfig(RCC_SYSCLK_Div1); //設(shè)置HCLK(AHB時(shí)鐘)=SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2(APB2) = HCLK
RCC_PCLK1Config(RCC_HCLK_Div1); //PCLK1(APB1) = HCLK
//PLL設(shè)置 SYSCLK/2 * 12 = 4*12 = 48MHz
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12);
//啟動(dòng)PLL
RCC_PLLCmd(ENABLE);//如果PLL被用于系統(tǒng)時(shí)鐘,不能被DISABLE
//等待PLL穩(wěn)定
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){;}
//設(shè)置系統(tǒng)時(shí)鐘SYSCLK = PLL輸出
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//等待PLL成功用作于系統(tǒng)時(shí)鐘的時(shí)鐘源,并等待穩(wěn)定
// 0x00:HSI作為系統(tǒng)時(shí)鐘
// 0x04:HSE作為系統(tǒng)時(shí)鐘
// 0x08:PLL作為系統(tǒng)時(shí)鐘
while(RCC_GetSYSCLKSource() != 0x08);
}



評論


技術(shù)專區(qū)

關(guān)閉