当前位置:文档之家› STM32定时时间的计算

STM32定时时间的计算

STM32 定时器定时时间的计算
假设系统时钟是72Mhz,TIM1 是由PCLK2 (72MHz)得到,TIM2-7是由 PCLK1 得到关键是设定时钟预分频数,自动重装载寄存器周期的值/*每1秒发生一次更新事件(进入中断服务程序)。

RCC_Configuration()的SystemInit()的
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2表明TIM3CLK为72MHz。

因此,每次进入中断服务程序间隔时间为:
((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72M)*(1+9999)=1秒。

定时器的基本设置如下:
1、TIM_TimeBaseStructure.TIM_Prescaler = 7199;//时钟预分频数例如:时钟频率=72/(时钟预分频+1)。

2、TIM_TimeBaseStructure.TIM_Period = 9999; // 自动重装载寄存器周期的值(定时时间)累计 0xFFFF个频率后产生个更新或者中断(也是说定时时间到)。

3、TIM_TimeBaseStructure.TIM_CounterMode=TIM1_CounterMode_Up; //定时器模式向上计数。

4、 TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //时间分割值。

5、 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//初始化定时器2。

6、 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打开中断溢出中断。

7、 TIM_Cmd(TIM2, ENABLE);//打开定时器或者:
TIM_TimeBaseStructure.TIM_Prescaler = 35999;//分频35999,72M/
(35999+1)/2=1Hz 1秒中断溢出一次。

8、 TIM_TimeBaseStructure.TIM_Period = 2000; //计数值2000
((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+35999)/72M)*(1+2000)=1秒。

9、注意使用不同定时器时,要注意对应的时钟频率。

例如TIM2对应的是APB1,而TIM1对应的是APB2
通用定时器实现简单定时功能
以TIME3为例作为说明,简单定时器的配置如下:
void TIM3_Config(void)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
TIM_DeInit(TIM3); //复位TIM2定时器
/* TIM2 clock enable [TIM2定时器允许]*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/* TIM2 configuration */
TIM_TimeBaseStructure.TIM_Period = 49; // 0.05s定时
TIM_TimeBaseStructure.TIM_Prescaler = 35999; // 分频36000
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分割TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数方向向上计数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
/* Clear TIM2 update pending flag[清除TIM2溢出中断标志] */
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
/* Enable TIM2 Update interrupt [TIM2溢出中断允许]*/
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
/* TIM2 enable counter [允许tim2计数]*/
TIM_Cmd(TIM3, ENABLE);
}
通用定时器实现外部脉冲计数功能(对外部时间计数)
以TIME2为例作为说明,提供一个小程序以供参考(只提供主程序,不提供其它的基础配置):
int main(void)
{
#ifdef DEBUG
debug();
#endif
inti_Loop;
intn_Counter;
RCC_Configuration(); // System Clocks Configuration
NVIC_Configuration(); // NVIC configuration
GPIO_Configuration(); // Configure the GPIO ports
USART_ART_BaudRate = 115200;
USART_ART_WordLength = USART_WordLength_8b;
USART_ART_StopBits = USART_StopBits_1;
USART_ART_Parity = USART_Parity_No ;
USART_ART_HardwareFlowControl=USART_HardwareFlowContr ol_None;
USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_ART_Clock = USART_Clock_Disable;
USART_ART_CPOL = USART_CPOL_Low;
USART_ART_CPHA = USART_CPHA_2Edge;
USART_ART_LastBit = USART_LastBit_Disable;
/* Configure the USARTx */
USART_Init(USART1, &USART_InitStructure);
/* Enable the USARTx */
USART_Cmd(USART1, ENABLE)
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // Time base
configuration
TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF,
TIM_ExtTRGPolarity_NonInverted, 0);
TIM_SetCounter(TIM2, 0);
TIM_Cmd(TIM2, ENABLE);
for(i_Loop = 0; i_Loop< 1000; i_Loop ++)
{
GPIO_SetBits(GPIOC, GPIO_Pin_6);
Delay(100);
GPIO_ResetBits(GPIOC, GPIO_Pin_6);
Delay(100);
}
n_Counter = TIM_GetCounter(TIM2);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); printf("检测到的脉冲个数为:%d\n",n_Counter);
while (1) {
}
}。

相关主题