STM32定时器有几个?
我在网上还有STM32的固件库手册里面只看到了8个定时器,结果我在使用函数的时候点进去看却发现有17个定时器,TIM1 ~ TIM17 我真的是吓尿了,所以想问一下,那些TIM9到TIM17是从哪里冒出来的。他们是属于高级定时器还是通用定时器,他们的时候方法是怎样?
我用的型号是STM32F103ZET6。
![](../imgqa/ele/mcu/mcu-3721rd.com-34496brrnxenewif.png)
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定时器的,恩,大概了解了,谢谢你啦