你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

求助stm32f103ze做编码器的读取,使用外部中断出现错误。

[复制链接]
@@@义 提问时间:2018-11-2 13:28 /
我配置的tim1,编码器模式,使用引脚pe9,pe11。pe10作为编码器z线信号。当不接pe10脚,编码器度数正常。当z线接入pe10时(pe10设置为外部中断,触发时,编码器数值清零),就回一直进入中断状态,不管z线有没有触发(用示波器量,z线输出正常)。
回调函数:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
int16_t tmp;
  if(GPIO_Pin == GPIO_PIN_10)
    {
     __HAL_TIM_SET_COUNTER(&htim1, 0);//编码器清零
   
    }
}


中断:
void EXTI15_10_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI15_10_IRQn 0 */
  /* USER CODE END EXTI15_10_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);
  /* USER CODE BEGIN EXTI15_10_IRQn 1 */
  /* USER CODE END EXTI15_10_IRQn 1 */
}
望各位朋友指教


收藏 评论9 发布时间:2018-11-2 13:28

举报

9个回答
@@@义 回答时间:2018-11-2 14:25:53
自己先顶下吧。真的看不出哪里有问题

七哥 回答时间:2018-11-2 14:46:09
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);里面清中断了吗?
@@@义 回答时间:2018-11-2 14:53:20
toofree 发表于 2018-11-2 14:46
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);里面清中断了吗?

不是库里直接清除中断么
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  /* EXTI line interrupt detected */
  if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
  {
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
    HAL_GPIO_EXTI_Callback(GPIO_Pin);
  }
}
这个就是清中断的吧
@@@义 回答时间:2018-11-2 15:02:10
@@@义 发表于 2018-11-2 14:53
不是库里直接清除中断么
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{

我debug跟踪了,进了这函数。
七哥 回答时间:2018-11-2 15:03:55
@@@义 发表于 2018-11-2 14:53
不是库里直接清除中断么
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{

这个是清中断。
你的中断是电平模式还是沿模式,请用沿模式,不要用电平中断。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

@@@义 回答时间:2018-11-2 15:09:25
toofree 发表于 2018-11-2 15:03
这个是清中断。
你的中断是电平模式还是沿模式,请用沿模式,不要用电平中断。 ...

元老,指导下,怎么用沿模式。是在不懂啊
@@@义 回答时间:2018-11-2 15:12:54
toofree 发表于 2018-11-2 15:03
这个是清中断。
你的中断是电平模式还是沿模式,请用沿模式,不要用电平中断。 ...

void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOE_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin : PE10 */
  GPIO_InitStruct.Pin = GPIO_PIN_10;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

}
您说的是这里么。我一直用的沿触发啊
sky_han 回答时间:2018-11-2 16:18:02
你这样,在中断里打断点,进入之后,查看中断的寄存器状态,是不是边沿触发中断态,然后查看清除的时候,是否清除掉? 你这样一直不停的进去,出不来的话,极有可能是中断状态没有清除掉,不管是什么原因造成的。  还有你的中断频率是多少,与你在此中断服务程序里执行的时间相比较,是不是还没有出中断,下一个中断又来了,做成清除不掉。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

@@@义 回答时间:2018-11-2 19:56:25
找出问题了。可能因为编码器是5v的系统。电压有点高。我把三个引脚都做下拉就好了。感谢各位!

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版