Skip to main content
wh2104
Associate
August 6, 2016
Question

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

  • August 6, 2016
  • 3 replies
  • 861 views
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!
    This topic has been closed for replies.

    3 replies

    Tesla DeLorean
    Guru
    August 6, 2016
    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 (See Profile) Up vote any posts that you find helpful, it shows what's working..
    Tesla DeLorean
    Guru
    August 6, 2016
    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 (See Profile) Up vote any posts that you find helpful, it shows what's working..
    wh2104
    wh2104Author
    Associate
    August 6, 2016
    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