-
定时器中断
2020-11-04 14:39:55当进入优先级最高的定时器中断服务函数里,如果中断程序所消耗的时间超过定时器设置的中断周期,那么系统会先跑完中断程序,再进入下一次的定时器中断,主循环将无法跑下去。当进入优先级最高的定时器中断服务函数里,如果中断程序所消耗的时间超过定时器设置的中断周期,那么系统会先跑完中断程序,再进入下一次的定时器中断,主循环将无法跑下去。
-
定时器中断实验
2019-01-22 16:08:49定时器中断实验 -
c51两个定时器中断冲突_STM32——定时器中断实验
2020-12-24 13:42:50定时器中断实验题目要求:通过定时器中断配置,每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。
由此可以知道程序中的中断配置的大概内容,如下:
- 首先要调用使能定时器时钟的函数。
- 然后使定时器初始化,并且配置ARR、PSC、计数模式。
- 其次调用中断配置函数,选择更新中断,并且使能。
- 再然后就是给定时器使能。
- 最后编写中断服务函数控制LED实现LED1状态取反(闪烁)。
具体程序如下图(后面的注释比较详细):
Timer.c程序:
Timer.h程序文件:
主函数main.c
欢迎留言,多多交流学习呀!
-
51定时器中断
2017-02-27 13:59:4351定时器中断 -
DSP时钟 gpio 外部中断 定时器中断
2017-11-05 10:54:22DSP时钟 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; } }
-
tsm2812通用定时器中断_通用定时器中断(TIM2)
2021-01-17 16:27:29//-------------------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 定时器中断定时器
2013-09-29 16:16:18STM32 定时器中断定时器 -
高级定时器中断实验.zip
2021-01-15 14:39:55stm32 高级定时器定时器中断实验 -
定时器中断加外部中断.zip
2020-04-17 21:13:10程序在正点原子的基础上,融合了定时器中断和外部中断,可以直观地看出优先级的作用,希望可以帮到某些同学~ -
定时器中断实验.docx
2020-12-20 14:12:03stm32的定时器中断实验的学习,主要是了解定时器 -
stm32定时器中断_STM32CUBEMX F103 HAL库开发之 定时器中断多任务
2020-12-10 00:24:14连最基础的stm32f103c8t6都有四个定时器,更高级的zet6,或者f4系列的有十几个定时器,相比arduino来说强大了太多,利用好了可以实现确定时间间隔的做某件事情,多个定时器中断可以用来做多件事情,不使用延时也能够... -
定时器中断实验LED
2019-02-01 13:54:59这是一份基于STM32f10x系列战舰开发板写的定时器中断实验以LED灯形式展现。