cancel
Showing results for 
Search instead for 
Did you mean: 

The clock of stm32f103 SPI is different from theoretic calculation after initialization

wh2104
Associate
Posted on August 06, 2016 at 13:53

Hi all, I am a new to stm32f103c8t6. Now I am trying to learn the SPI function and finished the code from the RCC to SPI initialization. I used oscilloscope to measure the SPI1 SCK signal due to test equipment limitation. Indeed that is clock signal but much lower than my RCC configuration. I tried to search the reason, but still failed. So may I ask if someone knows the answer.

Here is my RCC configuration:

 RCC_DeInit();
 RCC_HSEConfig(RCC_HSE_ON);
 Errsts = RCC_WaitForHSEStartUp();
 if (Errsts == SUCCESS)
 {
 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
 RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9);
 RCC_PLLCmd(ENABLE);

 while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY == RESET))
 {
 }
 FLASH_SetLatency(FLASH_Latency_1);
 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
 RCC_HCLKConfig(RCC_SYSCLK_Div1);
 RCC_PCLK1Config(RCC_HCLK_Div2);
 RCC_PCLK2Config(RCC_HCLK_Div1);
 while (RCC_GetSYSCLKSource() != 0x08)
 {
 }
 }

The code above shows my configuration about RCC, I used HSE as clock and the final frequency is 8Mhz/2*9=36Mhz. Below is my SPI and GPIO initialization:

SPI_InitTypeDef SPI_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5| GPIO_Pin_6| GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_WriteBit(GPIOA, GPIO_Pin_4,Bit_SET); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStructure); /* Enable SPI2 */ SPI_Cmd(SPI1, ENABLE); } So

SPI_BaudRatePrescaler=4 means my SPI clock is 36Mhz/4=9Mhz, but actually the oscilloscope shows the frequecy is around 200Khz, it is much lower the the expectation. Also I tried to config

SPI_BaudRatePrescaler with different value, it seems that the outcome is not linear.

Therefore I would like to ask if someone knows the answer. Thanks a lot!
3 REPLIES 3
Posted on August 06, 2016 at 15:51

The code you show only starts the PLL, it does not select it as the source for the processor.

To verify the speed the processor is actually running you can use the PA8 MCO pin

Tips, buy me a coffee, or three.. PayPal Venmo Up vote any posts that you find helpful, it shows what's working..
Posted on August 06, 2016 at 15:59

/* Enable SPIz Periph clock */
RCC_APB1PeriphClockCmd(SPIz_CLK, ENABLE);

Observe you are enabling a clock on APB1 not APB2, I don't see definitions. You should also explicitly define the APB clock dividers, it is safer than making assumption.
Tips, buy me a coffee, or three.. PayPal Venmo Up vote any posts that you find helpful, it shows what's working..
wh2104
Associate
Posted on August 06, 2016 at 18:30

Hi Clive1, thanks for your reply.

I so am sorry to make a mistake copying the wrong code here. Now I make it right.

Indeed I set the PLL as default clock and enabled the apb2 clock in the spi initialization block.

So do you have any suggestion? thanks