历史上的今天

今天是:2024年10月09日(星期三)

正在发生

2019年10月09日 | stm32 定时器5输入捕获

发布者:少年不识愁滋味 来源: eefocus关键字:stm32  定时器5  输入捕获 手机看文章 扫描二维码
随时随地手机看文章

timer.h


#ifndef _TIM5SANP_H
#define _TIM5SANP_H
#include "sys.h"


void TIM14_PWM_Init(u32 arr,u32 psc);
void TIM5_CH1_Cap_Init(u32 arr,u16 psc);
#endif


timer.c

#include "timer.h"

TIM_ICInitTypeDef TIM5_ICInitStructre;

void TIM5_CH1_Cap_Init(u32 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);//TIM5时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//GPIOA时钟使能

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN;
GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5); //PA0复用tim5

TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //配置输入分频,不分频
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure); //


//#define TIM_Channel_1                    ((uint16_t)0x0000)
//
//#define TIM_ICSelection_DirectTI           ((uint16_t)0x0001)   
        // TIM Input 1, 2, 3 or 4 is selected to be  connected to IC1, IC2, IC3 or IC4, respectively 
//TIM5_CCMR1寄存器
//位 1:0 CC1S:捕获/比较 1 选择 (Capture/Compare 1 selection)
//此位域定义通道方向(输入/输出)以及所使用的输入。
//00: CC1 通道配置为输出。
//01: CC1 通道配置为输入, IC1 映射到 TI1 上。
//书本178页 或中文参考434页
TIM5_ICInitStructre.TIM_Channel=TIM_Channel_1; //选择输入端IC1映射到TI1
TIM5_ICInitStructre.TIM_ICPolarity=TIM_ICPolarity_Rising; //上升沿捕获
TIM5_ICInitStructre.TIM_ICSelection=TIM_ICSelection_DirectTI;//映射到TI1上
TIM5_ICInitStructre.TIM_ICPrescaler=TIM_ICPSC_DIV1; //配置输入分频,不分频
TIM5_ICInitStructre.TIM_ICFilter=0x00; //配置输入滤波器不滤波
TIM_ICInit(TIM5,&TIM5_ICInitStructre); //初始化TIM5输入捕获参数

TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE); //允许更新和捕获中断
TIM_Cmd(TIM5,ENABLE); //使能定时器5

NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);


}


//捕获状态
//[7]:0,没有成功的捕获,1,成功捕获到1次
//[6]:0,还没捕获到低电平;1,已经捕获到低电平了
//[5:0]:捕获低电平后溢出的次数(对于32位定时器来说,1us计数器加1,溢出时间:4294s)
u8 TIM5CH1_CAPTURE_STA=0;//输入捕获状态
u32 TIM5CH1_CAPTURE_VAL; //输入捕获值(TIM2/TIM5是32位)


//定时器5中断服务程序
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=0XFFFFFFFF;
}
else
TIM5CH1_CAPTURE_STA++;

}
}

if(TIM_GetITStatus(TIM5,TIM_IT_CC1) != RESET) //捕获1发生捕获事件
{
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;
TIM5CH1_CAPTURE_STA |=0x40; //标记捕获了上升沿
TIM_Cmd(TIM5,ENABLE); 
TIM_SetCounter(TIM5,0); //计数器清空
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //设置下降沿捕获
TIM_Cmd(TIM5,ENABLE); //使能定时器5

}

}

}

TIM_ClearITPendingBit(TIM5,TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
}


/*
程序思路:
TIM5CH1_CAPTURE_STA:用来记录捕获状态
TIM5CH1_CAPTURE_STA=0x40  第7位为1说明捕获到高电平
TIM5CH1_CAPTURE_STA的bit7 第8位为1说明捕获完成了
TIM5CH1_CAPTURE_STA的[5:0]是记录溢出次数


第一次进入中断
开始时TIM5CH1_CAPTURE_STA=0;必然会进入这个if
if((TIM5CH1_CAPTURE_STA & 0x80)==0) 
1.如果在捕获到高电平前溢出了,则溢出部份不处理
2.如果在捕获高电平之后TIM5CH1_CAPTURE_STA++;


如果捕获1发生捕获事件,计数器清0,TIM5CH1_CAPTURE_STA=0x40 (0100 0000),改成下降沿捕获




第N次进入中断
如果前面已经捕获了上升沿,
TIM5CH1_CAPTURE_STA |= 0X80; //标记成功捕获了一次高电平脉宽
TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);//获取当前的捕获值
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising);//设置上升沿捕获

*/


main.c

#include "sys.h"
#include "delay.h"
#include "timer.h"
#include "usart.h"


extern u8 TIM5CH1_CAPTURE_STA;//输入捕获状态
extern u32 TIM5CH1_CAPTURE_VAL; //输入捕获值(TIM2/TIM5是32位)


int main(void)

