打印

关于APB1总线上设备的时钟问题?

[复制链接]
6335|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yhcbjnjx|  楼主 | 2010-11-17 10:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
看STM32的资料上写着APB1总线上的设备最高可以到36MHz,可是仿真的时候显示为72MHz,用示波器看也没发现问题,难道器件手册上写错了????谁知道是为什么?附件为仿真截图。


沙发
香水城| | 2010-11-17 12:00 | 只看该作者
1)检查你的配置对不对
2)不建议用软仿真,BUG很多。
3)芯片不做错误检查,超频的后果自负。

使用特权

评论回复
板凳
yhcbjnjx|  楼主 | 2010-11-17 13:17 | 只看该作者
谢谢您的回复,我检查了一下配置没问题,串口和其他的外设都是正常的;如果不用软件仿真我该如何知道当前的APB1总线上外设的频率啊?还有STM32真的可以超频吗?在什么情况下该怎样超啊?等待您的回复!! 2# 香水城

使用特权

评论回复
地板
香水城| | 2010-11-17 14:58 | 只看该作者
1)通过简单的外设配置产生输出波形,可以很容易地知道当前的APB1总线上外设的频率。比如配置USART并发送一个数据(如0x55、0xAA),然后通过示波器测量即可;还可以配置定时器产生一个PWM输出,再通过示波器测量。

2)从硬件上讲,STM32不限制超频,但强烈不建议这么做,所以在什么情况下都不应该超。

使用特权

评论回复
5
yhcbjnjx|  楼主 | 2010-11-17 15:31 | 只看该作者
我用PWM测了一下,时钟确认是72MHz的;可是没有找到是哪条语句引起的;从截图上可以看出PCLK1现在确实是36MHz,只是TIMx的时钟是72MHz;您可不可以提供一些线索呢?我使用的是V3.0.0的库函数,STM32F103,16M时钟输入,谢谢!! 4# 香水城

使用特权

评论回复
6
香水城| | 2010-11-17 15:36 | 只看该作者
TIMx的时钟可以到72MHz,这不奇怪。

使用特权

评论回复
7
yhcbjnjx|  楼主 | 2010-11-17 15:43 | 只看该作者
我应该设置那几个寄存器才能把时钟设置到36MHz呢? 6# 香水城

使用特权

评论回复
8
yhcbjnjx|  楼主 | 2010-11-17 15:47 | 只看该作者
我把库函数中设置时钟的部分贴出来,您给看一下,谢谢!
void SystemInit (void)
{
  /*!< RCC system reset(for debug purpose) */
  /*!< Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;
  /*!< Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], ADCPRE[1:0] and MCO[2:0] bits */
  RCC->CFGR &= (uint32_t)0xF8FF0000;  
  /*!< Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;
  /*!< Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;
  /*!< Reset PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE bits */
  RCC->CFGR &= (uint32_t)0xFF80FFFF;
  /*!< Disable all interrupts */
  RCC->CIR = 0x00000000;
   
  /*!< Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */
  /*!< Configure the Flash Latency cycles and enable prefetch buffer */
  SetSysClock();

}

static void SetSysClock(void)
{
#ifdef SYSCLK_FREQ_HSE
  SetSysClockToHSE();
#elif defined SYSCLK_FREQ_20MHz
  SetSysClockTo20();
#elif defined SYSCLK_FREQ_36MHz
  SetSysClockTo36();
#elif defined SYSCLK_FREQ_48MHz
  SetSysClockTo48();
#elif defined SYSCLK_FREQ_56MHz
  SetSysClockTo56();  
#elif defined SYSCLK_FREQ_72MHz
  SetSysClockTo72();
#endif

/*!< If none of the define above is enabled, the HSI is used as System clock
    source (default after reset) */
}


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 != HSEStartUp_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;
   
    /*!< PLLCLK = 12MHz * 6 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL9); //HSE输入,HSE二分频,倍频9
//        RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC | 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)0x08)
    {
    }
  }
  else
  { /*!< If HSE fails to start-up, the application will have wrong clock
         configuration. User can add here some code to deal with this error */   

    /*!< Go to infinite loop */
    while (1)
    {
    }
  }
}

使用特权

评论回复
9
yhcbjnjx|  楼主 | 2010-11-17 16:13 | 只看该作者
您好,我看了一下芯片手册,定时器2到7的工作频率最高到72MHz,这是正常的频率,并不是您所说的超频造成的;挂接在APB1总线上的设备除了定时器以外,其他的设备最高频率为36MHz;有图为证:
不知道我说的对不对?

使用特权

评论回复
10
香水城| | 2010-11-17 16:40 | 只看该作者
你说的对!

请你看我在6楼的帖子,我说TIMx到72MHz是正常的,我并没有说这是超频造成的。

我说超频是针对楼主位,显示APB1的频率为72MHz,不好混淆了,:lol

使用特权

评论回复
11
yhcbjnjx|  楼主 | 2010-11-17 18:05 | 只看该作者
谢谢您的耐心解答;那这样的话定时器1与定时器8的最高频率就是144MHz了;

使用特权

评论回复
12
香水城| | 2010-11-17 18:52 | 只看该作者
凭什么说定时器1与定时器8的最高频率就是144MHz?

任何定时器的工作频率最高只能到72MHz!

使用特权

评论回复
13
jack_shine| | 2010-11-18 09:23 | 只看该作者
路过学习~~~

使用特权

评论回复
14
guangods| | 2013-10-17 11:10 | 只看该作者
APB1的频率是36MHZ,APB2的频率才是72MHz

使用特权

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

本版积分规则

20

主题

64

帖子

1

粉丝