Question
STM32F103C8 Incorrect HCLK Issue
Posted on February 04, 2016 at 06:05
I am using a minimal develpment board based on STM32F103C8. The board has an external crystal of 8Mhz.
I am trying to use PLL as my clock source (with input from HSE 8Mhz) upon boot but facing the following 2 issues: 1. When I use PLL multiplier as 9, the clock does not get generated at all. 2. When I use PLL multiplier as 8, the clock does get generated. SYSCLK is 64Mhz,however my HCLK is half of SYSCLK even though I am configuring it to be the same as SYSCLK
Below is my code (using PLL multiplier 8)
#include ''stm32f10x.h''
#include ''delay.h''
void
setupClock(
void
);
void
setupPins(
void
);
int
main(
void
)
{
RCC_ClocksTypeDef clock;
setupClock();
setupPins();
RCC_GetClocksFreq(&clock);
/*if(clock.HCLK_Frequency==64000000)
{
GPIO_SetBits(GPIOA, GPIO_Pin_6);
}*/
if
(RCC_GetSYSCLKSource() == 0x08 && clock.SYSCLK_Frequency == 64000000 && clock.HCLK_Frequency==32000000)
{
GPIO_SetBits(GPIOA, GPIO_Pin_6);
}
while
(1)
{
/*GPIO_SetBits(GPIOA, GPIO_Pin_6);
Delay_Ms(1000);
GPIO_ResetBits(GPIOA, GPIO_Pin_6);
Delay_Ms(1000);*/
}
}
void
setupClock(
void
)
{
ErrorStatus result;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
result = RCC_WaitForHSEStartUp();
if
(result==SUCCESS)
{
FLASH_PrefetchBufferCmd(ENABLE);
FLASH_SetLatency(FLASH_Latency_2);
//PLLCLK = (8Mhz * 9 = 72Mhz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_8);
RCC_PLLCmd(ENABLE);
//wait till PLL ready
while
(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)
{
}
//set PLL as SYSCLK source
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//wait to verify pll is being used aS SYSCLK source
while
(RCC_GetSYSCLKSource() != 0x08)
{
}
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//setupPins();
//GPIO_SetBits(GPIOA, GPIO_Pin_6);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_SYSCLK_Div2);
RCC_PCLK2Config(RCC_SYSCLK_Div1);
SystemCoreClockUpdate();
}
else
{
}
//enable clock to GPIOA
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
}
void
setupPins(
void
)
{
GPIO_InitTypeDef gpio;
//set A6 as output
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
gpio.GPIO_Pin = GPIO_Pin_6;
gpio.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &gpio);
}
When I run the code, the led connected to PORT A6 lights up.
Please help. This is driving me nuts. I have checked it over and over again but can't find any issues