調(diào)試STM32系統(tǒng)時(shí)鐘設(shè)置時(shí)遇到一個(gè)問(wèn)題:TIM2定時(shí)1Ms,TIM2中斷服務(wù)函數(shù)time++,time=100時(shí)LED狀態(tài)改變。程序運(yùn)行后發(fā)現(xiàn)LED不是按照0.1S的時(shí)間閃爍,閃爍的很慢。
查找程序發(fā)現(xiàn)在系統(tǒng)時(shí)鐘初始化時(shí),RCC_HSEConfig(RCC_HSE_Bypass); 語(yǔ)句配置不對(duì),此語(yǔ)句解釋為HSE晶振被外部時(shí)鐘旁路。指將芯片內(nèi)部的用于外部晶體起振和功率驅(qū)動(dòng)等的部分電路和XTAL_OUT引腳斷開(kāi),這時(shí)使用的外部時(shí)鐘是有源時(shí)鐘或者其他STM32提供的CCO輸出等時(shí)鐘信號(hào),直接單線(xiàn)從XTAL_IN輸入,這樣即使外部有晶體也震蕩不起來(lái)了。
因?yàn)橹坝玫氖怯性淳д瘢臃ㄈ缦聢D1:HSE配置如下:RCC_HSEConfig(RCC_HSE_Bypass);
圖1
無(wú)源晶振,接法如下圖1:HSE配置如下:RCC_HSEConfig(RCC_HSE_ON);
附:1 晶體與晶振的區(qū)別:
晶振是一個(gè)統(tǒng)稱(chēng),晶振分為有源晶振和無(wú)源晶振。有源晶振又叫鐘振,無(wú)源晶振又叫晶體。區(qū)別兩者最簡(jiǎn)單的就是,是否需要對(duì)它單獨(dú)供電,需要供電電壓的,就是有源晶振,反之,無(wú)源晶振。還有一個(gè)外觀上比較容易判斷的就是,如果只有兩個(gè)腳的,那一定是無(wú)源的晶振,但是如果是三個(gè)腳,四個(gè)腳的,可能是無(wú)源,也可能是有源,需要從上面提到的判斷。
附:2 STM32系統(tǒng)時(shí)鐘配置函數(shù) void Sys_Clk_Init(void) //系統(tǒng)時(shí)間設(shè)置72M,使能DMA1,GPIOA,AFIO,ADC1 { ErrorStatus HSEStartUpStatus; RCC_DeInit(); // RCC_HSEConfig(RCC_HSE_Bypass); RCC_HSEConfig(RCC_HSE_ON); HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); FLASH_SetLatency(FLASH_Latency_2); RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div2); RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); RCC_ADCCLKConfig(RCC_PCLK2_Div6); RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource() != 0x08) { } RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC1 " RCC_APB2Periph_GPIOA , ENABLE); RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB , ENABLE); } else { while(1); // } }