XYBGJJ 2022-11-27 15:32 采纳率: 0%
浏览 77

STM32输入捕获只能捕获一次上升沿,捕获不到下降沿

学习野火stm32 HAL库的tim5 ch1输入捕获功能,代码和例程代码一样,按下PA0控制的按键,只能进入中断捕获到一次上升沿,松开按键捕获不到下降沿,中断服务函数配置了下降沿的情况,捕获不到下降沿,没办法执行else之后的语句,这该怎么办呢

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  TIM_ICUserValueStructure .usPeriod ++;
    printf("Update %d! \r\n",TIM_ICUserValueStructure .usPeriod);     //每次中断打印一次值
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
  TIM_IC_InitTypeDef sConfigIC;
  if ( TIM_ICUserValueStructure .ucStartFlag == 0 )
  {
    LED1_TOGGLE;       
    __HAL_TIM_SET_COUNTER(htim,0); // 清零定时器计数
    TIM_ICUserValueStructure .usPeriod = 0;            
    TIM_ICUserValueStructure .usCtr = 0;
    // 配置输入捕获参数,主要是修改触发电平
    sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING;//这里设置了捕获下降沿,但是没有触发
    sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
    sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
    sConfigIC.ICFilter = 0;
    HAL_TIM_IC_ConfigChannel(&htim5, &sConfigIC, TIM_CHANNEL_1);
    // 清除中断标志位
    __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1);
    // 启动输入捕获并开启中断
    //    HAL_TIM_Base_Start_IT(&htim5); 
    HAL_TIM_IC_Start_IT(&htim5,TIM_CHANNEL_1);    
    TIM_ICUserValueStructure .ucStartFlag = 1;            
    //    printf("ucStartFlag是 %d! \r\n",TIM_ICUserValueStructure .ucStartFlag);
  }        
  else
  {
    //    printf("ucStartFlag是 %d! \r\n",TIM_ICUserValueStructure .ucStartFlag);//执行不到else之后的代码
    LED2_TOGGLE;
    // 获取定时器计数值
    TIM_ICUserValueStructure .usCtr = HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_1);
    // 配置输入捕获参数,主要是修改触发电平
    sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
    sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
    sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
    sConfigIC.ICFilter = 0;
    HAL_TIM_IC_ConfigChannel(&htim5, &sConfigIC, TIM_CHANNEL_1);
    // 清除中断标志位
    __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1); 
    // 启动输入捕获并开启中断
    HAL_TIM_IC_Start_IT(&htim5,TIM_CHANNEL_1);    
    TIM_ICUserValueStructure .ucStartFlag = 0;            
    TIM_ICUserValueStructure .ucFinishFlag = 1;    
  }
}
  • 写回答

2条回答 默认 最新

  • 旭日初扬 2022-11-27 16:54
    关注

    松开按键要捕获上升沿吧,

    电子按键 一般按下都是与GND短接的。
    按键弹起:高电平
    按键按下:低电平

    按键弹起状态-->按键按下 按键与地短接 高点电平变为低电平 电平状态会有段时间呈现下降沿
    按键按下状态-->按键弹起 低电平变为高电平 电平状态会有断时间呈现上升沿

    评论

报告相同问题?

问题事件

  • 创建了问题 11月27日

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作