stm32f103 SPI的时钟与初始化后的理论计算不同

时间:2016-08-06 12:02:49

标签: stm32 spi cortex-m3

我是stm32f103c8t6的新手。现在我正在尝试学习SPI函数并完成从RCC到SPI初始化的代码。由于测试设备的限制,我使用示波器测量SPI1 SCK信号。实际上这是时钟信号,但远低于我的RCC配置。我试图搜索原因,但仍然失败了。所以我可以问一下是否有人知道答案。

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)
    {
    }
}

上面的代码显示了我关于RCC的配置,我使用HSE作为时钟,最终频率为8Mhz / 2 * 9 = 36Mhz。下面是我的SPI和GPIO初始化:

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); 

所以SPI_BaudRatePrescaler = 4意味着我的SPI时钟是36Mhz / 4 = 9Mhz,但实际上示波器显示频率大约是200Khz,它远低于预期。另外我试着用不同的值配置SPI_BaudRatePrescaler,似乎结果不是线性的。

因此我想问一下是否有人知道答案。非常感谢!

1 个答案:

答案 0 :(得分:0)

仔细检查配置中的预分频器值。根据{{​​3}},波特率字段中的值为4将导致分频器为32.要获得大约200 kHz的时钟,您需要该寄存器中的值为6或7,结果在128或256(281 kHz或140 kHz)的分频器中。如果你想要一个4分频器,你需要在那里加一个值1。检查并查看SPI_BaudRatePrescaler_4在寄存器中是否为值4,或者值为1。

结果不是线性的,因为它们使用它作为2的指数。值0是2^(0+1),而1是2^(1+1)等等。

相关问题