精华内容
下载资源
问答
  • STM32定时器中断程序代码
    2022-04-11 09:44:44

    定时器中断

    定时器中断

    void TIM1_Int_Init(u16 arr, u16 psc)
    {
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);          //时钟使能
    这里经常不注意,APB12前后要对应
        TIM_TimeBaseStructure.TIM_Period = arr;                    //重装载值
        TIM_TimeBaseStructure.TIM_Prescaler = psc;                 //预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;    //时钟分割,用不到
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;           //定时器1和8需要填这个
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);               //初始化定时器
        TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE );                   //定时器中断配置,更新中断
    
        NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;               
        NVIC_Init(&NVIC_InitStructure);                               //NVIC配置
        TIM_Cmd(TIM1, ENABLE);                                        //使能定时器
    }
    
    void TIM1_UP_IRQHandler(void)
    {
        if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
        {
    
        }
        TIM_ClearFlag(TIM1, TIM_IT_Update );
    }
    
    
    更多相关内容
  • stm32 定时器3实现精确的1s延时时基,LED灯以1s间隔黄绿蓝三盏灯循环闪烁,通过Proteus仿真看效果。
  • STM32 定时器中断实验

    2018-06-20 20:54:01
    基于STM32定时器中断实验,需要用KEIL 5打开,可直接下载仿真。基于STM32定时器中断实验,需要用KEIL 5打开,可直接下载仿真。
  • STM32定时器中断(HAL库),调试通过,欢迎下载,仅供学习参考
  • STM32定时器中断

    2010-12-16 10:40:29
    在万利199元开发板实现了定时功能,TIM2用作普通定时器,定时1s,时间到产生中断,同时控制LED点亮熄灭。
  • STM32 定时器中断

    千次阅读 2020-12-08 19:20:28
    通用定时器工作过程:

    通用定时器工作过程:
    在这里插入图片描述
    时钟选择:

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

    • 内部时钟(CK_INT)
    • 外部时钟模式1:外部输入脚(TIx)
    • 外部时钟模式2:外部触发输入(ETR)
    • 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。

    内部时钟选择
    在这里插入图片描述
    在这里插入图片描述
    时钟计算方法:
    在这里插入图片描述默认调用SystemInit函数情况下:
    SYSCLK=72M
    AHB时钟=72M
    APB1时钟=36M
    所以APB1的分频系数=AHB/APB1时钟=2
    所以,通用定时器时钟CK_INT=2*36M=72M

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

    • 向下计数模式(时钟分频因子=1(意思就是:CK_PSC=CK_CNT))

    在这里插入图片描述在这里插入图片描述

    • 向上计数模式(时钟分频因子=1)
      在这里插入图片描述
      在这里插入图片描述

    • 中央对齐计数模式(时钟分频因子=1 ARR=6)
      在这里插入图片描述
      在这里插入图片描述
      定时器中断实验相关寄存器:

    • 计数器当前值寄存器CNT
      在这里插入图片描述

    • 预分频寄存器TIMx_PSC

    在这里插入图片描述

    • 自动重装载寄存器(TIMx_ARR)
      在这里插入图片描述
    • 控制寄存器1(TIMx_CR1)
      在这里插入图片描述
    • DMA中断使能寄存器(TIMx_DIER)
      在这里插入图片描述

    常用库函数

    定时器参数初始化:

     void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
    ypedef struct
    {
      uint16_t TIM_Prescaler;//预分频系数的设置      
      uint16_t TIM_CounterMode;//计数模式   
      uint16_t TIM_Period;//自动装载值
      uint16_t TIM_ClockDivision;//输入捕获会用到 
      uint8_t TIM_RepetitionCounter;//高级定时器会用到
    } TIM_TimeBaseInitTypeDef; 
    TIM_TimeBaseStructure.TIM_Period = 4999;
    TIM_TimeBaseStructure.TIM_Prescaler =7199; 
    TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1; 
    TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up; 
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 
    

    定时器使能函数:

    void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
    

    定时器中断使能函数:

    void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
    

    状态标志位获取和清除:

    FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
    void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
    ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
    void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
    

    定时器中断实现步骤:

    • 能定时器时钟。
     RCC_APB1PeriphClockCmd();
    
    • 初始化定时器,配置ARR,PSC。
     TIM_TimeBaseInit();
    
    • 开启定时器中断,配置NVIC。
    void TIM_ITConfig();
          NVIC_Init();
    
    • 使能定时器。
    TIM_Cmd();
    
    • 编写中断服务函数。
    TIMx_IRQHandler();//中断函数要判断中断标志位,和手动清除中断标志位
    ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
    void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
    

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

    其中arr为你重装的值,

    psc是预分频计时器的值(预分频系数),

    Tclk是时钟频率

    Tclk/(psc+1)是定时器的时钟

    (psc+1))/Tclk*1是计算的计数器 减少/增加 一个数所用的时间;

    那么(psc+1))/Tclk*(arr+1)就是一次定时器的时间:

    然后继续重装arr再次计数,计时:

    就构成一个循环;

    • TIM2-TIM5的时钟不是直接来自于APB1,而是来自于输入为APB1的一个倍频器。这个倍频器的作用是:当APB1的预分频系数为1时,这个倍频器不起作用,当APB1的预分频系数为其他数值时(即预分频系数为2、4、8或16),这个倍频器起作用,定时器的时钟频率等于APB1的频率的2倍。
    • 分频系数就是对定时器时钟进行多少分频之后在使用,最好设置为定时器时钟的倍数,方便运算;重新装载值是计算这么多值,时间到了之后重新开始计算的值,每一次计数的时间为分频之后时钟的到时;

    假设定时器时钟为72M,分频系数设置为7200-1,那现在定时器的时钟为10kHz,每计一个数花费1/(10000)秒,重装值设置为5000-1,那一次溢出的时间为500ms。
    分频值是是指你将系统时钟的频率减小,假设时钟频率是 72Mhz,然后分频值是 7199,现在你的定时器值就是 10kHz,表示每计一个数,然后过了 1/(10^4)秒,然后你的重装值就是你的时间了,如果值是 9999,就表示定时时间为 1s。

    定时器配置代码:

    void TIM4_Init(u16 ar,u16 rs)
    {
    	TIM_TimeBaseInitTypeDef TIM_InitStrue;
    	NVIC_InitTypeDef NVIC_InitStrue;
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能定时器时钟
    	
    	TIM_InitStrue.TIM_Period=ar;//自动装载值
    	TIM_InitStrue.TIM_Prescaler=rs;//预分频系数的设置
    	TIM_InitStrue.TIM_CounterMode=TIM_CounterMode_Up;
    	TIM_InitStrue.TIM_ClockDivision=TIM_CKD_DIV1;//设置时钟分割:TDTS = Tck_tim
    	TIM_TimeBaseInit(TIM4,&TIM_InitStrue);//初始化定时器,对定时器进行配置
    	
    	TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);//开启定时器中断
    	
    	NVIC_InitStrue.NVIC_IRQChannel=TIM4_IRQn;
    	NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
    	NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=2;
    	NVIC_InitStrue.NVIC_IRQChannelSubPriority=2;
    	NVIC_Init(&NVIC_InitStrue);//初始化中断,设置中断的优先级
    
    	TIM_Cmd(TIM4,ENABLE);//使能定时器
    }
    
    void TIM4_IRQHandler(void)
    {
    	if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET)
    	{
    		LED1=!LED1;
    		TIM_ClearITPendingBit(TIM4,TIM_IT_Update);//清除中断标志位
    	}
    }	
    

    实验现象:LED0闪烁,时间间隔就是定时器的溢出时间

    展开全文
  • STM32定时器中断配置

    2021-10-21 10:22:06
    3.开启定时器中断,配置中断结构体 配置例子 #include "tim.h" #include "stm32f10x.h" void tim_config(void) { TIM_TimeBaseInitTypeDef TIMinitStructure;//定时器结构体 NVIC_InitTypeDef NVICinitStructure;...

    1.使能时钟 定时器时钟

    2.配置定时器结构体、使能

    3.开启定时器中断,配置中断结构体

    配置例子

    #include "tim.h"
    #include "stm32f10x.h"

    void tim_config(void)
    {
    TIM_TimeBaseInitTypeDef  TIMinitStructure;//定时器结构体
        NVIC_InitTypeDef    NVICinitStructure;//内核中断结构体
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//中断优先组函数
     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能定时器时钟

        TIMinitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//初始化预分频值
        TIMinitStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数模式
        TIMinitStructure.TIM_Period = 10000-1;//自动重装载值(ARR-1)
        TIMinitStructure.TIM_Prescaler = 7200-1;//预分频系数(PSC-1)

        TIM_TimeBaseInit(TIM2,&TIMinitStructure);//定时器初始化
        TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//定时器中断配置使能

      TIM_Cmd(TIM2,ENABLE);//定时器使能
        
       NVICinitStructure.NVIC_IRQChannel = TIM2_IRQn;
        NVICinitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVICinitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVICinitStructure.NVIC_IRQChannelSubPriority = 1;
        
      NVIC_Init(&NVICinitStructure);

    }

    4.中断服务函数(启动文件里)

    例子:LED定时每秒亮灭一次

     

    计算定时器配置多久中断一次

    Tout = [重装载值(ARR+1)*分屏系数(psc+1)]/TDK(定时器时钟)

    展开全文
  • cubemx配置stm32(四)__STM32定时器中断TIMER 1.建立工程并进行核心配置 根据文章2.使用cubemx配置stm32(二)__核心配置 进行如下配置: CubeMX新建工程 CubeMX图形配置调试时钟信号 CubeMX图形配置时钟树 CubeMX图形...

    cubemx配置stm32(四)__STM32定时器中断TIMER

    1.建立工程并进行核心配置

    根据文章2.使用cubemx配置stm32(二)__核心配置 进行如下配置:
    CubeMX新建工程
    CubeMX图形配置调试时钟信号
    CubeMX图形配置时钟树
    CubeMX图形配置调试接口

    (这里之前那个水星版的板子坏了,使用的是stm32F103c8核心板)
    请添加图片描述

    检查配置:

    请添加图片描述

    配置详解

    1.配置TIM1

    请添加图片描述

    (1). 上图第三步中任意选择一个定时器

    (2). Clock Source (时钟源):一般就直接选内部时钟 Internal Clock

    (3). prescalar 设置分频的(括号里标明了设置位数只能在16位及以下,不一样的芯片设置范围是不同的)
    这个芯片最高频率72M,设置分频72-1,分频后的频率为1M,即周期为1us

    (4). Counter Period //自动装载值 :计数大小,计数完成后,定时器中断一次 ,这里设置200-1,上述我们知道分频后的周期为1us,所以这里200us进入一次定时器

    (5). Trigger Event Selection :update event 定时器自动更新,选择后需要把更新中断打开,操作如下图

    请添加图片描述

    (6). Internal Clock Division :内部时钟的分频系数,一般不用设置,就是无分频

    生成代码后在main函数中调用定时器中断启动函数

    请添加图片描述

    编译后调试单片机

    打开 it.c (简称),找到tim的中断回调函数,打上断点,让程序全速运行,检查程序是否能进入中断回调函数中,并且能多次进入

    请添加图片描述

    这样stm32定时器中断就配置完成了

    2.关键代码讲解与应用

    1.生成初始化函数代码(手动添加了注释)

    static void MX_TIM1_Init(void)
    {
    
      /* USER CODE BEGIN TIM1_Init 0 */
    
      /* USER CODE END TIM1_Init 0 */
    
      TIM_ClockConfigTypeDef sClockSourceConfig = {0};
      TIM_MasterConfigTypeDef sMasterConfig = {0};
    
      /* USER CODE BEGIN TIM1_Init 1 */
    
      /* USER CODE END TIM1_Init 1 */
      htim1.Instance = TIM1;        //通用定时器1
      htim1.Init.Prescaler = 72-1; //分频系数
      htim1.Init.CounterMode = TIM_COUNTERMODE_UP;//向上计数器
      htim1.Init.Period = 200-1; //自动装载值
      htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;//时钟分频因子
      htim1.Init.RepetitionCounter = 0;
      htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
      if (HAL_TIM_Base_Init(&htim1) != HAL_OK) //按照上述设置定时器,并检错
      {
        Error_Handler();
      }
      sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
      if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
      {
        Error_Handler();
      }
      sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;//就是开始定时器中断后,中断完成后,自动再一次调用HAL_TIM_Base_Start_IT函数,不需要我们自己在回调函数中手动调用
      sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
      if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
      {
        Error_Handler();
      }
      /* USER CODE BEGIN TIM1_Init 2 */
    
      /* USER CODE END TIM1_Init 2 */
    
    }
    
    1. 相关函数的应用
    • HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);
    • HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim);
    • 两个函数一个是开启定时器中断,一个是关闭定时器中断
    • HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim); 定时器初始化 即定时器设置
    • 除了可以中断开始定时器还可以轮询的方式开启定时器HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim);但是这个一般不使用
    1. 相关小项目
      精确定时闪烁灯
    展开全文
  • STM32定时器中断实现

    2021-04-07 20:44:09
    3.开启定时器中断,配置NVIC 4.使能定时器 5.编写中断服务函数 void MY_TIM3_INIT(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; NVIC_InitTypeDef NVIC_InitStruct; //1.使能定时器时钟...
  • stm32定时器中断配置及使用

    千次阅读 2021-06-11 13:59:06
    stm32定时器中断配置及使用 我们以通用定时器time3为例说明 1.首先配置时钟源为内部时钟,分频和充装载值根据自己需要填入,后面讲怎么用这两个参数,计数方式选择,也根据自己需要填入,以下是我的配置 2.我选择...
  • STM32定时器中断设置方法

    千次阅读 2020-12-19 06:17:14
    今天调试了STM32定时器功能,STM32定时器比较多,但调试都是一样的,寄存器都是一一对应的。就拿TIM2举例说明。在网上搜了好多关于定时器的设置,但大多数都是一个版本,而且都是针对库函数操作的,让人看起来一头...
  • 记录在学习STM32系列单片机定时器过程中的详细注释,供初学者使用
  • 最近用STM32F103做点东西,设置了定时器中断,出现了定时器一直在正常工作但是主函数不能运行的情况,检查时发现标志位清除是在进入定时器中断函数的一开始就执行清除,查询资料发现有时会出现一些情况导致这个标志...
  • 本次实验建立在上两次实验上,稍加修改,通过TIM2定时器中断控制LED流水灯的闪烁时间,并且增加两个按键PA1、PA2,其中PA1控制LED流水灯的启动,8个灯先依次闪烁,时间间隔1s,然后8个灯同时闪烁且时间间隔1s,PA2控制...
  • STM32定时器中断代码

    2018-03-13 10:11:03
    STM32定时器中断实验代码,适合新手学习交流,代码有详细注释,易于理解学习
  • STM32 定时器 中断 简易入门, 介绍了TIM2 设置,产生1ms 一次溢出中断
  • STM32定时器中断产生PWM控制步进电机

    千次阅读 多人点赞 2021-10-12 20:56:52
    # 前言 控制步进电机可以使用PWM、定时器中断、延时,这里用的就是 定时器中断来让它转动。 # 一、硬件部分 ## 1.使用的硬件 板子用的是正点原子的STM32F103...
  • Period设置成0导致的
  • 1.1 STM32 通用定时器简介 1.2 硬件设计 1.3 软件设计 1.4 下载验证 1.1 STM32 通用定时器简介 STM32 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器(CNT)构成。STM32 的通用定时器可以...
  • 为了保证完整性,这里同时给出使用CUBEMX的配置过程。...4.配置定时器,开启中断 5.设置定时器参数 注意,最后记得在主函数 while 循环之前加上以下两句: HAL_TIM_Base_Start(&htim3); HAL_TIM_...
  • 我通过TIMER1输出四路PWM控制电机,通过TIMER2产生10ms定时器中断进行OLED菜单的操作。 程序如下: int main(void) { delay_init(); //延时函数初始化 //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// ...
  • STM32定时器中断程序,亲测能用。内有详细的讲解文档,很好的学习资料。
  • STM32 定时器中断定时器
  • STM32 定时器中断周期计算

    千次阅读 2020-07-17 15:16:42
    举例芯片:STM32F103RC 1.先看看计算公式: 定时中断发生的时间T: T = (arr+1)*(psc+1)/72M 当设置arr= 999,psc = 71999,T=1s 参考定时器3的配置函数,如下: void time3_Init(u16 arr,u16 psc) { TIM_...
  • STM32中断配置器,懒人STM32,一键搞定32定时器和外部中断,让32中断不再望城莫及,轻松写代码。
  • STM32定时器中断(战舰V3)

    千次阅读 2019-10-24 09:47:02
    STM32F1 的定时器功能十分强大,有 TIM1 和 TIM8 等高级定时器,也有 TIM2~TIM5 等通用定时器,还有 TIM6和 TIM7 等基本定时器。下面以通用定时器TIM3为例来简单介绍STM32定时器的使用。 STM32F1 的通用定时器是一...
  • stm32定时器中断程序执行后无法进入主程序。 void TIM3_IRQHandler(void) { u16 adcx; u16 dacval; if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM3, TIM_IT_...
  • 定时器中断函数内部: 串口函数设计的优先级: 定时器设计的优先级: 因此我认为不能使用串口输出函数的原因是:中断优先级的问题 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,966
精华内容 7,986
关键字:

stm32定时器中断

友情链接: Bluetooth.rar