打印
[STM32F1]

请教一个时钟的问题

[复制链接]
1001|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ujszmc|  楼主 | 2015-6-30 11:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
STM32F107库函数默认系统时钟是72MHz,但是APB1最大只能36MHz,那么为什么APB1上的外设也能正常工作呢?
沙发
豆腐块| | 2015-6-30 11:34 | 只看该作者
默认系统时钟是72MHz,在应用时,有另配置吗

使用特权

评论回复
板凳
ujszmc|  楼主 | 2015-6-30 11:37 | 只看该作者
豆腐块 发表于 2015-6-30 11:34
默认系统时钟是72MHz,在应用时,有另配置吗

没有啊,比如我用的USART2是APB1上的外设,时钟默认的72MHz,USART2也能正常运行

使用特权

评论回复
地板
amanda_s| | 2015-6-30 15:31 | 只看该作者
没太看懂楼主的问题。系统时钟72MHz,为什么APB1上的外设不能正常运行呢?只是它的clock最大只能到36MHz罢了。

使用特权

评论回复
5
lwsn| | 2015-6-30 15:40 | 只看该作者
我也不太明白

使用特权

评论回复
6
yinhaix| | 2015-6-30 15:44 | 只看该作者

使用特权

评论回复
7
ujszmc|  楼主 | 2015-6-30 17:40 | 只看该作者
amanda_s 发表于 2015-6-30 15:31
没太看懂楼主的问题。系统时钟72MHz,为什么APB1上的外设不能正常运行呢?只是它的clock最大只能到36MHz罢了 ...

这样啊,我以为必须把APB1配置到36MHz或以下,外设才可以正常运行呢。谢谢了

使用特权

评论回复
8
lgq1542380129| | 2015-7-1 11:02 | 只看该作者
系统时钟初始化里已经把APB1设置为36MHz。APB1总线下挂载的片上外设,时钟配置不能超过36MHz。有误得话,请您指正

使用特权

评论回复
9
ujszmc|  楼主 | 2015-7-5 16:18 | 只看该作者
lgq1542380129 发表于 2015-7-1 11:02
系统时钟初始化里已经把APB1设置为36MHz。APB1总线下挂载的片上外设,时钟配置不能超过36MHz。有误得话,请 ...

你和4楼说的不一样,后来我在system_stm32f10x.c中找到了这样的代码,我觉得你说的是对的。
static void SetSysClockTo72(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/   
  /* Enable HSE */   
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

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

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

  if (HSEStatus == (uint32_t)0x01)
  {
    /* Enable Prefetch Buffer */
    FLASH->ACR |= FLASH_ACR_PRFTBE;

    /* Flash 2 wait state */
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;   


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

    /* PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;

    /* PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;

   。。。
这是库函数里设置系统时钟频率为72MHz的函数,最后几句话分别是设置AHB,APB2和APB1,因为系统时钟已经在上面设置为72MHz,所以 RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;就是将APB1设置为36MHz

使用特权

评论回复
10
lgq1542380129| | 2015-7-5 17:10 | 只看该作者
ujszmc 发表于 2015-7-5 16:18
你和4楼说的不一样,后来我在system_stm32f10x.c中找到了这样的代码,我觉得你说的是对的。
static void  ...

单独配置,APB1下的外设,时钟不能超过36MHZ的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

10

帖子

0

粉丝