stm32的输入捕获实验程序问题(测量脉冲宽度)

初始化函数没有问题,计数时间单位为1us,编程思路是定义两个全局变量一个32位的一个8位的,32位用来存放输入捕获值,8位的最高位用来表示捕获到高电平(1表示捕获)次高位... 初始化函数没有问题,计数时间单位为1us,编程思路是定义两个全局变量一个32位的一个8位的,32位用来存放输入捕获值,8位的最高位用来表示捕获到高电平(1表示捕获)次高位表示脉冲是否捕获完成(捕获完成置1),低六位用来表示计数器溢出次数的,每溢出一次自加一,通过定义的i/o口结合按键手动输入高电平,本来是不会出现溢出情况的(32位定时器溢出需要4千多秒)但是按一下按键有的时候就会出现溢出的那种情况,实在是找不出来有什么逻辑问题了,求大神指教,本人虚心求教万望各位指点一二 展开
 我来答
百度网友c908714

2019-04-01 · TA获得超过1071个赞
知道小有建树答主
回答量:1476
采纳率:40%
帮助的人:74.8万
展开全部
1、脉冲宽度
如下图所示,采集该高电平脉冲的宽度,只需要进入输入捕获上升沿检测,记录当前的发生上升沿时的CNT值,再进行输入捕获下降沿检测,也记录当前发生下降沿时的CNT值,两次CNT值的差值再根据计数的频率就可以算出脉冲的宽度。

上升沿及下降沿捕获的程序具体实现如下:
TIM8_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数

void TIM8_UP_IRQHandler(void)
{
if((TIM8CH4_CAPTURE_STA&0X80)==0) //还未成功捕获
{
if (TIM_GetITStatus(TIM8,TIM_IT_Update) != RESET)
{
if(TIM8CH4_CAPTURE_STA&0X40) //已经捕获到高电平了
{
if((TIM8CH4_CAPTURE_STA&0X3F)==0X3F) //高电平太长了
{
TIM8CH4_CAPTURE_STA"=0X80; //标记成功捕获了一次
TIM8CH4_CAPTURE_VAL=0XFFFF;
}
else
TIM8CH4_CAPTURE_STA++; //捕获高电平后定时器溢出的次数++
}
}

}
TIM_ClearITPendingBit(TIM8,TIM_IT_Update); //清除中断标志位
}
void TIM8_CC_IRQHandler(void)
{
if((TIM8CH4_CAPTURE_STA&0X80)==0)
{
if(TIM_GetITStatus(TIM8,TIM_IT_CC4) != RESET) //捕获1发生捕
追问
首先感谢您耐心的回答,但是我真找不出我的程序哪里有错误,没有问题的程序我这也有就是想不明白我自己写的这个有什么问题
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
冯小气气
2019-04-02 · 知道合伙人IT服务行家
冯小气气
知道合伙人IT服务行家
采纳数:98 获赞数:239
八年编程经验,公司核心技术人员。

向TA提问 私信TA
展开全部

具体的捕获流程我不太了解,但你的代码里有几个明显的问题。

1.图一中你的判断条件是STA>=0x80进入第一层if后,不可能出现STA==0x3f的情况,因为此时STA总是大于0x3f的。还有STA++会导致一个后果,会可能修改掉你的bit7和bit6,正确的此处加加的方式应该是

//1.达到最大计数后重新开始计数
if(STA & 0x3F == 0x3F)
    STA &= 0xC0;
STA++;
 //2.或者保持最大计数
 if(STA & 0x3F == 0x3F)
    STA |= 0x3F;
 else
     STA++;

2.图三里为什么要乘以0xFFFFFFFF啊?还有while(a==40)完全没意义啊,这个循环体里把a=0了呀

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友5968c0b
2019-04-01 · TA获得超过105个赞
知道答主
回答量:274
采纳率:40%
帮助的人:43.4万
展开全部
(22)有版本作“疲龙”;(23)有版本作“喷水”;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式