OpenEdv-开源电子网

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

STM32时钟设置的疑问

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2013-12-31
在线时间
0 小时
发表于 2013-12-31 16:30:47 | 显示全部楼层 |阅读模式

CPU是STM32107VC,外部时钟晶振是25M的。

示例程序里边,SystemInit()内容如下:

void SystemInit (void)
{
  /* Reset the RCC clock configuration to the default reset state(for debug purpose) */
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;

  /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
#ifndef STM32F10X_CL
  RCC->CFGR &= (uint32_t)0xF8FF0000;
#else
  RCC->CFGR &= (uint32_t)0xF0FF0000;
#endif /* STM32F10X_CL */  
 
  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;

  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;

  /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
  RCC->CFGR &= (uint32_t)0xFF80FFFF;

#ifdef STM32F10X_CL
  /* Reset PLL2ON and PLL3ON bits */
  RCC->CR &= (uint32_t)0xEBFFFFFF;

  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x00FF0000;

  /* Reset CFGR2 register */
  RCC->CFGR2 = 0x00000000;
#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x009F0000;

  /* Reset CFGR2 register */
  RCC->CFGR2 = 0x00000000;     
#else
  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x009F0000;
#endif /* STM32F10X_CL */
   
#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)
  #ifdef DATA_IN_ExtSRAM
    SystemInit_ExtMemCtl();
  #endif /* DATA_IN_ExtSRAM */
#endif

  /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */
  /* Configure the Flash Latency cycles and enable prefetch buffer */
  SetSysClock();

#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif
}

 

加粗的那句代码看不懂了,因为该语句是设置USB的时钟,USB时钟48M,该语句RCC->CFGR &= (uint32_t)0xFF80FFFF;是将第16~22位清零。

但是我看着该语句去查询数据手册,

将OTGFSPRE,PLLMUL,PLLXTPRE,PLLSRC清零,
该设置应该是将HSI振荡器2分频后作为PLL输入时钟啊,而USBCLK = 2*PLLCLK/3,的出来的怎么会是48M呢?

不解,请求大家解答一下
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2384
金钱
2384
注册时间
2012-11-22
在线时间
403 小时
发表于 2013-12-31 17:09:41 | 显示全部楼层
48M是指使用外部25M晶振的时候,此时PLLCLK为72M。当使用内部晶振,系统时钟最高36M,USBCLK不可能达到48M的。
态度决定一切
回复 支持 反对

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2384
金钱
2384
注册时间
2012-11-22
在线时间
403 小时
发表于 2013-12-31 17:12:27 | 显示全部楼层






你看手册,当使用内部时钟,USB是没法使用的。
态度决定一切
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2013-12-31
在线时间
0 小时
 楼主| 发表于 2013-12-31 17:16:05 | 显示全部楼层
回复【3楼】冰封嗜魔:
---------------------------------
按理说是这样子的,但是我对应手册,得出来的就是使用HSI时钟,难道是我的数据手册不对么
也不太可能啊
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2013-12-31
在线时间
0 小时
 楼主| 发表于 2013-12-31 17:18:09 | 显示全部楼层
回复【3楼】冰封嗜魔:
---------------------------------
如果让PREDIV1做系统时钟,应该将PLLSRC置1的啊
回复 支持 反对

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2384
金钱
2384
注册时间
2012-11-22
在线时间
403 小时
发表于 2013-12-31 18:06:59 | 显示全部楼层
回复【4楼】liucuicui:
---------------------------------
怎么可能是内部时钟,那边只是复位,真正设置时钟在这边 SetSysClock();
态度决定一切
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 07:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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