STM32F1xx HSE HSI 8Mhz / 48Mhz Clock Setup (Örnek)

Başlatan SpeedyX, 26 Mayıs 2013, 14:07:47

SpeedyX

Merhaba arkadaşlar,

STM32F1xx serisi için internal ve external osilatör ile 8Mhz ve 48Mhz clock kurulumu yapan 4 fonksiyon ekliyorum. Özellikle yeni başlayanların işine yarayacaktır.

HSE kullanarak kurulum yapan fonksiyonlarda, eğer HSE başlatılamamışsa otomatik olarak HSI kurarak çalışmaya devam ediyor. Böylece sahada sık karşılaşılan, kristalin bozulması veya yerinden sökülmesi sonucu ortaya çıkabilecek problemlere karşı da bir önlem alınmış oluyor.

PLL ayarları değiştirilerek farklı frekanslara da kurulum yapılabilir.

void SetToHSI8Mhz(void)
{
	RCC_DeInit();
	RCC_HSEConfig(RCC_HSE_OFF);
    RCC_HSICmd(ENABLE);
	FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
	FLASH_SetLatency(FLASH_Latency_0);
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    RCC_PCLK1Config(RCC_HCLK_Div1);
    RCC_PCLK2Config(RCC_HCLK_Div1);
    RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
    while (RCC_GetSYSCLKSource() != 0x00);
}

void SetToHSE(void)
{
    ErrorStatus HSEStartUpStatus;

	RCC_DeInit();
	RCC_HSEConfig(RCC_HSE_ON);
    HSEStartUpStatus = RCC_WaitForHSEStartUp();
    if (HSEStartUpStatus == SUCCESS)
    {
		FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
		FLASH_SetLatency(FLASH_Latency_0);
		RCC_HCLKConfig(RCC_SYSCLK_Div1);
		RCC_PCLK2Config(RCC_HCLK_Div1);
		RCC_PCLK1Config(RCC_HCLK_Div1);
		RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
		while(RCC_GetSYSCLKSource() != 0x04);
    }
    else
    {
    	SetToHSI8Mhz();
    }
    SystemCoreClockUpdate();
}

void SetToHSI48Mhz(void)
{
	RCC_DeInit();
	RCC_HSEConfig(RCC_HSE_OFF);
    RCC_HSICmd(ENABLE);
	FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
	FLASH_SetLatency(FLASH_Latency_1);
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    RCC_PCLK1Config(RCC_HCLK_Div1);
    RCC_PCLK2Config(RCC_HCLK_Div1);
    RCC_PLLConfig(RCC_CFGR_PLLSRC_HSI_Div2,RCC_CFGR_PLLMULL12);
    RCC_PLLCmd(ENABLE);
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    while (RCC_GetSYSCLKSource() != 0x08);
}

void SetTo48Mhz(void)
{
    ErrorStatus HSEStartUpStatus;

    RCC_DeInit();
    RCC_HSEConfig(RCC_HSE_ON);
    HSEStartUpStatus = RCC_WaitForHSEStartUp();
    if (HSEStartUpStatus == SUCCESS)
    {
		FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
		FLASH_SetLatency(FLASH_Latency_1);
		RCC_HCLKConfig(RCC_SYSCLK_Div1);
		RCC_PCLK2Config(RCC_HCLK_Div1);
		RCC_PCLK1Config(RCC_HCLK_Div2);
		RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6);
		RCC_PLLCmd(ENABLE);
		while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
		RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
		while (RCC_GetSYSCLKSource() != 0x08);
    }
    else
    {
    	SetToHSI48Mhz();
    }
    SystemCoreClockUpdate();
}

camby

Hocam STlib ile birlikte gelen "system_stm32f10x.c" dosyasını inceliyorum. Oradaki rutinler HSE ile çalışmaya yönelik. SystemInit fonksiyonunun çağırılması ile birlikte HSE kullanılarak istenilen frekansa set edilmesi sağlanmış. Sorun olduğunda da sistem 8 MHz HSI ile çalışıyor ancak. Yani HSI ve PLL kullanarak 48/72MHz çalışmaya yönelik bir fonksiyon yok.
Eğer HSE çalışmazsa ise burada kendi kodunuzu yazın gibi bir açıklama var hatta.

Yukarıda gösterdiğiniz gibi bir fonksiyon oluşturmadan yada "system_stm32f10x.c" dosyasında herhangi bir modifiye yapmadan HSI ile 48/72MHz ile çalışmak mümkün mü ?

Tam olarak sormak istediğim HSI ile ilgili ayarları STM kullanıcıya mı bırakmış ?

camby