求助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 */
}
望各位朋友指教
自己先顶下吧。真的看不出哪里有问题
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);里面清中断了吗? 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 14:53
不是库里直接清除中断么
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
我debug跟踪了,进了这函数。 @@@义 发表于 2018-11-2 14:53
不是库里直接清除中断么
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
这个是清中断。
你的中断是电平模式还是沿模式,请用沿模式,不要用电平中断。 toofree 发表于 2018-11-2 15:03
这个是清中断。
你的中断是电平模式还是沿模式,请用沿模式,不要用电平中断。 ...
元老,指导下,怎么用沿模式。是在不懂啊 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);
}
您说的是这里么。我一直用的沿触发啊
你这样,在中断里打断点,进入之后,查看中断的寄存器状态,是不是边沿触发中断态,然后查看清除的时候,是否清除掉? 你这样一直不停的进去,出不来的话,极有可能是中断状态没有清除掉,不管是什么原因造成的。还有你的中断频率是多少,与你在此中断服务程序里执行的时间相比较,是不是还没有出中断,下一个中断又来了,做成清除不掉。 找出问题了。可能因为编码器是5v的系统。电压有点高。我把三个引脚都做下拉就好了。感谢各位!
页:
[1]