历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-10-09 来源:eefocus

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;//下一次捕获开启
}

}
}


推荐阅读

史海拾趣

C-TON Industries公司的发展小趣事

在电子行业的早期阶段,C-TON Industries公司以其创新的技术理念脱颖而出。公司创始人李先生,一位电子工程领域的专家,意识到半导体技术的重要性,并决定将其作为公司的发展重点。通过不断投入研发,C-TON成功开发出了一款性能卓越的芯片,这款芯片在速度和稳定性上都远超当时市场上的同类产品。这一创新不仅赢得了客户的青睐,也帮助C-TON在市场上取得了突破性的进展。

Heidenhain Corp公司的发展小趣事

在半导体制造这一高端电子领域,海德汉公司也展现出了其强大的技术实力。某国际领先的半导体制造商在研发新一代芯片制造设备时,选择了海德汉的高精度编码器作为关键部件。海德汉编码器以其卓越的稳定性和精度,确保了芯片制造过程中的高精度定位和运动控制,为半导体制造商提供了可靠的技术保障。这一合作不仅提升了半导体制造设备的整体性能,也进一步巩固了海德汉在高端电子制造领域的市场地位。

Dialog Semiconductor(戴乐格半导体)公司的发展小趣事

Dialog Semiconductor在电源转换技术方面取得了重要突破。公司成功将氮化镓(GaN)技术应用于电源转换器中,推出了基于氮化镓技术的电源转换产品。氮化镓技术以其高速和低功耗的特点,为电源转换器带来了更高的效率和更小的尺寸。这一技术突破不仅推动了Dialog Semiconductor自身的发展,也为整个电子行业带来了重要的影响。

EPIC公司的发展小趣事

Epic Games一直关注并支持独立游戏开发者的发展。过去,独立开发者有机会与Epic Store签订协议以获得财务支持或提高游戏的知名度。然而,随着市场环境的变化和金融合约结构的转变,独立开发者面临着越来越多的挑战。尽管如此,Epic Games仍然致力于提供支持和资源来帮助独立开发者克服障碍、实现创新并推动整个游戏行业的进步。通过与独立开发者的紧密合作和持续支持,Epic Games不仅促进了游戏行业的多样性发展,也为自己赢得了广泛的好评和声誉。

Custom Connector Corporation公司的发展小趣事

随着全球化趋势的加剧,CCC意识到必须拓展国际市场才能保持竞争力。因此,公司制定了全球化战略,积极开拓海外市场。通过与国外代理商合作、参加国际展会等方式,CCC的产品逐渐打入国际市场并获得了良好的口碑。如今,CCC的产品已经出口到欧洲、亚洲等多个国家和地区。

Apx-Crystal公司的发展小趣事

面对日益激烈的市场竞争,Apx-Crystal公司意识到单凭自身的力量难以保持长期的竞争优势。于是,公司积极寻求与行业内外的合作伙伴进行技术交流和合作研发。通过与知名高校、科研机构以及同行的紧密合作,Apx-Crystal成功开发出了一系列具有创新性和领先性的电子产品,进一步巩固了其在行业内的领先地位。同时,公司还加大了对产业链的整合力度,推动了产业升级和可持续发展。

问答坊 | AI 解惑

wince应用程序问题

用VS2005调试的wince应用程序,在开发板上运行的时候出现如下错误: 致命的应用程序错误 应用程序test.exe执行了一个非法操作,将被关闭。若问题持续出现,请与供应商联系。 程序:Test.exe 异常:0xc00000FD 地址:00011860 问题出现在哪呢 ...…

查看全部问答>

月薪3万+招人

月薪3万+招人   有非常强的调试技术.熟悉C/c++,汇编.能从内存中获取到我们需要的信息..最好是全职,工作量可能有点 大.. 我们这提供一切便利条件..    只要能胜任绝对待遇能让你满意..  报酬不会低于3万/月 急需& ...…

查看全部问答>

求助:关于调用函数产生歧义的错误?

大家好:    请大家帮帮我,我把2003的程序移到VS2005上,编译报一个错误(函数调用产生歧义的错误)如下: error C2668: \'ATL::TrackPopupMenu\' : ambiguous call to overloaded function         C:\\Pro ...…

查看全部问答>

lm306的下冲问题

本帖最后由 dontium 于 2015-1-23 13:32 编辑 今天,做了一个lm306的滞回比较电路,但是出波后每个方波下有一个下冲,请问是什么原因造成的 [ 本帖最后由 markzhao 于 2011-7-3 16:20 编辑 ] …

查看全部问答>

TI M3 DAY研讨会发的两个光盘分别是干什么用的

TI M3 DAY研讨会发了两个光盘,一个包含了keil,驱动等,另外一个是干嘛的?请指教…

查看全部问答>

【MSP430共享】基于以太网的智能设备控制器的设计与实现

嵌入式系统的发展促进 了智能设备的网络化, 针对家庭智能化 问题 , 提出了智能家居系统的应用模型, 设计了一种基于MS P 4 3 0 F 1 4 9单片机的具有网络接口的智能设备控制器, 分析其硬件接 口电路 、 软件层次结构和应用软件开发方法, 实现了 ...…

查看全部问答>

求助

I/O模拟I2C,主机读操作(从机向主机发送数据)时,SDA和SCL应该设置成什么状态?…

查看全部问答>

富士通项目心得小结

富士通DIY活动可以说已经做完了,总体来说在这次DIY活动中还是学到了一些东西,基本上也知道了如何配置相关的寄存器和编写一些相应的驱动。不过感觉还是没达到预期的效果,我一开始的想法是大伙一起相互讨论,进行技术切磋,但是好多时候大伙都不在 ...…

查看全部问答>

MSP430FF552X的数据手册

MSP430FF551X,MSP430FF552X的数据手册…

查看全部问答>