Stm32学习笔记三————定时器TIM

轻则失根,躁则失君

1、STM32103定时器介绍

STM32F103系列的单片机一共有11个定时器,其中:

    2个高级定时器(TIM1和TIM8):高级定时器不但具有基本,通用定时器的所有的功能,还具有控制交直流电动
机所有的功能,你比如它可以输出6路互补带死区的信号,刹车功能等等;
    4个通用定时器(TIM2-TIM5):除了基本的定时器的功能外,还具有测量输入信号的脉冲长度( 输入捕获) 或者
产生输出波形( 输出比较和PWM);
    2个基本定时器(TIM6和TIM7):只有最基本的定时功能,。基本定时器TIM6和TIM7各包含一个16位自动装载
计数器,由各自的可编程预分频器驱动;
    2个看门狗定时器
    1个系统嘀嗒定时器

除去看门狗定时器和系统滴答定时器的八个定时器又可以分成3个组;

   TIM1和TIM8是高级定时器
   TIM2-TIM5是通用定时器
   TIM6和TIM7是基本的定时器

这8个定时器都是16位的,它们的计数器的类型除了基本定时器TIM6和TIM7都支持向上,向下,向上/向下这3种计数模式

   向上计数模式:从0开始,计到arr预设值,产生溢出事件,返回重新计时;
   向下计数模式:从arr预设值开始,计到0,产生溢出事件,返回重新计时;
   中央对齐模式:从0开始向上计数,计到arr产生溢出事件,然后向下计数,计数到1以后,又产生溢出,然后再
从0开始向上计数。(此种技术方法也可叫向上/向下计数)

通用定时器的时钟来源

   a:内部时钟(CK_INT)	
   b:外部时钟模式1:外部输入脚(TIx)
   c:外部时钟模式2:外部触发输入(ETR)
   d:内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器

死区时间(目前还没有做深入研究)

    H桥电路为避免由于关断延迟效应造成上下桥臂直通,有必要设置死区时间
    死区时间可有效地避免延迟效应所造成的一个桥臂未完全关断,而另一桥臂又处于导通状态,避免直通炸开关管。
    死区时间越大,电路的工作也就越可靠,但会带来输出波形的失真以及降低输出效率。
    死区时间小,输出波形要好一些,但是会降低系统的可靠性,一般这个死区时间设置为us级

元器件死区时间是不可以改变的,它主要是取决于元器件的制作工艺和材料!

    原则上死区时间当然越小越好。设置死区时间的目的,其实说白了就是为了电路的安全。最佳的设置方法是:在
保证安全的前提下,设置的死区时间越小越好。以不炸功率管、输出不短路为目的。

2、创建工程项目,勾选固件库

   选中:CMSIS>CORE;Device>Startup;>StdPeriph Drivers>EXTI;>Framework;>GPIO;>RCC;>TIM;等

3、通用定时器定时设置

void Tim2_Init(u32 Period, u32 Prescaler)
{
   //时钟开启TIM2
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
   
   //结构体_定时器基础-声明
   TIM_TimeBaseInitTypeDef TIM_TBIS;
   TIM_DeInit(TIM2);
    //自动重装载寄存器的值
   TIM_TBIS.TIM_Period = Period;
   //时钟预分频数
   TIM_TBIS.TIM_Prescaler = Prescaler;
    //向上计数模式
   TIM_TBIS.TIM_CounterMode = TIM_CounterMode_Up;
    //采样分频
   TIM_TBIS.TIM_ClockDivision = TIM_CKD_DIV1;
   //结构体_定时器基础-结束配置
   TIM_TimeBaseInit(TIM2, &TIM_TBIS);

   TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
   //开关_定时器总开关
   TIM_Cmd(TIM2, ENABLE);

   NVIC_InitTypeDef NVIC_InitS;
	//选择第0组优先级设置
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
   //TIM2中断
   NVIC_InitS.NVIC_IRQChannel = TIM2_IRQn;
   //IRQ通道被使能
   NVIC_InitS.NVIC_IRQChannelCmd = ENABLE;
   //从优先级3级
   NVIC_InitS.NVIC_IRQChannelSubPriority = 0;
   //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
   NVIC_Init(&NVIC_InitS);
}

4、STM32通用定时器延时函数

void TIM2_Delay_ms(uint16_t ms)
{
   //时钟开启TIM2
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
   //结构体_定时器基础-声明
   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
   //结构体_定时器基础-定时器分频设置,时钟预分频数为36000
   TIM_TimeBaseInitStruct.TIM_Prescaler= 35999;
   //结构体_定时器基础-定时器顶端设置
   TIM_TimeBaseInitStruct.TIM_Period=ms*2;
   //结构体_定时器基础-结束配置
   TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
   //设定定时时间到来以后停止定时器计数
   TIM_SelectOnePulseMode(TIM2, TIM_OPMode_Single);
   //开启SR中的UI标志
   TIM_ClearFlag(TIM2, TIM_IT_Update);
   //开关_定时器总开关
   TIM_Cmd(TIM2, ENABLE);
   //检测定时时间是否到来
   while(TIM_GetFlagStatus(TIM2, TIM_IT_Update)==RESET);
    //软件清除更新标志
   TIM_ClearFlag(TIM2, TIM_IT_Update);
}

定时用到的寄存器 :

1.arr寄存器
2.psc寄存器
3.模式寄存器 (向上,向下,先向上然后向下,先向下然后向上)

A R R ∗ P S C / 72000000 = ARR*PSC/72000000 = ARRPSC/72000000=定时时间

5、参考链接

  • STM32F103定时器详解
    https://blog.csdn.net/qq_31339221/article/details/70333973
    https://www.cnblogs.com/zjvskn/p/5751591.html

  • STM32定时器配置
    https://blog.csdn.net/qq646497210/article/details/79887073
    https://blog.csdn.net/lushoumin/article/details/78976147
    https://blog.csdn.net/Lorain_Lynies/article/details/52215921
    https://www.cnblogs.com/pertor/p/9488813.html
    https://blog.csdn.net/private_void_main/article/details/81491015
    https://mrs.pub/stm32/1525.html

  • NVIC_PriorityGroupConfig()说明
    https://blog.csdn.net/zhuminzeng/article/details/8880138

你可能感兴趣的:(stm32学习笔记)