OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2486|回复: 5

STM32F031使用内部时钟,配置为48M,但是SPI频率8分频后只有1M

[复制链接]

4

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2019-5-22
在线时间
14 小时
发表于 2020-3-13 16:51:01 | 显示全部楼层 |阅读模式
10金钱
STM32F031使用内部晶振倍频到48M,在SPI配置中使用8分频。但是实际时钟只有1M。这是怎么回事呀?求解
时钟配置:
static void SetSysClock(void)
{
  __IO uint32_t StartUpCounter = 0, HSIStatus = 0;

  /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/
  /* Enable HSI */   
  RCC->CR |= ((uint32_t)RCC_CR_HSION);//((uint32_t)RCC_CR_HSEON)

  /* Wait till HSI is ready and if Time out is reached exit */
  do
  {
    HSIStatus = RCC->CR & RCC_CR_HSIRDY;//RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSIStatus == 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));

  if ((RCC->CR & RCC_CR_HSIRDY) != RESET)//((RCC->CR & RCC_CR_HSERDY) != RESET
  {
    HSIStatus = (uint32_t)0x01;
  }
  else
  {
    HSIStatus = (uint32_t)0x00;
  }  

  if (HSIStatus == (uint32_t)0x01)
  {
    /* Enable Prefetch Buffer and set Flash Latency */
    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

    /* PCLK = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;
        /* PLL configuration = HSE * 6 = 48 MHz */
    /* PLL configuration = HSI/2 * 12 = 48 MHz */  
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC  | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_DIV2| RCC_CFGR_PLLMULL12);
         // RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6)



    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;

    /* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }

    /* Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   

    /* Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
    {
    }
  }
  else
  { /* If HSI fails to start-up, the application will have wrong clock
         configuration. User can add here some code to deal with this error */
  }

}



SPI配置:
void SPI_GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
          SPI_InitTypeDef  SPI_InitStructure;       
         
          /* 使能AHB时钟 */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
                  /* 使能APB2时钟 */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

  /*定义 SPI复用引脚 */
  GPIO_InitStructure.GPIO_Pin = PIN_SPI_SCK | PIN_SPI_MISO | PIN_SPI_MOSI;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                       //复用模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  //高速输出
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                     //推完输出
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                       //上拉
  GPIO_Init(PORT_SPI_SCK, &GPIO_InitStructure);
       

  GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_0);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_0);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_0);
       
  /* 片选CS */
  GPIO_InitStructure.GPIO_Pin = PIN_SPI_CS;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;                      //输出模式
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                     //推完输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  //高速输出
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                       //上拉
  GPIO_Init(PORT_SPI_CS, &GPIO_InitStructure);
       
  /* SPI 初始化定义 */
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI设置为双线双向全双工
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                      //设置为主 SPI
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                  //SPI发送接收 8 位帧结构
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                        //时钟悬空低
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                       //数据捕获于第二个时钟沿
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                          //软件控制 NSS 信号
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; //波特率预分频值为8
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                 //数据传输从 MSB 位开始
  SPI_InitStructure.SPI_CRCPolynomial = 7;                           //定义了用于 CRC值计算的多项式
  SPI_Init(SPI1, &SPI_InitStructure);

  SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);
  SPI_Cmd(SPI1, ENABLE);
       
//                GPIO_SetBits(GPIOB, GPIO_Pin_15);       
}


测试过系统时钟,内部时钟修改已成功,
微信图片_20200313164954.png

最佳答案

查看完整内容[请看2#楼]

我不清楚你这些数据是从哪里得来,看上去像是一个结构体,似乎是你自己算出来的 我想的是看RCC寄存器关于AHB和APB1 的配置,最好SPI的寄存器也看看,然后结合查看芯片手册对应的寄存器描述和时钟树查看对应的配置会产生什么样的效果。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
833
金钱
833
注册时间
2019-12-17
在线时间
157 小时
发表于 2020-3-13 16:51:02 | 显示全部楼层
密密123 发表于 2020-3-13 22:50
两个时钟的调试截图,

我不清楚你这些数据是从哪里得来,看上去像是一个结构体,似乎是你自己算出来的
我想的是看RCC寄存器关于AHB和APB1 的配置,最好SPI的寄存器也看看,然后结合查看芯片手册对应的寄存器描述和时钟树查看对应的配置会产生什么样的效果。

spi配置寄存器

spi配置寄存器

RCC配置寄存器

RCC配置寄存器
回复

使用道具 举报

6

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
833
金钱
833
注册时间
2019-12-17
在线时间
157 小时
发表于 2020-3-13 18:56:46 | 显示全部楼层
本帖最后由 y284858 于 2020-3-13 19:07 编辑

楼主你查看一下APB2和AHB的分频设置是多少
方便的话调试看看时钟树的配置
回复

使用道具 举报

4

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2019-5-22
在线时间
14 小时
 楼主| 发表于 2020-3-13 22:50:11 | 显示全部楼层
y284858 发表于 2020-3-13 18:56
楼主你查看一下APB2和AHB的分频设置是多少
方便的话调试看看时钟树的配置

两个时钟的调试截图,

48M

48M

56M

56M
回复

使用道具 举报

4

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2019-5-22
在线时间
14 小时
 楼主| 发表于 2020-3-16 10:55:07 | 显示全部楼层
y284858 发表于 2020-3-16 10:35
我不清楚你这些数据是从哪里得来,看上去像是一个结构体,似乎是你自己算出来的
我想的是看RCC寄存器关 ...

AHP总线和APB1都没问题。现在定位是逻辑分析仪速度不够,非常感谢你
回复

使用道具 举报

6

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
833
金钱
833
注册时间
2019-12-17
在线时间
157 小时
发表于 2020-3-16 11:34:27 | 显示全部楼层
密密123 发表于 2020-3-16 10:55
AHP总线和APB1都没问题。现在定位是逻辑分析仪速度不够,非常感谢你

也没帮上什么忙
8M的速度逻辑分析仪速度应该是可以跟上的,你可以试试使用示波器看看,
逻辑奉分析仪.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-22 15:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表