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

求助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
自己先顶下吧。真的看不出哪里有问题

toofree 回答时间: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跟踪了,进了这函数。
toofree 回答时间: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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版