STM32F103通用定时器使用

x33g5p2x  于2021-10-20 转载在 其他  
字(2.0k)|赞(0)|评价(0)|浏览(426)

STM32F103单片机中定时器分为3种,高级定时器、通用定时器、基本定时器。

通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作。

通用TIMx (TIM2、TIM3、TIM4和TIM5)定时器功能包括

  • 16位向上、向下、向上/向下自动装载计数器

  • 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值

  • 4个独立通道:

  • 输入捕获

  • 输出比较

  • PWM生成(边缘或中间对齐模式)

  • 单脉冲模式输出

  • 使用外部信号控制定时器和定时器互连的同步电路

  • 如下事件发生时产生中断/DMA:

  • 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)

  • 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)

  • 输入捕获

  • 输出比较

  • 支持针对定位的增量(正交)编码器和霍尔传感器电路

  • 触发输入作为外部时钟或者按周期的电流管理

可编程通用定时器的主要部分是一个16位计数器和与其相关的自动装载寄存器。这个计数器可以向上计数、向下计数或者向上向下双向计数。此计数器时钟由预分频器分频得到。计数器、自动装载寄存器和预分频器寄存器可以由软件读写,在计数器运行时仍可以读写。

void TIMER3_Init(u16 arr, u16 psc)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
	
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

    TIM_TimeBaseStructure.TIM_Period = arr;
    TIM_TimeBaseStructure.TIM_Prescaler = psc;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
	
    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);	//允许更新中断
	
    NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStructure);
	
    TIM_Cmd(TIM3,ENABLE);
}
void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
	{
		TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
		LED0=!LED0;
	}
}

这里使用的是定时器3,在初始化时传递了两个参数,其中arr用来设置定时器的周期,PSC设置时钟的分频系数。默认定时器的时钟频率为72MHz,所以带入这两个参数后,定时器的周期计算公式为:
(arr+1)/*(psc+1)/72MHz,设置定时器的计数模式为向上计数。这里开启了定时器的中断功能,所以还需要设置NVIC寄存器,也就是设置定时器的中断优先级。定时器初始化完成之后,还需要提供一个定时器的中断函数,当定时器定时时间到了以后,就会自动跳转到定时器中断函数中。

int main(void)
{
    u8 key = 0;
    delay_init();       //延时函数初始化
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    LED_Init();
    KEY_Init();  
    TIMER3_Init(9,71);		 //50Khz 10us 
    while(1)
    {      
    }
}

在主函数中初始化定时器,设置定时器分频数为71,默认的晶振频率为72MHz,进行71+1分频后的频率值为1Mhz,然后设置定时器的周期值为9+1,所以定时器的定时频率为1Mhz/(9+1)=100KHz,定时周期为10us。通过示波器观察LED管脚的电平,就可以看到LED管脚的电平每10us就会翻转一次。

相关文章