精华内容
下载资源
问答
  • 定时器中断

    2020-11-04 14:39:55
    当进入优先级最高的定时器中断服务函数里,如果中断程序所消耗的时间超过定时器设置的中断周期,那么系统会先跑完中断程序,再进入下一次的定时器中断,主循环将无法跑下去。

    当进入优先级最高的定时器中断服务函数里,如果中断程序所消耗的时间超过定时器设置的中断周期,那么系统会先跑完中断程序,再进入下一次的定时器中断,主循环将无法跑下去。

    展开全文
  • 定时器中断实验

    2019-01-22 16:08:49
    定时器中断实验
  • 定时器中断实验题目要求:通过定时器中断配置,每500ms中断一次,然后中断服务函数中控制LED实现LED1状态取反(闪烁)。程序解析: 题目要求简单,选择通用定时器即可,比如选择TIM3,然后定时器需要一个时钟源,...

    定时器中断实验

    题目要求:

    通过定时器中断配置,每500ms中断一次,然后中断服务函数中控制LED实现LED1状态取反(闪烁)。

    程序解析:

    题目要求简单,选择通用定时器即可,比如选择TIM3,然后定时器需要一个时钟源,这里选择简单的内部时钟RCC寄存器中的APB1外设时钟使能寄存器作为输入的时钟源。然后题目要求500ms中断一次,这个时间是指定时器的溢出时间,而定时器的溢出时间由PSC预分频器的值、ARR自动重装载寄存器的值、定时器的输入频率Tclk决定。公式如下:

    Tout(溢出时间)=(ARR+1)(PSC+1)/Tclk

    在这道题目中,Tclk就是TIM3的输入频率。因为TIM3挂载在APB1下面,所以按道理TIM3的时钟频率应该等于APB1的时钟频率。但是由于有这么一句话:

    当APB1的时钟分频数为1的时候,TIM2~7的时钟为APB1的时钟;

    当APB1的时钟分频数不为1,那么TIM2~7的时钟频率将为APB1时钟的两倍。

    而在系统初始化的时候,就默认了APB1的时钟为2分频,它的时钟频率为36Mhz。所以TIM3的时钟频率应该为72Mhz。

    故当PSC=7199,ARR=4999(这两个值可以任意取,只要保证Tout=500ms即可),那么就可以得出Tout=500000us=500ms。

    由此可以知道程序中的中断配置的大概内容,如下:

    1. 首先要调用使能定时器时钟的函数。
    2. 然后使定时器初始化,并且配置ARR、PSC、计数模式。
    3. 其次调用中断配置函数,选择更新中断,并且使能。
    4. 再然后就是给定时器使能。
    5. 最后编写中断服务函数控制LED实现LED1状态取反(闪烁)。

    具体程序如下图(后面的注释比较详细):

    Timer.c程序:

    83485b7997b2a8bb389b8374dd7bbec5.png

    Timer.h程序文件:

    6f0b6d87b4678a7ee0ce7466358ff91b.png

    主函数main.c

    f7ec5826950ffaac2873383698404618.png

    欢迎留言,多多交流学习呀!

    展开全文
  • 51定时器中断

    2017-02-27 13:59:43
    51定时器中断
  • DSP时钟 gpio 外部中断 定时器中断 DSP时钟 gpio 外部中断 定时器中断
  • 【STM32】HAL库 STM32CubeMX教程六----定时器中断

    万次阅读 多人点赞 2019-08-13 09:10:04
    是我们学习STM32最频繁使用到的外设之一,所以一定要掌握好,这节我们讲解定时器中断,本系列教程将对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片:...

    前言:

    今天我们来学习定时器,32的定时器有着非常丰富的功能, 输入捕获/输出比较,PWM,中断等等。是我们学习STM32最频繁使用到的外设之一,所以一定要掌握好,这节我们讲解定时器中断,本系列教程将对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用

     

    所用工具:

    1、芯片: STM32F407ZET6/STM32F103ZET6

    2、STM32CubeMx软件

    3、IDE: MDK-Keil软件

    4、STM32F1xx/STM32F4xxHAL库 

    5

    知识概括:

    通过本篇博客您将学到:

    SMT32定时器原理

    STM32CubeMX创建定时器例程

    HAL库TIM定时器函数库

    定时器中断的创建与使用

    定时器简介:

    SMT32F1系列共有8个定时器:

    高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5);基本定时器(TIM6、TIM7)。

    SMT32F4系列共有15个定时器:

    高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5、TIM9~TIM14);基本定时器(TIM6、TIM7)。

     

    基本定时器功能(TIM6、TIM7):

    •  16位向上、向下、向上/下自动装载计数器
    •  16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
    • 触发DAC的同步电路 注:此项是TIM6/7独有功能.
    • 位于APB1总线上


    通用定时器(TIM2~TIM5)的主要功能:

    •  16位向上、向下、向上/下自动装载计数器
    • 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
    • 4 个独立通道(TIMx_CH1~4)可以用作:
    •                   测量输入信号的脉冲长度( 输入捕获) 
    •                   输出比较
    •                   单脉冲模式输出 
    •                   PWM输出(边缘或中间对齐模式) 
    • 支持针对定位的增量(正交)编码器和霍尔传感器电路 
    • 如下事件发生时产生中断/DMA:
    •                更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) 
    •               触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) 
    •               输入捕获  
    •               输出比较  
    • 位于APB1总线上


    高级定时器(TIM1,TIM8)的主要功能:

    • 高级定时器具有基本,通用定时器的所有的功能,
    • 还具有控制交直流电动机所有的功能,
    • 输出6路互补带死区的信号,刹车功能等等
    • 位于APB2总线上

    总括:基本定时器就是单纯的定时计数器,通用定时器多了四个通道,相对应的增加了功能,高级定时器具有基本,通用定时器的所有的功能,并且添加了其他功能

    定时器计数模式

    通用定时器可以向上计数、向下计数、向上向下双向计数模式。

    • 向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
    • 向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
    • 中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。

    简单地理解三种计数模式,可以通过下面的图形:

     

    计数时钟的选择

    计数器时钟可由下列时钟源提供:

    • 内部时钟(TIMx_CLK) 
    • 外部时钟模式1:外部捕捉比较引脚(TIx)
    • 外部时钟模式2:外部引脚输入(TIMx_ETR) 仅适用TIM2,3,4
    • 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。
       

    定时器的主从模式:   (选看)

    定时器一般是通过软件设置而启动,STM32的每个定时器也可以通过外部信号触发而启动,还可以通过另外一个定时器的某一个条件被触发而启动。这里所谓某一个条件可以是定时到时间、定时器超时、比较成功等许多条件。

    这种通过一个定时器触发另一个定时器的工作方式称为定时器的同步,发出触发信号的定时器工作于主模式接受触发信号而启动的定时器工作于从模式

    触发条件:

    定时器的四种主从机模式:

    •  外部触发模式1
    • IRC重置模式
    • 门控模式
    • 触发模式

    这个我们用的很少,介绍下主要是为了下面的讲解   如果需要全面了解,请参考 《STM32中文参考手册》 275页 定时器主从模式

    工程创建

    1设置RCC

    设置高速外部时钟HSE 选择外部时钟源

    2设置时钟

     

     

    我的是  外部晶振为8MHz 

    • 1选择外部时钟HSE 8MHz   
    • 2PLL锁相环倍频72倍
    • 3系统时钟来源选择为PLL
    • 4设置APB1分频器为 /2
    • 5  这时候定时器的时钟频率为72Mhz

    32的时钟树框图  如果不懂的话请看《【STM32】系统时钟RCC详解(超详细,超全面)》

    3定时器设置

    1选择TIM2

    2定时器时钟选择内部时钟

    Clock Source(时钟来源)       

    • 选项1 :Internal Clock  内部时钟 
    • 选项2 : ETR2 外部触发输入(ETR)(仅适用TIM2,3,4)

    Prtscaler (定时器分频系数)  : 7199

    Counter Mode(计数模式)    Up(向上计数模式)                    

    Counter Period(自动重装载值) :    4999     

    CKD(时钟分频因子) :       No Division 不分频 

    选项:  可以选择二分频和四分频                         

    auto-reload-preload(自动重装载)  :    Enable 使能

    TRGO Parameters    触发输出 (TRGO)               不使能    与本节无关,之后做详细介绍 

    TRGO:    定时器的触发信号输出  在定时器的定时时间到达的时候输出一个信号(如:定时器更新产生TRGO信号来触发ADC的同步转换,) 

    这两个为定时器主从模式配置,很少用到,我们用不到,所以全部关闭

    使能定时器中断:

             

    定时器溢出时间:

                                                

    这里我们 arr=4999  psc=7199 Tclk=72Mhz        Tout = (5000*7200)/72  us  = 500ms

    4项目文件设置

             

    • 1 设置项目名称
    • 2 设置存储路径
    • 3 选择所用IDE

       

    5创建工程文件

    然后点击GENERATE CODE  创建工程

    配置下载工具

    新建的工程所有配置都是默认的  我们需要自行选择下载模式,勾选上下载后复位运行

    函数讲解:

    HAL_TIM_IRQHandler(&htim2);

    定时器中断处理函数   在stm32f4xx_it.c的 TIM2_IRQHandler()定时器中断服务函数中

    这个函数的具体作用是判断中断是否正常,然后判断产生的是哪一类定时器中断(溢出中断/PWM中断.....),然后进入相应的中断回调函数

     

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

    在HAL库中,每进行完一个中断,并不会立刻退出,而是会进入到中断回调函数中,

    这里我们是使用定时器溢出中断回调函数

     

    •  void TIM3_IRQHandler(void)   首先进入中断函数
    •  HAL_TIM_IRQHandler(&htim2);之后进入定时器中断处理函数
    • 判断产生的是哪一类定时器中断(溢出中断/PWM中断.....) 和定时器通道
    •  void HAL_TIM_PeriodElapsedCallback(&htim2);    进入相对应中断回调函数
    • 在中断回调函数中添加用户代码

     

    你也可以在在stm32f1xx_it.c中找到中断回调函数

         __weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)   

    例程:

    定时器溢出时间为500ms,LED点亮延时500ms闪烁

     

    在main.c主函数上方初始化使能定时器2

      /* USER CODE BEGIN 2 */
        /*使能定时器1中断*/
        HAL_TIM_Base_Start_IT(&htim2);
      /* USER CODE END 2 */
    

    在main.c主函数下方添加中断回调函数

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
        static unsigned char ledState = 0;
        if (htim == (&htim2))
        {
            if (ledState == 0)
                HAL_GPIO_WritePin(GPIOE,GPIO_PIN_15,GPIO_PIN_RESET);
            else
                HAL_GPIO_WritePin(GPIOE,GPIO_PIN_15,GPIO_PIN_SET);
            ledState = !ledState;
        }
    }

    展开全文
  • //-------------------TIM2.c------------------------//#include "timer.h"#include "led.h"//通用定时器中断初始化,这里时钟选择为APB1的2倍,而APB1为36M,//arr:自动重装值。//psc:时钟预分频数//这里使用的是...

    //-------------------TIM2.c------------------------//

    #include "timer.h"

    #include "led.h"

    //通用定时器中断初始化,这里时钟选择为APB1的2倍,而APB1为36M,

    //arr:自动重装值。

    //psc:时钟预分频数

    //这里使用的是定时器2

    void Timerx_Init(u16 arr,u16 psc)

    {

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能

    TIM_TimeBaseStructure.TIM_Period = 5000; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值计数到5000为500ms

    TIM_TimeBaseStructure.TIM_Prescaler =(7200-1); //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率

    TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

    TIM_ITConfig(  //使能或者失能指定的TIM中断

    TIM2, //TIM3

    TIM_IT_Update  |  //TIM 中断源

    TIM_IT_Trigger,   //TIM 触发中断源

    ENABLE  //使能

    );

    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM3中断

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能

    NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

    TIM_Cmd(TIM2, ENABLE);  //使能TIMx外设

    }

    void TIM2_IRQHandler(void)   //TIM2中断

    {

    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源

    {

    TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源

    LED0=!LED0;

    }

    }

    //-------------------TIM2.H------------------------//

    #ifndef __TIMER_H__

    #define __TIMER_H__

    #include "sys.h"

    void Timerx_Init(u16 arr,u16 psc); //通用定时器2中断初始化,这里时钟选择为APB1的2倍,而APB1为36M

    void TIM2_IRQHandler(void);   //TIM2中断

    #endif

    展开全文
  • STM32 定时器中断定时器
  • stm32 高级定时器定时器中断实验
  • 程序在正点原子的基础上,融合了定时器中断和外部中断,可以直观地看出优先级的作用,希望可以帮到某些同学~
  • 定时器中断实验.docx

    2020-12-20 14:12:03
    stm32的定时器中断实验的学习,主要是了解定时器
  • 连最基础的stm32f103c8t6都有四个定时器,更高级的zet6,或者f4系列的有十几个定时器,相比arduino来说强大了太多,利用好了可以实现确定时间间隔的做某件事情,多个定时器中断可以用来做多件事情,不使用延时也能够...
  • 定时器中断实验LED

    2019-02-01 13:54:59
    这是一份基于STM32f10x系列战舰开发板写的定时器中断实验以LED灯形式展现。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,133
精华内容 4,453
关键字:

定时器中断