@@@义 发表于 2018-11-2 13:28:02

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

我配置的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 */
}
望各位朋友指教


@@@义 发表于 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)
{


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

@@@义 发表于 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

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

@@@义 发表于 2018-11-2 19:56:25

找出问题了。可能因为编码器是5v的系统。电压有点高。我把三个引脚都做下拉就好了。感谢各位!
页: [1]
查看完整版本: 求助stm32f103ze做编码器的读取,使用外部中断出现错误。