捕获中断服务程序

 1 u8  TIM5CH1_CAPTURE_STA=0;    //输入捕获状态
 2 u16    TIM5CH1_CAPTURE_VAL;    //输入捕获值
 3
 4 //定时器5中断服务程序
 5 void TIM5_IRQHandler(void)
 6 {
 7
 8      if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
 9     {
10         if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
11
12         {
13             if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
14             {
15                 if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
16                 {
17                     TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
18                     TIM5CH1_CAPTURE_VAL=0XFFFF;
19                 }else TIM5CH1_CAPTURE_STA++;
20             }
21         }
22     if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
23         {
24             if(TIM5CH1_CAPTURE_STA&0X40)        //捕获到一个下降沿
25             {
26                 TIM5CH1_CAPTURE_STA|=0X80;        //标记成功捕获到一次高电平脉宽
27                 TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
28                    TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
29             }else                                  //还未开始,第一次捕获上升沿
30             {
31                 TIM5CH1_CAPTURE_STA=0;            //清空
32                 TIM5CH1_CAPTURE_VAL=0;
33                  TIM_SetCounter(TIM5,0);
34                 TIM5CH1_CAPTURE_STA|=0X40;        //标记捕获到了上升沿
35                    TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);        //CC1P=1 设置为下降沿捕获
36             }
37         }
38      }
39
40     TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
41
42 }

 因此上面代码写的0x80就指的是捕获完成标志,0x40指的是捕获到高电平标志,0x00~0x3f则是表示捕获高电平或定时器溢出的次数。
时间: 2024-07-30 02:51:19

捕获中断服务程序的相关文章

ISR中断服务程序

__Interrupt 作用:执行紧急中断事件 要点: 1. 无参数 2. 无返回值 3. 短而高效,由中断置位标志位或发出信号由应用层去处理其他工作 4. 不应该有重入和性能上的问题,用puts而不是printf. 正确示例: void interrupt int60() { puts("This is an example"); } 错误示例: __interrupt double compute_area (double radius) { double area = PI *

STM32F4——定时器原理及应用(中断、输入捕获、PWM输出)

一.简介: 不同的STM32系列有不同数量的定时器,针对现在学习的STM32F40x系列总共有14个定时器,针对这14个定时器可以将其分为3类,高级定时器.通用定时器和基本定时器,三种定时器大同小异,下边会针对通用定时器来介绍定时器的原理和应用.对于通用定时器根据位数和计数方式的不同又可以分为3类,相关分类的图表如下: 二.应用: 1.更新:计数器的上溢或下溢.2.事件触发.3.输入捕获.4.输出比较.5.支持针对定位的增量编码和霍尔传感器电路.5.触发输入作为外部时钟或按周期电源管理.下边会针

STM32中断控制的流程

对于 STM32 讲(还是以Timer2例),外部中断通道位置 28(35 号优先级)是给外部设备 TIME2 的,但 TIME2本身能够引起中断的中断源或事件有好多个,比如更新事件(上溢/下溢) .输入捕获.输出匹配.DMA 申请等.所有TIME2 的中断事件都是通过一个 TIME2 的中断通道向 STM32 内核提出中断申请,那么 STM32 中如何处理和控制 TIME2 和它众多的.不同的.中断申请呢? 1.因为cortex_m3 内核对于每一个外部中断通道都有相应的控制字和控制位,用于单

CC2541蓝牙学习——定时器1的捕获/比较功能

CC2541定时器1有5个捕获/比较通道,首先介绍什么是捕获和比较功能. 捕获通道: 设置的捕获开始的时候,CPU会将计数寄存器的值复制到捕获比较寄存器中并开始计数,当再次捕捉到电平变化时,这时 计数寄存器中的值减去刚才复制的值就是这段电平的持续时间,你可以设置上升沿捕获.下降沿捕获.或者上升沿下降沿 都捕获.捕获通道可以用来测量信号的频率周期或者波形的宽度,捕获通道类似于秒表的功能. 比较通道: 这里有两个单元:一个计数器单元和一个比较单元,比较单元就是个双缓冲寄存器,比较单元的值是可以根据不

进程—异常控制流之中断篇

从给处理器加电开始,直到断电为止,PC(程序计数器)都在不间断的读取并执行指令. 最简单的一种控制流是一个"平滑的"序列,其中每个instk和instk+1 在存储器中都是相邻的.典型地,这种平滑流的突变,也就是instk?和instk+1? 不相邻,是由诸如跳转(jump).调用(call)和返回(ret)这样一些熟悉的程序指令造成的.这样一些指令都是必要的机制,使得程序能够对由程序变量表示的内部程序状态中的变化做出反应. 但是系统也必须能够对系统状态的变化做出反应,这些系统状态不是

STM32学习笔记11(通用定时器作为输入捕获2)

通用定时器作为输入捕获的使用.我们将用 TIM5 的通道 1 (PA0)来做输入捕获,捕获 PA0 上高电平的脉宽(用 WK_UP 按键输入高电平),通过串口打印高电平脉宽时间 输入捕获简介 输入捕获模式可以用来测量脉冲宽度或者测量频率. STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能.STM32 的输入捕获,简单的说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的

2016.06.05 周日 实训课第二课 “中断”讲解

课程内容: 外部中断   引用------- 单片机教程网例子    ←链接 单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态.比如一个电子时钟,它会按时.分.秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来.在不需要对它进行调校的时候它不需要外部干预,自主封闭地运行.如果这个时钟足够准确而又不掉电的话,它可能一直处于这种封闭运行状态.但事情往往不会如此简单,在时钟刚刚上电.或时钟需要重新校准.甚至时钟被带到了不同的时区的时候

stm32寄存器版学习笔记06 输入捕获(ETR脉冲计数)

STM32外部脉冲ETR引脚:TIM1-->PA12;TIMER2-->PA0:TIMER3-->PD2;TIMER4-->PE0… 1.TIM2 PA0计数 配置步骤 ①开启TIM2时钟,配置PA0输入 APB1外设复位寄存器 (RCC_APB1RSTR) APB2外设时钟使能寄存器(RCC_APB2ENR) 置1开启.清0关闭. Eg:RCC->APB1ENR|=1<<0; //使能TIM2时钟  RCC->APB2ENR|=1<<2;  

非常好!!!Linux源代码阅读——中断【转】

Linux源代码阅读——中断 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/2_int.html 目录 为什么要有中断 中断的作用 中断的处理原则 Linux 中断机制 中断控制器 中断描述符 中断数据结构 中断的初始化 内核接口 中断处理过程 CPU 的中断处理流程 保存中断信息 处理中断 从中断中返回 编写中断处理程序 软中断.tasklet与工作队列 上半部与下半部 软中断 tasklet 工作队列 1 为什么要有中断 1.1 中