Ich bin neu zu stm32f103c8t6. Jetzt versuche ich die SPI-Funktion zu lernen und beende den Code von der RCC zur SPI-Initialisierung. Ich benutzte das Oszilloskop, um das SPI1 SCK-Signal aufgrund der Beschränkung der Testausrüstung zu messen. Tatsächlich ist das Taktsignal aber viel niedriger als meine RCC-Konfiguration. Ich habe versucht, den Grund zu suchen, aber immer noch versagt. Also darf ich fragen, ob jemand die Antwort kennt.Die Uhr von Stm32f103 SPI unterscheidet sich von der theoretischen Berechnung nach der Initialisierung
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)
{
}
}
Der obige Code meine Konfiguration über RCC zeigt, verwendet als I HSE-Takt und die Endfrequenz ist 8Mhz/2 * 9 = 36 MHz. Unten ist mein SPI und GPIO Initialisierung:
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 bedeutet, meine SPI Takt 36MHz/4 = 9 MHz ist, aber tatsächlich das Oszilloskop zeigt die frequecy um 200 kHz ist, ist es viel niedriger die die Erwartung. Auch ich habe versucht, SPI_BaudRatePrescaler mit anderen Wert zu konfigurieren, es scheint, dass das Ergebnis nicht linear ist.
Daher würde ich gerne fragen, ob jemand die Antwort kennt. Danke vielmals!