定时器中断

本文详细解析STM32的三种定时器——高级定时器TIM1TIM8用于PWM电机控制,通用定时器TIM2~TIM5涵盖计时、PWM输出等功能,并介绍基本定时器TIM6TIM7驱动DAC的工作。讲解了通用定时器的工作原理、时钟配置、中断机制和实际应用案例,如500ms定时中断控制LED闪烁。
摘要由CSDN通过智能技术生成

三种 STM32 定时器

  • 高级定时器
    TIM1 TIM8
    用于 PWM 电机控制

  • 通用定时器
    TIM2 ~ TIM5
    用于定时计数,PWM输出,输入捕获,输出比较

  • 基本定时器
    TIM6 TIM7
    用于驱动 DAC

通用定时器的功能特点

  • 位于低速的 APB1 总线上
  • 支持向上,向下,中心对齐 三种计数模式,和自动重装载
  • 每个定时器都有四个通道
    1】输入捕获
    2】输出比较
    3】PWM 生成
    4】单脉冲模式输出
  • 可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路
  • 如下事件发生时产生中断/DMA:
    A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
    B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
    C.输入捕获
    D.输出比较
    E.支持针对定位的增量(正交)编码器和霍尔传感器电路
    F.触发输入作为外部时钟或者按周期的电流管理

通用定时器工作过程

在这里插入图片描述

四个部分

  1. 选择时钟
  2. 时基电路
  3. 输入捕获
  4. 输出比较

定时器中断

定时器的时钟来源
  • 内部时钟(CK_INT)——由APB1分频得来
  • 外部时钟模式 1:外部输入脚(TIx)
  • 外部时钟模式 2:外部触发输入(ETR)
  • 内部触发输入(ITRx):使用 A 定时器作为 B 定时器的预分频器(A 为 B 提供时钟)

定时器中断实现的步骤

  1. 使能定时器时钟
    该定时器的时钟挂载在 APB1 总线下,所以通过总线下的时钟使能函数来使能
    RCC_APB1PeriphClockCmd();
  2. 初始化定时器
    TIM_TimeBaseInit();
  3. 开启定时器,并设置中断
    TIM_ITConfig();
    NVIC_Init(();
  4. 使能定时器
    TIM_Cmd();
  5. 编写中断服务函数
    void TIM3_IRQHandler(void)
    if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
    {
    ----------
    TIM_ClearITPendingBit();//清除标志位
    }

目的

使用定时器中断配置,每 500ms 中断一次,然后中断服务函数控制 LED 实现 LED 灯状态的取反——闪烁
Tout=(ARR+1)(PSC+1)/Tcllk
溢出时间=(要设置的参数)
(预分频系数+1)/APB时钟经过倍频后的参数
ARR与PSC可以随便设置,但要满足上式

代码

timer.c

#include "timer.h"
#include "led.h"

void TIM3_Int_Init(u16 arr,u16 psc)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
	NVIC_InitTypeDef NVIC_InitStrue;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//在这里使用TIM3、
	/*使能定时器时钟*/
	TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStrue.TIM_Period=arr;
	TIM_TimeBaseInitStrue.TIM_Prescaler=psc;
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue);
	/*初始化定时器*/
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
	/*开启定时器中断*/
	NVIC_InitStrue.NVIC_IRQChannel=TIM3_IRQn;//在这里使用TIM3的中断
	NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=0;
	NVIC_InitStrue.NVIC_IRQChannelSubPriority=3;
	NVIC_Init(&NVIC_InitStrue);
	/*设置了中断*/
	TIM_Cmd(TIM3,ENABLE);
	/*使能定时器*/
}


void TIM3_IRQHandler(void)//编写中断服务函数,中断服务函数与配置函数写在一起,不参与main中
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
	{
		LED1=!LED1;/**/
		TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
	}
}

timer.h

#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"

void TIM3_Int_Init(u16 arr,u16 psc);

#endif

main.c

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "timer.h"
 int main(void)
 {	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	LED_Init();
	TIM3_Int_Init(49999,7199);//500ms
	while(1){
		LED0=!LED0;
		delay_ms(200);
	}
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值