STM32G474之TIM1更新中断

2024-08-30 15:04
文章标签 更新 中断 tim1 stm32g474

本文主要是介绍STM32G474之TIM1更新中断,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

STM32G474之TIM1能产生如下的中断:

1、捕获比较1个事件(Capture compare 1 event)

用来获取“捕获输入脉冲的时间”,其次用来输出“比较输出波形”;

2、捕获比较2个事件(Capture compare 2 event)

3、捕获比较3个事件(Capture compare 3 event)

4、捕获比较4个事件(Capture compare 4 event)

5、TIM更新事件(TIM Update event)

定时器计数器溢出,产生更新事件

6、TIM刹车输入事件(TIM Break input event)

当刹车信号到达时,则产生刹车输入事件

7、TIM刹车2输入事件TIM Break2 input event

8、TIM触发器检测事件(TIM Trigger detection event)

9、TIM换向事件(TIM commutation event)

10、TIM编码器索引事件(TIM Encoder index event)

11、TIM方向更改事件(TIM Direction change event)

12、TIM索引错误事件(TIM Index error event)

13、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引脚输出电平翻转
    }
  }
}

测试结果:

这篇关于STM32G474之TIM1更新中断的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121155

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

hdu1689(线段树成段更新)

两种操作:1、set区间[a,b]上数字为v;2、查询[ 1 , n ]上的sum 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdl

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

AI行业应用(不定期更新)

ChatPDF 可以让你上传一个 PDF 文件,然后针对这个 PDF 进行小结和提问。你可以把各种各样你要研究的分析报告交给它,快速获取到想要知道的信息。https://www.chatpdf.com/

GIS图形库更新2024.8.4-9.9

更多精彩内容请访问 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信:digital_twin123 Cesium 本期发布了1.121 版本。重大新闻,Cesium被Bentley收购。 ✨ 功能和改进 默认启用 MSAA,采样 4 次。若要关闭 MSAA,则可以设置scene.msaaSamples = 1。但是通过比较,发现并没有多大改善。

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法   消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法 [转载]原地址:http://blog.csdn.net/x605940745/article/details/17911115 消除SDK更新时的“