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 读写保护功能及设置
下一篇:stm32 time4 pwm
推荐阅读
史海拾趣
在被VIA收购后的一段时间里,Cyrix继续寻求市场扩张的机会。例如,在1998年,Cyrix与北京大船电子技术公司签订了总代理协议,以扩大其在中国的分销网络。这一策略帮助Cyrix进一步打开了中国市场的大门,为其在全球市场的发展奠定了基础。
以上五个故事描绘了Cyrix Corp公司在电子行业中的发展历程。从初创时期的挑战英特尔到被多次收购后的市场策略调整和市场扩张尝试,Cyrix的发展之路充满了曲折和变革。
随着全球环保意识的不断提高,EPT Connectors公司也开始关注环保和可持续发展问题。公司积极采取各种措施减少生产过程中的污染和浪费,并推出了一系列环保型连接器产品。同时,EPT还积极参与各种环保活动和社会公益事业,以实际行动践行企业的社会责任。这些举措不仅提升了EPT的品牌形象和社会声誉,也为其未来的发展注入了新的动力。
ELM Electronics成立于XXXX年,由一群富有创新精神和电子技术专长的工程师创立。初创时期,公司专注于设计和生产高质量的电子元器件,以满足日益增长的电子产品市场需求。通过不断的技术创新和严格的质量控制,ELM逐渐在电子行业中树立了良好的口碑。
随着电子行业的不断发展和变革,DLK公司也面临着转型升级的压力。为了适应市场需求的变化,DLK公司开始加快转型升级的步伐。一方面,公司加强了对新能源汽车、物联网等新兴领域的研究和开发;另一方面,公司积极探索智能制造、工业互联网等新技术在连接器生产中的应用。通过转型升级,DLK公司不仅提高了生产效率和产品质量,而且增强了企业的竞争力和可持续发展能力。
2004年,法勒公司正式进入中国市场,成立了法勒移动供电贸易(上海)有限公司,标志着其全球战略的重大转型。这一决策基于对中国经济快速增长和物流装备市场巨大潜力的深刻洞察。法勒公司凭借其在移动自动化解决方案领域的全球领先地位,迅速在中国市场站稳脚跟,为汽车、电商、快递等多个行业提供高品质的产品和服务。这一转型不仅拓展了法勒的全球市场版图,也为其后续的本土化发展奠定了坚实基础。
随着中国内销市场的不断扩大,Clover Display Limited看到了巨大的商机。为了更好地服务中国内销客户,公司在2001年在深圳南山区成立了高华电子显示(深圳)有限公司。这家子公司以独资经营方式运作,可以开具增值税发票,以人民币结算,从而更加便捷地服务中国客户。深圳子公司的成立不仅拓宽了公司的销售渠道,也为其在中国市场的进一步发展奠定了坚实基础。
Error:Non-input node'txd' assigned to dedicated input是什么意思? Error:Non-input node\'txd\' assigned to dedicated input是什么意思?… 查看全部问答∨ |
|
背景:想把SMD解密卡嵌到PCB板上,此SMD的接口是SDIO方式的。 问题:SDIO接口一般使用几条线呀,都输出什么信号。 例如: SPI接口一般使用4条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从 ...… 查看全部问答∨ |
|
怎样在Linux里面通过C语言程序了,输出嘟嘟的报警声??? 在做一个网络传输的项目,功能是在收到网络消息的时候,在屏幕上面打印出消息的同时,可以听到报警提示的声音。大家有什么好的方法吗??… 查看全部问答∨ |
|
Event 整体来说是API是比较难以理解的,通常需要实践加上原理一起理解,最好是阅读相应代码。但是event 相当强大,一个event 有32个事件,对于任务同步控制是非常强大的。 1 RAW_U16 raw_event_create(RAW_EVENT *event_ptr, RAW_U8 *name_ptr, RA ...… 查看全部问答∨ |