//long long是属于int型, 一般来讲, 是long int型大小的两倍, int型的4倍.
long long temp=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init(168);
uart_init(115200);
TIM5_CH1_Cap_Init(0XFFFFFFFF,84-1);
//84Mhz 84分频为1Mhz 一个周期是1us
//自动重装载值取到最大2的32次方-1  约4294.96秒才会溢出
while(1)
{
if(TIM5CH1_CAPTURE_STA & 0x80)
{
temp=TIM5CH1_CAPTURE_STA & 0x3f;//取到溢出次数通常为0因为很少有能超出4294.96秒
temp *=0XFFFFFFFF; //溢出一次时间加上0XFFFFFFFF us
temp +=TIM5CH1_CAPTURE_VAL; //得到总的高电平时间和 一次刚好是1us
printf("高电平的时间为:%lld us rn",temp);
TIM5CH1_CAPTURE_STA=0;//下一次捕获开启
}

}
}


关键字:stm32  定时器5  输入捕获 引用地址:stm32 定时器5输入捕获

上一篇:STM32 读写保护功能及设置
下一篇:stm32 time4 pwm

推荐阅读

正当中美之间的贸易摩擦逐步升级时,印度政府正悄悄地开始了大国崛起战略的芯片战略。他们计划在每个邦都建立以个特大经济区,主要服务于印度的电子制造业,也就是芯片制造业。最值得注意的是,该计划希望印度能在2020年实现芯片完全国产化,获得技术自主,这表明了印度已经意识到了芯片自主化对于印度崛起和国家安全的重要性。科技巨头在印度建厂并不新奇...
9月30日,外交部发言人耿爽主持例行记者会。有记者提问,据报道,美国总统特朗普正在讨论多种措施限制美国投资流入中国市场,美国财政部发言人回应说,政府当前并未考虑禁止中国公司在美国股票交易所上市,中方对此有何评论,如果美方对投资流入中国设限,中方有何反应?“我们注意到了相关报道,也注意到了美国财政部发言人做出的回应。”耿爽指出,中美...
有网友放出了一张 vivo 的线下商店图,图中展示了 vivo X60 字样的广告牌,标语为 “专业影像旗舰”,预示该机将主打影像功能,支持 5G 网络。据多个数码博主补充,该机有望于 11 月到 12 月某个时间发布。  目前关于该机的爆料信息几乎为零,但大多数数码博主猜测将采用小打孔曲面屏。  数码博主 @数码闲聊站 此前爆料表示,viv...
RaspberryPi(树莓派)项目最初是作为爱好者/制造商资源,现已发展成为原型制作、开发甚至量产的主要项目。今年早些时候,RaspberryPi发布了其首款芯片MCURP2040。SferaLabs是一家意大利公司,在基于RaspberryPi平台的模块化设计方面有着悠久的历史,它已经注意到用于工业自动化和控制的RP2040。日前,SferaLabs宣布推出IonoRP,这是其全新的工业I/O模块,...

史海拾趣

问答坊 | AI 解惑

Error:Non-input node'txd' assigned to dedicated input是什么意思?

Error:Non-input node\'txd\' assigned to dedicated input是什么意思?…

查看全部问答∨

数字对讲机

小弟是通信方面的新手 最近要做一个数字对讲机方面的课题 设计一个短信收发的应用层软件   想请教各位高手 有没有做过或者了解这方面的 给我一点资料或者指导   不甚感激…

查看全部问答∨

SDIO接口输出用几条线呀?

背景:想把SMD解密卡嵌到PCB板上,此SMD的接口是SDIO方式的。 问题:SDIO接口一般使用几条线呀,都输出什么信号。 例如: SPI接口一般使用4条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从 ...…

查看全部问答∨

WINCE死机了

自从我加了.NET 2.0后在WINCE欢迎界面就死机了!去掉就OK了,请问这是怎么回事呀? …

查看全部问答∨

分享流水灯程序

#include <REG51.H>#include <INTRINS.H> void delay(void)   //误差 -0.152253987588us{    unsigned char a,b;    for(b=238;b>0;b--)        for(a=250 ...…

查看全部问答∨

ST32的一点建议

现在已经有 STM32  USB 转串口建议STM32  USB 转CAN 口可否芯片改进一些, 把USB/CAN共用的RAM分开?…

查看全部问答∨

谁知道74LV04DB,118这个型号的相关资料数据啊~!

谁知道74LV04DB,118这个型号的相关资料数据啊~!…

查看全部问答∨

怎样在Linux里面通过C语言程序了,输出嘟嘟的报警声???

在做一个网络传输的项目,功能是在收到网络消息的时候,在屏幕上面打印出消息的同时,可以听到报警提示的声音。大家有什么好的方法吗??…

查看全部问答∨

Raw event 篇

Event 整体来说是API是比较难以理解的,通常需要实践加上原理一起理解,最好是阅读相应代码。但是event 相当强大,一个event 有32个事件,对于任务同步控制是非常强大的。 1 RAW_U16 raw_event_create(RAW_EVENT *event_ptr, RAW_U8 *name_ptr, RA ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved