问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32G474之TIM1更新中断详解

创作时间:
作者:
@小白创作中心

STM32G474之TIM1更新中断详解

引用
CSDN
1.
https://blog.csdn.net/weixin_42550185/article/details/141715003

STM32G474的TIM1定时器可以产生多种中断,包括:

  1. 捕获比较1个事件(Capture compare 1 event)
  • 用于获取“捕获输入脉冲的时间”,也可用于输出“比较输出波形”。
  1. 捕获比较2个事件(Capture compare 2 event)
  2. 捕获比较3个事件(Capture compare 3 event)
  3. 捕获比较4个事件(Capture compare 4 event)
  4. TIM更新事件(TIM Update event)
  • 当定时器计数器溢出时产生更新事件。
  1. TIM刹车输入事件(TIM Break input event)
  • 当刹车信号到达时产生刹车输入事件。
  1. TIM刹车2输入事件(TIM Break2 input event)
  2. TIM触发器检测事件(TIM Trigger detection event)
  3. TIM换向事件(TIM commutation event)
  4. TIM编码器索引事件(TIM Encoder index event)
  5. TIM方向更改事件(TIM Direction change event)
  6. TIM索引错误事件(TIM Index error event)
  7. TIM转换错误事件(TIM Transition error event)

定时器的功能非常丰富,我们从最基础的定时器计数器溢出产生中断开始学习,因为这个功能最为常用。

测试程序

#include "Timer1.h"  
#include "LED.h"  
#include "stm32g4xx_hal.h"

void Timer1_Init(void);

void Timer1_Init(void)  
{  
    TIM_HandleTypeDef htim1;  //TIM1句柄

    RCC_ClkInitTypeDef    clkconfig;  
    uint32_t              uwTimclock = 0;  
    uint32_t              pFLatency;  
    uint32_t              uwPrescalerValue = 0;

    __HAL_RCC_TIM1_CLK_ENABLE();//使能“定时器1”的时钟,Enable TIM1 clock  
    HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);//Get clock configuration  
    uwTimclock = HAL_RCC_GetPCLK2Freq();  
    //读取PCLK2的时钟频率,Return the PCLK2 frequency  
    //若PCLK2的分频器值为1,则和SystemCoreClock的值相等  
    //uwTimclock=170000000Hz  
    uwPrescalerValue = (uint32_t) ((uwTimclock / 10000U) - 1U);  
    //uwPrescalerValue=17000

    htim1.Instance = TIM1;  
    htim1.Init.Period = (1000000U / 1000U) - 1U;  
    //定时器周期999  
    htim1.Init.Prescaler = uwPrescalerValue;  
    //设置TIM1预分频器为uwPrescalerValue  
    htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;  
    //设置时钟分频系数,TIM1_CR1中的CKD[9:8]=00b,tDTS=ttim_ker_ck;  
    //溢出时间为(990+1)*1*17000/170000000/1=0.1秒  
    htim1.Init.CounterMode = TIM_COUNTERMODE_UP;  
    htim1.Init.RepetitionCounter = 0;//重复计数(1-0)次,产生1次中断,比较重要  
    htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;  
    //使能“自动重装载”  
    HAL_TIM_Base_Init(&htim1);

    HAL_TIM_Base_Start_IT(&htim1);  
    HAL_NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn);//使能TIM1产生中断  
    HAL_NVIC_SetPriority(TIM1_UP_TIM16_IRQn, 5, 0U);  
    //设置NVIC中断分组4:4位抢占优先级,0位响应优先级  
    //选择中断优先级组4,即抢占优先级为4位,取值为0~15,响应优先级组为0位,取值为0  
    //这里设置TIM1中断优先级为5  
}

//TIM1“更新中断”和TIM16中断,共用一个中断源, TIM1每0.1秒中断一次   
void TIM1_UP_TIM16_IRQHandler(void)  
{
    if( (TIM1->SR & TIM_FLAG_UPDATE) == TIM_FLAG_UPDATE)  
    {//读取TIM1状态寄存器TIMx_SR的bit0(UIF),UIF=1表示产生了“TIM1更新事件”  
        if( (TIM1->DIER & TIM_IT_UPDATE)  == TIM_IT_UPDATE )  
        {//读取TIM1中断使能寄存器TIMx_DIER的bot0(UIE),查看UIE=1?  
            TIM1->SR = ~(TIM_IT_UPDATE);  
            LED1_Toggle(); //LED1引脚输出电平翻转  
        }  
    }  
}

测试结果

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号