stm32 输入捕获学习(二)
(本文参考STM32 开发指南 V1.3 —— ALIENTEK 战舰 STM32 开发板库函数教程 )
1. 实验设计
我们用 TIM5 的通道 1(PA0)来做输入捕获,捕获 PA0 上高电平的脉宽(用 WK_UP 按键输入高电平),通过串口打印高电平脉宽时间。
2. 原理说明
基本原理可以参考上一篇博文,在上个实验的基础上,我们稍作修改,就可以实现功能。
1)增加GPIO的配置。
这里我们使用的是KEY_UP按键,WK_UP右端连接PA0. 我们把PA0配置为下拉输入,这样不按键PA0就是低电平,按键的话PA0就是高电平。
2)修改中断处理程序
TIM5_IRQHandler 是 TIM5 的中断服务函数,该函数用到了两个全局变量,用于辅助实现高电平捕获。其中TIM5CH1_CAPTURE_STA,是用来记录捕获状态。TIM5CH1_CAPTURE_STA 各位描述如下图所示:
另外一个变量 TIM5CH1_CAPTURE_VAL,则用来记录捕获到下降沿的时候,TIM5_CNT的值。
现在我们来介绍一下,捕获高电平脉宽的思路:
首先,设置 TIM5_CH1 为上升沿捕获(这在TIM5_Cap_Init 函数中就设置好了),等待上升沿中断到来。此时如果 TIM5CH1_CAPTURE_STA 的第 6 位为 0,则表示还没有捕获到上升沿,这时把 TIM5CH1_CAPTURE_STA、TIM5CH1_CAPTURE_VAL 和 TIM5->CNT 清零,然后再设置TIM5CH1_CAPTURE_STA
的第 6 位为 1,表示已经捕获到高电平,最后设置为下降沿捕获,等待下降沿到来。
当下降沿到来的时候,先设置 TIM5CH1_CAPTURE_STA 的第 7 位为 1,标记成功捕获一次高电平,然后读取此时定时器值到 TIM5CH1_CAPTURE_VAL 里面(等待主函数处理),最后设置为上升沿捕获,回到初始状态。
如果等待下降沿到来的期间,定时器发生了溢出,就在 TIM5CH1_CAPTURE_STA里面对溢出次数进行计数,当最大溢出次数来到的时候,就强制标记捕获完成(虽然此时还没有捕获到下降沿),并且设置TIM5CH1_CAPTURE_VAL为最大值0XFFFF,最后设置成上升沿捕获,回到初始状态。
这样,我们就完成一次高电平捕获,只要 TIM5CH1_CAPTURE_STA 的第 7 位一直为 1,就不会进行第二次捕获。我们在main函数处理完捕获数据后,将TIM5CH1_CAPTURE_STA置零,就可以开启第二次捕获。
3. 参考代码
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 下拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
上面这段代码增加到 void TIM5_Cap_Init(u16 arr,u16 psc) 函数中。
中断处理如下
u8 TIM5CH1_CAPTURE_STA = 0;
u16 TIM5CH1_CAPTURE_VAL; //保存TIM5的值 void TIM5_IRQHandler(void)
{ if((TIM5CH1_CAPTURE_STA&0X80)==0)//主函数已经处理完了捕获
{
if(TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET) //定时器更新中断
{
if(TIM5CH1_CAPTURE_STA & 0X40) //已经捕获到高电平
{
if((TIM5CH1_CAPTURE_STA & 0X3F)==0X3F)//高电平的时间太长,强制捕获完成
{
TIM5CH1_CAPTURE_STA |= 0X80; //标记捕获完成
TIM5CH1_CAPTURE_VAL = 0XFFFF;
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //设置为上升沿捕获
}
else
{
TIM5CH1_CAPTURE_STA++;
}
}
} if(TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET) //捕获中断
{
if(TIM5CH1_CAPTURE_STA & 0X40) //此时捕获下降沿
{
TIM5CH1_CAPTURE_STA|=0X80; //标记捕获完成
TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //设置为上升沿捕获
}
else //捕获到了上升沿
{
TIM5CH1_CAPTURE_STA=0;
TIM5CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM5,0);
TIM5CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //设置为下降沿捕获
}
}
} TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志 }
主函数代码:
extern u8 TIM5CH1_CAPTURE_STA;
extern u16 TIM5CH1_CAPTURE_VAL; int main(void)
{
u32 temp = 0; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(9600); //串口初始化,波特率9600 TIM5_Cap_Init(0XFFFF,72-1); //1MHz 计数频率 while(1)
{
if(TIM5CH1_CAPTURE_STA & 0X80) //成功捕获到一个高脉冲
{
temp = TIM5CH1_CAPTURE_STA & 0X3F; //定时器溢出次数
temp *= 65536; //溢出时间总和
temp += TIM5CH1_CAPTURE_VAL; //算出高电平的时间
printf("HIGH:%d us\r\n",temp); //串口打印 TIM5CH1_CAPTURE_STA=0; //开启下一次捕获
};
}
}
3.实验结果
stm32 输入捕获学习(二)的更多相关文章
- stm32 输入捕获学习(一)
输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能.STM32 的输入捕获,简单地说就是通过检测 TIMx_CHx 上的边沿信 ...
- STM32输入捕获模式设置并用DMA接收数据
参考: STM32的PWM输入模式设置并用DMA接收数据 Input capture mode The input stage samples the corresponding TIx input ...
- STM32——输入捕获实验原理及配置步骤
输入捕获实验原理及配置步骤 一.输入捕获概念 STM32的输入捕获,简单的说就是通过检测 TIMx_CHx (定时器X的通道X)上的 边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定 ...
- STM32 输入捕获配置
在STM32 的定时器,除了 TIM6 和 TIM7,就是通过检测 TIMx_CHx 上的 边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候, 将当时定时器 的值(TIMx_CNT) 存放到对 ...
- [置顶]
STM32 输入捕获的脉冲宽度及频率计算
输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能.以下是对脉冲宽度及频率的计算. 1.脉冲宽度 如下图所示,采集该高电平脉冲 ...
- STM32 输入捕获的脉冲宽度及频率计算
输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能.以下是对脉冲宽度及频率的计算. 1.脉冲宽度 如下图所示,采集该高电平脉冲 ...
- stm32 输入捕获
根据定时器的计数频率,我们就可以算出t1-t2的时间,从而得到高电平脉宽 计算公式 N * ARR + CCRx2 首先设置定时器通道为上升沿捕获,这样在t1时刻,就会捕获到当前的CNT值,然后立即清 ...
- STM32输入捕获TIM2四通道
相比于一通道,原子的例程里因为清了计数时间,所以要对程序进行修改. 记录上升沿后的计数,然后记录下降沿的计数.相减后计算高电平时间,对于定时器中断间隔的边界要分开处理. 这里因为我的接收机时间是1ms ...
- stm32寄存器版学习笔记06 输入捕获(ETR脉冲计数)
STM32外部脉冲ETR引脚:TIM1-->PA12;TIMER2-->PA0:TIMER3-->PD2;TIMER4-->PE0… 1.TIM2 PA0计数 配置步骤 ①开启 ...
随机推荐
- ChineseLunisolarCalendar 农历日期
#region 农历日期 static ChineseLunisolarCalendar cCalendar = new ChineseLunisolarCalendar(); /// <sum ...
- android studio 程序员有福了—从layout自动生成viewholder类
狂点这里下载 超级牛逼的插件啊,比那些使用SparseArray的强太多了! 在android studio 1.0上测试,没有问题. 不说了直接说功能 Android Toolbox Plugin ...
- 对接ebay,订单系统开发
要求,从ebay 下载的 csv文件,导入销售订单的系统,成为自己的订单. 首先,上传文件. 第二步,将上传的csv读入系统的一个变量 根据','来分割成一个数组 $str = file_get_co ...
- b,u,i,s,这些被删除的标签以及用来替换他们的标签
加粗文字 给文字加下划线 倾斜文字 给文字加删除线 这些是以前的HTML语言修饰文字用的,没有语义,所以被删除,不到万不得已 不能使用,HTML给了新的标签替换他们,并且有语义 定义重要性强调的文字 ...
- 「BZOJ1010」[HNOI2008] 玩具装箱toy(斜率优化)
P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为 1⋯N1\cdots N1⋯N ...
- Linux的重要子目录
1: 网卡的配置文件 [ :0C::::BD #MAC地址 TYPE=Ethernet #以太网 UUID=e982e20a-e7ef--8e44-a7c0c474c708 #Linux系统内部的标 ...
- CI框架源码学习笔记3——Log.php
上一节说完了Common.php,然而跟代码打交道总是免不了日志记录,所以这一节我们说说Log.php文件. 先看看类里面的几个属性, protected $_log_path; 日志路径 prot ...
- 调停者模式Mediator(中介者模式)详解
原文链接:https://www.cnblogs.com/java-my-life/archive/2012/06/20/2554024.html 在阎宏博士的<JAVA与模式>一书中开头 ...
- C语言数据结构-顺序线性表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作
1.数据结构-顺序线性表的实现-C语言 #define MAXSIZE 100 //结构体定义 typedef struct { int *elem; //基地址 int length; //结构体当 ...
- loj #6235. 区间素数个数 min_12.5筛
\(\color{#0066ff}{ 题目描述 }\) 求 \(1\sim n\) 之间素数个数. \(\color{#0066ff}{输入格式}\) 一行一个数 n . \(\color{#0066 ...