完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、内容介绍
之前对一个输入捕获的实验没有理解透彻,虽然当时实验是有结果,但现在时间过去太久,所以印象很模糊,搞得我再次谈到这个竟然变得语无伦次,所以我还是决定复盘。所以今天我回顾了之前自己做过的输入捕获实验-获取一个高电平的持续时间,并进行重新梳理。此次更多是帮助自己回忆并加深理解,也算是给自己擦屁股了,真是让人感到不爽。 二、逻辑梳理 1、初始化 2、针对其中预分频为什么是72做一个解释 预分频 解释 3、理解两个变量:STA 、VAL 补充:上图中,捕获方式:0-上升沿捕获,1-下降沿捕获 三、部分代码 1、变量STA 、 VAL u8 STA; //输入捕获状态 单字节(8位) u16 VAL; //输入捕获值 双字节 2、输入捕获初始化,定时器5通道1输入捕获配置 void input_init() { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_ICInitTypeDef TIM5_ICInitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* 开启定时器5时钟 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); //使能TIM5时钟 TIM_ClearITPendingBit(TIM5,TIM_IT_Update|TIM_IT_CC1); //清除中断标识位 TIM_TimeBaseInitStructure.TIM_Period = 0xffff; //设置定时器自动重装载值 TIM_TimeBaseInitStructure.TIM_Prescaler = 71; //以1MHz的频率计数,一次是1μs(微妙) TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);//初始化TIM5的时间基数单位 TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端,IC1映射到TI1上 TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获 TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上 TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 TIM5_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000,配置滤波器,不滤波 TIM_ICInit(TIM5, &TIM5_ICInitStructure); //初始化TIM5输入捕获通道1 //中断分组初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn; //打开TIM5的全局中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级为0 NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; //响应优先级为1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能 NVIC_Init(&NVIC_InitStructure); TIM_Cmd(TIM5,ENABLE); //使能或者失能TIM5外设 TIM_ITConfig(TIM5, TIM_IT_Update|TIM_IT_CC1, ENABLE ); //使能或者失能指定的TIM中断 } 3、中断函数,使用定时器TIM5 void TIM5_IRQHandler() //定时器5输入捕获中断函数 { if((STA&0X80)==0) //还未成功捕获。解释:STA第八位,1-捕获成功,0-未捕获成功 { if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET) //TIM_IT_Update不等于0表示进入定时器更新中断(中断更新) { if(STA&0X40) //已经捕获到高电平了 { if((STA&0x3f)==0x3f) //高电平时间太长了。解释:后六位保存溢出次数,如果等于最大溢出次数表示高电平时间过长 { STA|=0x80; //标记成功捕获了一次。解释:时间太长,强制设置为捕获成功。 VAL=0xffff; } else { STA++; } } } } if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET) //CC1捕获1发生捕获事件 { //0-上升沿捕获,1-下降沿捕获 if(STA&0X40) //捕获到一个下降沿。解释:STA第七位判断。 解释:因为STA默认为0,并且默认配置为上升沿捕获,所以会首先执行else { TSTA|=0X80; //第8位置1 标记成功捕获到一次完整高电平 VAL=TIM_GetCapture1(TIM5); //获得TIMx输入捕获1的值,x=5 TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //设置为上升沿捕获 } else { STA=0; //清空 VAL=0; //清空 TIM_SetCounter(TIM5,0); //计数值清0 STA|=0X40; //第7位置1 标记捕获到了上升沿。 解释:此时STA为1,下次会执行if,为下降沿捕获 TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //设置为下降沿捕获 } } TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位 } 4、计算高电平时间 u32 temp; if((STA&0x80)) //成功捕获到了一次完整高电平 { temp=STA&0x3f; //溢出次数 temp=temp*65536; //溢出时间 * 溢出次数 = 溢出总时间 temp=temp+VAL; //总得的高电平持续时间 printf(“高电平持续时间: %d usrn”,temp); STA=0; //开启下一次捕获 } delay_ms(10); //延迟10毫秒 四、总结 高电平的输入使用外设,比如按键就可以,在此没有对外设进行回顾。 重新梳理理清了之前一直没搞明白的问题。 1、定时器更新中断,这个中断是判断是否完成了一次完整的捕获。就拿此次捕获高电平来说,一次完整的高电平捕获是捕获一次上升沿加一次下降沿,这样才算是捕获成功。而判断内部解决的主要是未捕获成功的情况,捕获成功自然就能达到目的,所以无需处理。在未捕获的情况下,还要判断已经捕获到了高电平(只是高电平没有结束,不是一次完整的捕获),给这个高电平设置了一个最大值,也就是最长持续时间,然后强制设置为捕获成功。 2、输入捕获中断,主要是捕获上升沿和下降沿。因为程序一开始就设置了首先捕获上升沿,并且STA=0。所以第一次STA&0X40结果肯定为0(假),也就不会执行 if 下面的语句,而是执行 else 里面的语句,所以就要在 else 里设置捕获到上升沿之后的操作。 3、有了第2点的理解,我们是可以根据自己的需求去设置先检测什么沿,或者是先执行 if 还是 else 。 4、自己其他的一些疑惑在上面后两张图片里写清楚了。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1559 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1500 浏览 1 评论
930 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
662 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1551 浏览 2 评论
1846浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
606浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
503浏览 3评论
507浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
487浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-9 04:31 , Processed in 0.567433 second(s), Total 48, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号