[STM32F1] 如何确认总线时钟配置正确?

[复制链接]
 楼主| mgarm 发表于 2016-4-11 10:46 | 显示全部楼层 |阅读模式
我在使用STM32F105外接8M,为了验证我的总线时钟配置,我分别用TIM1,和TIM3做了一个测试代码
void TimerTestInit(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef         NVIC_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
        //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;  
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;   
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
        NVIC_Init(&NVIC_InitStructure);

  TIM_TimeBaseStructure.TIM_Period = 10000;
  TIM_TimeBaseStructure.TIM_Prescaler =7200;  
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
  TIM_Cmd(TIM1, ENABLE);  
       
        //tim3
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
       

        //³õʼ»¯TIM2 (×¢£ºTIM2ʱÖÓΪ×ÜÏßʱÖÓµÄÁ½±¶£¬Ò²¾ÍÊÇ72MHz,ÏéÇé²Î¿¼STM32²Î¿¼ÊÖ²á7.2½Ú)
        TIM_TimeBaseStructure.TIM_Period =10000;                        //ÉÏÏÞÖµ
        TIM_TimeBaseStructure.TIM_Prescaler = 7200;                //Ô¤·ÖƵ
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1  ;        //Â˲¨Æ÷·ÖƵ
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        //
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
       
       
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);//ÖжÏÔÊÐí
        TIM_Cmd(TIM3, ENABLE);       
}

void TIM1_UP_IRQHandler(void)  
{  
        TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update);
        BEEP_FLASH;
}  
void TIM3_IRQHandler(void)
{
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);       
        LED_FLASH;
}
观察发现TIM1的中断频率是2秒,TIM3的中断频率是1秒;我配置的APB1总线频率是36M,APB2总线频率为72M
所以TIM3的中断频率应该是正确的,就不知道TIM1的中断频率为什么只有2秒???

 楼主| mgarm 发表于 2016-4-11 10:48 | 显示全部楼层
再贴上时钟配置:
  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]  Sets System clock frequency to 72MHz and configure HCLK, PCLK2
  3.   *         and PCLK1 prescalers.
  4.   * [url=home.php?mod=space&uid=536309]@NOTE[/url]   This function should be used only after reset.
  5.   * @param  None
  6.   * @retval None
  7.   */
  8. static void SetSysClockTo72(void)
  9. {
  10.   __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

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

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

  20.   if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  21.   {
  22.     HSEStatus = (uint32_t)0x01;
  23.   }
  24.   else
  25.   {
  26.     HSEStatus = (uint32_t)0x00;
  27.   }

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

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


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

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

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

  41. #ifdef STM32F10X_CL
  42.     /* Configure PLLs ------------------------------------------------------*/
  43.     /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
  44.     /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */

  45.     RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
  46.                               RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);

  47.     /* Configure PLLs ------------------------------------------------------*/
  48.     /* PLL2 configuration: PLL2CLK = (HSE / 2) * 10 = 40 MHz */
  49.     /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
  50.     RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV2 | RCC_CFGR2_PLL2MUL10 |
  51.                              RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);



  52.     /* Enable PLL2 */
  53.     RCC->CR |= RCC_CR_PLL2ON;
  54.     /* Wait till PLL2 is ready */
  55.     while((RCC->CR & RCC_CR_PLL2RDY) == 0)
  56.     {
  57.     }


  58.     /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
  59.     RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
  60.     RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |
  61.                             RCC_CFGR_PLLMULL9);
  62. #else
  63.     /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
  64.     RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
  65.                                         RCC_CFGR_PLLMULL));
  66.     RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
  67. #endif /* STM32F10X_CL */

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

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

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

  77.     /* Wait till PLL is used as system clock source */
  78.     while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
  79.     {
  80.     }
  81.   }
  82.   else
  83.   { /* If HSE fails to start-up, the application will have wrong clock
  84.          configuration. User can add here some code to deal with this error */
  85.   }
  86. }


  87. #endif
Roderman_z 发表于 2016-4-11 11:04 | 显示全部楼层
只能测试总线的读写时间了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

89

主题

252

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部