-
2021-07-31 09:40:42
Arduino已经为我们写好了定时中断的库函数了,我们可以直接直接使用,这对于对底层了解较少的同学来说真是一个好消息。常用的库有FlexiTimer2.h和MsTimer2.h,这两个库的用法是大同小异的。下面对其中的几个常用的函数进行详细的介绍。这两个库你可以很轻松的从网上下载。
1.void set(unsigned long ms, void (*f)())
这个函数设置定时中断的时间间隔和调用的中断服务程序。ms表示的是定时时间的间隔长度,单位是ms,void(*f)()表示被调用中断服务程序,只写函数名字就可以了。2.void start()
开启定时中断3.void stop()
关闭定时中断注意:以上三个函数都是在MsTimer2的作用于中进行的,在使用时都要加上作用域,如:MsTimer2::start();可以通过下面这个例子来详细的了解一下定时中断。
//定时器库的 头文件 #include <MsTimer2.h> //中断处理函数,改变灯的状态 void flash() { static boolean output = HIGH; digitalWrite(13, output); output = !output; } void setup() { pinMode(13, OUTPUT); // 中断设置函数,每 500ms 进入一次中断 MsTimer2::set(500, flash); //开始计时 MsTimer2::start(); } void loop(){}
更多相关内容 -
定时器中断函数的使用
2021-05-19 18:41:361.定时器与延时的区别大家可能会觉得我们用延时函数照样可以实现上一讲代码的实验现象,但是定时器与延时的概念不同,延时函数需要占用CPU的使用权,正在延时的时候其他任务没有CPU的使用权就会拖慢执行效率。...1.定时器与延时的区别
大家可能会觉得我们用延时函数照样可以实现上一讲代码的实验现象,但是定时器与延时的概念不同,延时函数需要占用CPU的使用权,正在延时的时候其他任务没有CPU的使用权就会拖慢执行效率。
而定时器是不需要占用CPU的使用权的,它是独立自己运行的,就像我们在第一讲的时候提到调好5分钟的闹钟,在这5分钟里我们可以随意执行任务,也可以什么事都不做,但是5分钟过后闹钟响了就要执行相关的任务了。
所以上一讲的代码的实现原理就是每隔51微秒,有个变量会自加1,过了1000个51微秒的时候LED的状态才会改变,可以说CPU在51ms的时间里基本没什么事做,只是在51微秒到了的时候做了“cnt++;”这样简单的任务,然后又空闲地等下一个51微秒的到来再执行“cnt++;”。
2.定时器中断函数
与外部中断一样,定时器中断也有中断函数,同理,程序去执行中断函数就会把TF0的中断标志位自动清0,所以只要我们用了定时器中断函数,那么TF0就可以不用再出现在程序书写中了。
还记得外部中断这个图吗
同样定时器0的中断函数使能如下
至于“interrupt”后面的数字为什么是1,请再看我们以前给过大家的这个图的中断函数编号就明白了
这些编号是为了区分哪些硬件资源的相关中断函数,如果我们同时使用两个定时器,那么只能用“interrupt 1”和“interrupt 3”来区分谁是谁的中断函数了。
使用“TIM0_IRQHandler”作为函数名也是模仿STM32定时器中断函数名的写法。
如果我们使用的是工作模式1,每次触发中断函数的执行内容首先就是再次给TH0和TL0赋初值保证下次的定时时间还是一样。
这里我们使用中断函数的执行方式来实现30ms的间隔流水灯,算出TH0和TL0合成的“16位的变量”要填充的值为37888=0x9400。
在中断函数里也是可以定义局部变量的,当然如果这个变量是用来辅助流水灯的,那么肯定是要定义成静态变量的。
3.代码#include
#include //详见第六章第8讲
void main()
{
LED_Init(); //初始化LED硬件模块
EA = 1; //闭合总中断开关
TMOD = 0x01; //设置定时器0为工作模式1
TH0 = 0x94; //设置定时时间为30ms
TL0 = 0x00;
ET0 = 1; //闭合定时器0中断的开关
TR0 = 1; //启动定时器0
while(1);
}
void TIM0_IRQHandler() interrupt 1
{
static u8 i;
TH0 = 0x94; //重新设置定时时间为30ms
TL0 = 0x00;
P0=~(0x80>>i);//这一次让流水灯向右移
i++;
if(i>=8)i=0;
}
觉得30ms的流速太快,想改为300ms的话,修改一下中断函数即可,如下void TIM0_IRQHandler() interrupt 1
{
static u8 i,cnt;
TH0 = 0x94; //重新设置定时时间为30ms
TL0 = 0x00;
cnt++;
if(cnt>=10)
{
cnt=0;
P0=~(0x80>>i);//这一次让流水灯向右移
i++;
if(i>=8)i=0;
}
}
-
【51单片机—定时器应用】定时器计数、定时器中断函数、while(1)三者之间是如何协调、工作?
2020-04-11 18:47:1251单片机程序,使用定时器时,定时器计数、定时器中断函数、while(1)循环三者之间如何协调好整个流程? 【定时器0实现间隔1s的流水灯】示例模板 #include <reg52.h> typedef unsigned int u16; //对...51单片机程序,使用定时器时,定时器计数、定时器中断函数、while(1)循环三者之间如何协调好整个流程?
我拿一个最经典的单片机应用——‘流水灯’来分析吧。
【定时器0实现间隔1s的流水灯】简单示例
#include <reg52.h> typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; #define LED P3 bit LED_flag=0; //定时到1s的标志位 u8 n; //循环变量,用作LED总线的位索引index void InitTimer0(void); //定时器0,初始化 void main() { LED=0XFF; //先初始化LED全灭(自上而下流动) InitTimer0(); while(1) { if(LED_flag==1) { LED_flag=0; LED=~(0x01<<n); //P1=~(0x80>>n);(自下而上流动) if(++n==8) n=0; } } } void InitTimer0(void) { TMOD |= 0x01; //用|=防止配置冲突 TH0 = (65536 - 50000)/256; ///定时器0,置初值(定时50ms) TL0 = (65536 - 50000)%256; EA = 1; ET0 = 1; TR0 = 1; } void Timer0() interrupt 1 //定时器0,中断服务函数 { static u16 i; TH0 = (65536 - 50000)/256; ///定时器0,重装初值(定时50ms) TL0 = (65536 - 50000)%256; i++; if(i==20) // 1s = 20 × 50ms { i=0; LED_flag=1; } }
第一、定时器什么时候开始工作呢?
TR0=1;//启动定时器0,这个断点就标志着定时器0开始工作了,不管同不同意中断,它都在计时。
第二、什么时候进入中断函数,进入中断函数后定时器又是怎么工作的,怎么循环累加出延时时间的?该示例程序配置了定时器的中断时间为 50ms(12MHz晶振),也就是每隔 50ms 就进入一次中断函数。
进入中断后,程序又重新给定时器定时50ms(定时器0不会自动重装初值),同时对中断次数进行计数(i++)。
主程序只要查询计数值(i),就能知道 定时器中断了多少次了。
第三、while(1)循环里面又是怎么工作的呢?首先,主函数的 while(1)表示系统是一个 循环系统,一直在循环,不结束。
当定时器产生中断时,就会暂停主函数,这就称为定时器中断。等中断服务函数执行结束后,又会在主函数被打断的地方,继续执行主函数的内容。
进一步理解
定时器等中断服务属于前台工作,主函数属于后台工作。
这样的系统称为前后台系统,包括一个死循环和若干个中断服务程序:应用程序是一个无限循环,循环中调用API函数完成所需的操作,这个大循环就叫做后台系统;而中断服务程序,接收到系统的各种异步事件,也就是前台系统。
这就像一个酒店服务流程一样:酒店前台柜员(中断服务程序)接收到客户的突发问题(单片机系统的各种异步事件),前台柜员再将接收到的问题反馈给大堂经理(while(1)后台)进行事件的处理解决。
这说明了:主函数在执行的时候,定时器中断在前台是一直在工作的(只要你开启了)。
程序中,主函数的while(1),对定时器的中断次数是否到达1s定时的标志位LED_flag进行查询,如果==1,那它就将该标志位清0 ,并且执行流水灯事件。
-
51单片机定时器中断函数中变量初始化的问题
2016-05-10 22:24:4651单片机定时器中断函数中变量初始化的问题 #include<reg51.h>//调用头文件 #define uint unsigned int //宏定义 #define uchar unsigned char uint n=0; //查表变量 uchar temp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf...前几天在进行单片机实验时,目的是用定时器0写一个流水灯的程序,代码如下,编译没有问题,但就是灯不亮,检查了好几次始终找不到问题,现在找到了,分享一下
#include<reg51.h>//调用头文件 #define uint unsigned int //宏定义 #define uchar unsigned char #define long_time 10 //定时时间,每次50ms uint n=0; //查表变量 uchar temp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水灯查表实现 /*********主函数**************/ void main(void) { EA=1; //开总中断 ET0=1;//开定时器0中断 TMOD=0X01;//选择方式1 TH0=(65536-50000)/256;//每次定时50秒 TL0=(65526-50000)%256; TR0=1;//开启定时器 while(1); } void time0(void) interrupt 1 using 0 { uint i=0; //此处存在问题,每次进入中断函数i都会被置为0 i++; //i始终为1 if(long_time0==i)//如果long_time0=1,则程序不会出错即使不等于1,编译时也不会报错,属于逻辑错误 { i=0; P1=temp[n++]; if(8==n) n=0; } TH0=(65536-50000)/256;//重新装入初值 TL0=(65526-50000)%256; }
收获:
1.中断函数中定义的变量一定要注意赋初值是否符合逻辑,特别是循环中的变量
2.局部变量和全局变量或者静态变量的作用范围,比如将上面中断函数中的变量定义为全局变量或者静态变量就不会有问题道行尚浅,不足之处,还希望各位指正
-
STM32CubeMX定时器中断回调函数的研究.pdf
2021-06-27 13:40:14STM32CubeMX定时器中断回调函数的研究.pdf -
STM32 定时器中断函数里不能串口输出
2019-10-03 16:36:26定时器中断函数内部: 串口函数设计的优先级: 定时器设计的优先级: 因此我认为不能使用串口输出函数的原因是:中断优先级的问题 ... -
基于STM32的超声波测距(外部中断+定时器)KEIL工程文件
2021-08-17 21:39:19(2)计数到溢出,触发定时器中断,它会调用超声波启动函数Ultrasound_start(); (3)超声波启动后,有回波信号,将触发外部中断(上边沿),进入外部中断直接关掉定时器中断和定时器,判断确实有回波信号,进入到... -
【STM32】定时器中断原理及操作
2022-06-04 20:25:42定时器中断使能 / 选择函数:TIM_ITConfig4.NVIC配置函数:NVIC_Init5.定时器使能函数:TIM_Cmd6.中断服务函数:TIM3_IRQHandler一般情况定时器的始终会选择来自系统的内部时钟,由AHB时钟经APB1预分频再经历一系列... -
STM32CubeMX笔记(5)--定时器中断
2021-09-24 10:49:08相关中断函数的编写:3、编译工程文件,使用ST-Link烧录,测试定时器中断 1、STM32CubeMX引脚设置和代码生成 1.相关定时器的知识点: STM32F1系列中APB1和APB2控制对应表 APB1操作速度限于36MHz APB2操作于全速... -
STM32 定时器中断函数
2017-05-16 15:11:42#include"timer.h"#include"led.h"//晶振是8MHZ,默认CPU是9倍频,//通用定时器 3 中断初始化//这里时钟选择为 APB1 的 2 倍,而 APB1 为 36M// SYSCLK:72M // AHB:72M // APB1(PCLK1):36M // APB2(PCLK2):... -
单片机定时器中断执行服务函数后不关闭中断允许位,计数器清0重新计数,会在发生中断,中断会再进入吗
2021-07-17 16:45:35单片机定时器中断后计数器和中断再进入 pangyinglong 2019-12-03 12:41:05 1407 收藏 9 分类专栏: 单片机 文章标签: 单片机 定时器 定时器中断 时间 版权 单片机 专栏收录该内容 10 篇文章0 订阅 订阅专栏 1、... -
蓝桥杯学习笔记四:stm32延时函数总结,滴答定时器中断来实现流水灯
2022-01-23 11:28:44Stm32延时手段大体分为两种:软件延时,滴答定时器延时 1、软件延时: //毫秒级的延时 void delay_ms(u16 time) { u16 i=0; while(time--) { i=12000; //自己定义 while(i--) ; } } 软件延时不精确 2... -
NXP JN5169滴答定时器中断回调函数
2020-10-28 15:02:00NXP JN5169滴答定时器中断注册回调函数一、滴答定时器介绍二、中断处理1、中断注册回调函数2、 回调函数原型和参数3、 回调行为4、外设中断枚举(u32DeviceId)5、外围中断源(u32ItemBitmap)三、实现代码1、宏定义... -
【蓝桥杯嵌入式】【HAL库】八、定时器中断
2022-01-23 13:25:58本次实验为使用定时器中断实现每100ms八个led以不同的方向来回依次点亮并且。 附:定时器周期计算公式: T =(arr+1) * (PSC+1) / Tck 其中TCK为时钟频率,PSC为时钟预分频系数,arr为自动重装载值。 例:Tck = 80... -
定时器中断
2021-02-26 03:17:17目录 一、时钟选择 二、内部时钟选择 三、计数器模式 1、向下计数模式(时钟分频因子=1) 2、向上计数模式(时钟分频因子=1) ...3、中央对齐计数模式(时钟分频因子=1 ARR=6) ...3、定时器中断. -
STM32F103定时器中断(库函数)
2020-04-11 12:18:35三种定时器 定时器的时基 计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动转载寄存器(TIMx_ARR)。可通过配置这三个寄存器可配置计数周期。 参考stm32中文手册 1.CNT_EN在TIMx_CR1寄存器 的最低位当... -
(七)定时器中断
2022-02-21 22:22:52本节我们来看看51单片机定时器中断相关的内容,STC89C5X系列一般都是有三个定时器,定时器0,定时器1,定时器2,但不一定全有三个中断,这和具体的单片机有关系,但是一定有的是定时器0和定时器1,本章通过几个小的... -
STM32定时器中断配置
2021-10-21 10:22:063.开启定时器中断,配置中断结构体 配置例子 #include "tim.h" #include "stm32f10x.h" void tim_config(void) { TIM_TimeBaseInitTypeDef TIMinitStructure;//定时器结构体 NVIC_InitTypeDef NVICinitStructure;... -
单片机定时器中断的作用
2021-11-27 21:28:06单片机定时器即使定时又是计数器,定时器中断有哪些用处呢?现我们来把它列举出来。 1. 时间切片,做操作系统时钟。 2.硬件定时。如我们要做一个计时器就可以使用定时中断来做 3. 计数与目标计数。如检测计数... -
STM32 HAL库学习笔记之 定时器中断
2021-06-25 14:10:07定时器简介:STM32F103ZET6 一共有8个定时器,其中TIM1/TIM8为高级定时器,TIM6/TIM7为基本定时器,TIM2,TIM3,TIM4,TIM5为通用定时器。 基本定时器TIM6及TIM7功能: 通用定时器TIM2~TIM5功能: 高级定..... -
Matlab定时器中断
2021-03-02 22:27:31Matlab定时器中断前言一、timer的基本用法二、测试例子运行结果 前言 matlab中与单片机进行交互时需要用到定时器timer,用它可以模拟单片机的定时器中断服务。在此基础上进行拓展,可用串口(serial)+定时器... -
定时器中断方式实验报告
2021-05-20 17:12:26dsp定时器中断方式实验报告通信0203班 王建超 02211272一.中断初始化及服务程序的编写5402DSP中断有两大类,一类是可屏蔽中断:可以用软件来屏蔽或开放的硬件和软件中断。在5402中有INT3 ~INT0(外部中断),BRINT0,... -
51单片机学习笔记6 -- 定时器中断
2022-01-18 11:51:12定时器中断属于51单片机3种中断类型其中一种,51单片机具有2个定时器T0和T1(定时器0、定时器1),都需要通过寄存器来配置 -
Arduino笔记-定时器中断(MsTimer2库使用)
2021-01-06 07:55:25定时器中断,在某一特定的时候, 不管在干嘛,都要去执行那个定时器中断,指向的代码段。 这里以Arduino UNO为例: 运行截图如下: 每隔1s,亮LED_BUILTIN的灯: 这里要下载MsTimer2的库,如下: 输入MsTimer,... -
51单片机入门教程(5)——定时器中断
2018-11-25 22:53:5851单片机入门教程(5)——定时器中断一、中断的概念二、定时器中断2.1 软件延时的不足2.2 中断寄存器2.2.1 中断允许控制寄存器 IE2.2.2 定时器工作方式寄存器 TMOD2.2.3 定时器控制寄存器 TCON2.2.4 定时器初值... -
arduino定时器中断(没有废话)
2021-05-28 14:06:02#define LED1 10 //将一个led灯的正极接到10号引脚 ...void LED() //定义中断函数 { digitalWrite(LED1,HIGH); delay(200); digitalWrite(LED1,LOW); delay(200); } void setup() { MsTimer2 -
【STM32开发笔记】代码|定时中断功能函数
2022-02-25 22:56:27STM32编程|通过定时器,实现中断功能 -
定时器中断实现灯的亮灭
2022-02-20 11:19:54定时器中断功能什么是中断事件定时器简介结构体介绍硬件展示软件设计中断事件的补充讲解中断优先级定时器的计算代码 什么是中断事件 结合生活实际 讲解中断概念 例子:你在上班 ,突然来了个电话 妈妈说有急事 老板... -
使用STM32CubeMx软件生成定时器中断时,定时器无法进入中断
2022-03-09 14:45:24由于自动生成的工程是没有启动定时器的,所以定时器是没有工作。 在TIMx_Initx()函数里添加这边代码即可: HAL_TIM_Base_Start_IT(&htim3); -
合泰杯——合泰单片机工程6之定时器中断
2021-03-12 11:01:27合泰杯——合泰单片机工程6之定时器中断前言一、定时器功能配置?1.定时器初始化函数time2_Init(void)2.中断函数配置DEFINE_ISR(time2,0x38)二、主函数main总结 前言 这一篇记录的是我在定时器这一部分的理解,用...