微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STM32定时器有几个?

STM32定时器有几个?

时间:10-02 整理:3721RD 点击:
有个问题想请教大家一下:
      我在网上还有STM32的固件库手册里面只看到了8个定时器,结果我在使用函数的时候点进去看却发现有17个定时器,TIM1 ~ TIM17      我真的是吓尿了,所以想问一下,那些TIM9到TIM17是从哪里冒出来的。他们是属于高级定时器还是通用定时器,他们的时候方法是怎样?
      我用的型号是STM32F103ZET6。


STM32F1系列的最多14个定时器+2个看门狗+1滴答定时器。STM32F100系列的就有TIM1-TIM7 和TIM12-TIM17 没有TIM8-TIM11,固件库为了兼容当然TIM1-TIM17都有操作函数了

STM32的定时器是个强大的模块,定时器使用的频率也是很高的,定时器可以做一些基本的定时,还可以做PWM输出或者输入捕获功能。
时钟源问题:
名为TIMx的有八个,其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在
APB1总线上。其中TIM1&TIM8称为高级控制定时器(advanced control timer).他们所在的APB2总线也比APB1总线要好。APB2可以工作在72MHz下,而APB1最大是36MHz。

恩,TIM0 ~ TIM8我了解一些,但是我在程序里面看到了TIM9 ~ TIM17,他们的是那种类型呢?
#define RCC_APB2Periph_AFIO              ((uint32_t)0x00000001)
#define RCC_APB2Periph_GPIOA             ((uint32_t)0x00000004)
#define RCC_APB2Periph_GPIOB             ((uint32_t)0x00000008)
#define RCC_APB2Periph_GPIOC             ((uint32_t)0x00000010)
#define RCC_APB2Periph_GPIOD             ((uint32_t)0x00000020)
#define RCC_APB2Periph_GPIOE             ((uint32_t)0x00000040)
#define RCC_APB2Periph_GPIOF             ((uint32_t)0x00000080)
#define RCC_APB2Periph_GPIOG             ((uint32_t)0x00000100)
#define RCC_APB2Periph_ADC1              ((uint32_t)0x00000200)
#define RCC_APB2Periph_ADC2              ((uint32_t)0x00000400)
#define RCC_APB2Periph_TIM1              ((uint32_t)0x00000800)
#define RCC_APB2Periph_SPI1              ((uint32_t)0x00001000)
#define RCC_APB2Periph_TIM8              ((uint32_t)0x00002000)
#define RCC_APB2Periph_USART1            ((uint32_t)0x00004000)
#define RCC_APB2Periph_ADC3              ((uint32_t)0x00008000)
#define RCC_APB2Periph_TIM15             ((uint32_t)0x00010000)
#define RCC_APB2Periph_TIM16             ((uint32_t)0x00020000)
#define RCC_APB2Periph_TIM17             ((uint32_t)0x00040000)
#define RCC_APB2Periph_TIM9              ((uint32_t)0x00080000)
#define RCC_APB2Periph_TIM10             ((uint32_t)0x00100000)
#define RCC_APB2Periph_TIM11             ((uint32_t)0x00200000)

恩,我感觉那个APB1还有APB2对于定时器来说是差不多的,他们都是由HCLK分频得到的,而且默认APB1为36M,APB2为72M,但换算到定时器里面都是72M的时间。
下面是系统分频的默认设置:
void RCC_Configuration(void)
{
        ErrorStatus HSEStartUpStatus;
        RCC_DeInit();
        RCC_HSEConfig(RCC_HSE_ON);
        HSEStartUpStatus = RCC_WaitForHSEStartUp();
        if(HSEStartUpStatus == SUCCESS)
        {
                RCC_HCLKConfig(RCC_SYSCLK_Div1);
                RCC_PCLK2Config(RCC_HCLK_Div1);
                RCC_PCLK1Config(RCC_HCLK_Div2);  
                FLASH_SetLatency(FLASH_Latency_2);
                FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
                RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
                RCC_PLLCmd(ENABLE);
                while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
                RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
                while(RCC_GetSYSCLKSource() != 0x08);
        }
}
貌似APB1也是可以工作于72M的频率下的,网上面还有资料里面都说APB1的最大频率是36M,但是我点入函数里面去看:
/**
  * @brief  Configures the Low Speed APB clock (PCLK1).
  * @param  RCC_HCLK: defines the APB1 clock divider. This clock is derived from
  *   the AHB clock (HCLK).
  *   This parameter can be one of the following values:
  *     @arg RCC_HCLK_Div1: APB1 clock = HCLK
  *     @arg RCC_HCLK_Div2: APB1 clock = HCLK/2
  *     @arg RCC_HCLK_Div4: APB1 clock = HCLK/4
  *     @arg RCC_HCLK_Div8: APB1 clock = HCLK/8
  *     @arg RCC_HCLK_Div16: APB1 clock = HCLK/16
  * @retval None
  */
void RCC_PCLK1Config(uint32_t RCC_HCLK)
{
  uint32_t tmpreg = 0;
  /* Check the parameters */
  assert_param(IS_RCC_PCLK(RCC_HCLK));
  tmpreg = RCC->CFGR;
  /* Clear PPRE1[2:0] bits */
  tmpreg &= CFGR_PPRE1_Reset_Mask;
  /* Set PPRE1[2:0] bits according to RCC_HCLK value */
  tmpreg |= RCC_HCLK;
  /* Store the new value */
  RCC->CFGR = tmpreg;
}
貌似APB1也是可以工作于72M,对于定时器TIM1,8来说,如果APB1是经过2分频的(就是默认36M)他们运算到TIM里面要倍频*2一次(如果APB1是1分频则不用倍频,否则都要倍频*2一次),所以换算到定时器里面应该没有区别。
额,其实我更想了解那个TIM9 ~ TIM17是怎么回事?我真的在手册里面没有见过,但是看库程序里面,貌似是可以使用的

有TIM17并不代表一个器件就一定有TIM1-TIM17十七个定时器

哦,原来固件库指的是为了兼容啊,每个STM32F10系列的不一样,我这款是多了一些TIM定时器的,恩,大概了解了,谢谢你啦

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top