AnsweredAssumed Answered

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

Question asked by wang.hao.005 on Aug 6, 2016
Latest reply on Aug 6, 2016 by wang.hao.005
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!

Outcomes