Keil uVision 5 programında stm32f103c8 ile program yazmaya çalışıyorum. standart library ile led yakma , buton ile led yakma gibi başlangıç işlemlerini yapabiliyorum. tabi bunları yaparken stm32f103c8 'nin halihazırdaki (default) configurasyon ayarları ile yapıyorum. şimdi ise konfigurasyon ayarlarını değiştirip işlemciyi 72 Mhz de çalıştırmak istiyorum ancak bunu yapamadım nasıl yapılacağını bilmiyorum. CubeMx ve HAL Library ile bu ayarlamaları yapabiliyorum ancak anlamak açısından kendi kodlarımla bunu yapmak istiyorum.
OSC Seçimi , AHB, APB1, APB2 ,PLL , SYSCLK gibi konfigurasyon ayarlarını standart library ile nasıl yapacağım konusunda yardımcı olursanız sevinirim
bu z nin stm f4 için yazdığı kodlar;
unsigned int i;
(*((int*)0xE000ED88))|=0x0F00000;
for (i=0;i<0x00100000;i++); // OSC oturtma ve kurtarma rutini
RCC->CFGR |= 0x00009400; // AHB ve APB hizlarini max degerlere set edelim
RCC->CR |= 0x00010000; // HSE Xtal osc calismaya baslasin
while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
RCC->PLLCFGR = 0x07405408; // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
// RCC->PLLCFGR = 0x07402A04; // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
RCC->CR |= 0x01000000; // PLL calismaya baslasin (Rehber Sayfa 95)
while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
// FLASH->ACR = 0x00000705; // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
FLASH->ACR = 0x00000605; // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
RCC->CFGR |= 0x00000002; // Sistem Clk u PLL uzerinden besleyelim
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
evet bunları yaptım stm32f103c8 in registerlarına göre uyarladım ama başarılı olamadım.
main içine en başa
systeminit(); yaz. o 72 de koşturuyor.
yok ben yazacağım dersen
void SetSysClockTo72(void)
{
ErrorStatus HSEStartUpStatus;
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
/* RCC system reset(for debug purpose) */
RCC_DeInit();
/* Enable HSE */
RCC_HSEConfig( RCC_HSE_ON);
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if (HSEStartUpStatus == SUCCESS)
{
/* Enable Prefetch Buffer */
//FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable);
/* Flash 2 wait state */
//FLASH_SetLatency( FLASH_Latency_2);
/* HCLK = SYSCLK */
RCC_HCLKConfig( RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
RCC_PCLK2Config( RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config( RCC_HCLK_Div2);
/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(0x00010000, RCC_PLLMul_9);
/* Enable PLL */
RCC_PLLCmd( ENABLE);
/* Wait till PLL is ready */
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
/* Select PLL as system clock source */
RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK);
/* Wait till PLL is used as system clock source */
while (RCC_GetSYSCLKSource() != 0x08)
{
}
}
else
{ /* If HSE fails to start-up, the application will have wrong clock configuration.
User can add here some code to deal with this error */
/* Go to infinite loop */
while (1)
{
}
}
}
STM32CubuMx programını indir. Onun üzerinden clock ayarlarını görsel olarak uygula. Sonra ilgili register ayarlarını tamamla.
@muhittin_kaplan verdiğiniz program üzerinde çalışıp deneyeceğim istediğim buydu .
@selimkoc cubeMx kullanıyorum zaten ben kendim
@muhittin_kaplan hocanın verdiği gibi kod yazarak yapmak istiyorum
systeminit(); fonksiyonunun içerisinden de bakabilirsin.
Alıntı yapılan: muhittin_kaplan - 23 Kasım 2016, 12:18:08
systeminit(); fonksiyonunun içerisinden de bakabilirsin.
baktım ama işin içinden çıkamadım ne yazıkki :( nereyi nasıl değiştirceğimi bilemedim.
72mhz için değişiklik yapmayacaksın.
systeminit i çağırdığına 72mhz e çekiyor ;)
ve hatta ne demiş stm bakalım.
Alıntı Yap"At this stage the microcontroller clock setting is already configured,
this is done through SystemInit() function which is called from startup
file (startup_stm32f10x_xx.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32f10x.c file"
sen hiç systeminit i çağırmasan dahi o falanca dosyadan çağırıyor diyor.
Alıntı yapılan: muhittin_kaplan - 23 Kasım 2016, 12:28:10
72mhz için değişiklik yapmayacaksın.
systeminit i çağırdığına 72mhz e çekiyor ;)
int main (void)
{
systeminit();
...............
...............
}
bu şekilde yazdığım zaman olacak orasını anladım.
bir de bu systeminit() fonksiyonunun içeriğini anlamak istiyorum. işler nasıl işliyor görmek istiyorum :)
"system_stm32f10x.c" dosyasının içinde görebilirsin.
SystemInit() fonksiyonunu ayrıca çağırmana gerek yok.
startup rutininde bu fonksiyon zaten çağırılır. eğer ide tarafından oluşturulan startup kullanmayacaksan kendin çağırman gerek.
/**
* @brief This is the code that gets called when the processor first
* starts execution following a reset event. Only the absolutely
* necessary set is performed, after which the application
* supplied main() routine is called.
* @param None
* @retval None
*/
void Default_Reset_Handler(void)
{
/* Initialize data and bss */
unsigned long *pulSrc, *pulDest;
/* Copy the data segment initializers from flash to SRAM */
// pulSrc = &_sidata;
//
// for(pulDest = &_sdata; pulDest < &_edata; )
// {
// *(pulDest++) = *(pulSrc++);
// }
//
// /* Zero fill the bss segment. */
// for(pulDest = &_sbss; pulDest < &_ebss; )
// {
// *(pulDest++) = 0;
// }
/* Setup the microcontroller system. */
SystemInit();
/* Call the application's entry point.*/
main();
}
burada kafamı karıştıran bir nokta var .
program ilk çalıştığında SystemInit() çağrılmak zorunda , biz çağırmasak da startup onu çağıracak. systemInit() içeriğinde HSI osc çalıştırılıyor. ben HSE osc ile ve 72Mhz de çalışmak istiyorsam yapmam gereken şey !!!!
SystemInit() içeriğini değiştirmek mi yani "RCC->CR |= (uint32_t)0x00000001;" kısmını HSE ye göre ayarlamak mı (ve diğer pll ahb,apb gibi ayarları da yapıp)
void SystemInit (void)
{
/* Reset the RCC clock configuration to the default reset state(for debug purpose) */
/* Set HSION bit */
RCC->CR |= (uint32_t)0x00000001;
yoksa stm32f103 ilk çalışırken HSI ile çalışmalı sonra kendi yazdığım main.c içerisinde SystemInit() e benzer
@muhittin_kaplan yazdığı gibi
Alıntı yapılan: muhittin_kaplan - 23 Kasım 2016, 11:41:38
void SetSysClockTo72(void)
{
ErrorStatus HSEStartUpStatus;
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
/* RCC system reset(for debug purpose) */
RCC_DeInit();
/* Enable HSE */
RCC_HSEConfig( RCC_HSE_ON);
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if (HSEStartUpStatus == SUCCESS)
{
/* Enable Prefetch Buffer */
//FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable);
/* Flash 2 wait state */
//FLASH_SetLatency( FLASH_Latency_2);
/* HCLK = SYSCLK */
RCC_HCLKConfig( RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
RCC_PCLK2Config( RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config( RCC_HCLK_Div2);
/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(0x00010000, RCC_PLLMul_9);
/* Enable PLL */
RCC_PLLCmd( ENABLE);
/* Wait till PLL is ready */
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
/* Select PLL as system clock source */
RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK);
/* Wait till PLL is used as system clock source */
while (RCC_GetSYSCLKSource() != 0x08)
{
}
}
else
{ /* If HSE fails to start-up, the application will have wrong clock configuration.
User can add here some code to deal with this error */
/* Go to infinite loop */
while (1)
{
}
}
}
bir fonksiyon yazıp HSE yi aktif edip 72 Mhz ulaşmam mı gerekir
HSE_VALUE=8000000 i biryerlerde define etmen yeterli. Harici Xtal Kullanımı için