#include "stm32f10x.h" // Device header int16_t Encoder_Num; void Encoder_Init (void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); GPIO_InitTypeDef GPIO_Initstructure; GPIO_Initstructure.GPIO_Mode=GPIO_Mode_IPU; GPIO_Initstructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1; GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_Initstructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0|GPIO_PinSource1); EXTI_InitTypeDef EXTI_Initstructure; EXTI_Initstructure.EXTI_Line=EXTI_Line0|EXTI_Line1; EXTI_Initstructure.EXTI_LineCmd=ENABLE; EXTI_Initstructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_Initstructure.EXTI_Trigger=EXTI_Trigger_Falling; EXTI_Init(&EXTI_Initstructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitTypeDef NVIC_Initstructure; NVIC_Initstructure.NVIC_IRQChannel=EXTI0_IRQn; NVIC_Initstructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority=1; NVIC_Initstructure.NVIC_IRQChannelSubPriority=1; NVIC_Init(&NVIC_Initstructure); NVIC_Initstructure.NVIC_IRQChannel=EXTI1_IRQn; NVIC_Initstructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority=2; NVIC_Initstructure.NVIC_IRQChannelSubPriority=2; NVIC_Init(&NVIC_Initstructure); } int Encoder_get() { int16_t temp; temp=Encoder_Num; Encoder_Num=0; return temp; } void EXTI0_IRQHandler () { if (EXTI_GetITStatus(EXTI_Line0)==SET) { if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0) { if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==1) { Encoder_Num++; } } EXTI_ClearITPendingBit(EXTI_Line0); } } void EXTI1_IRQHandler () { if (EXTI_GetITStatus(EXTI_Line1)==SET) { if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0) { if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==1) { Encoder_Num--; } } EXTI_ClearITPendingBit(EXTI_Line1); } } 中断1可以出发但是中断0不能触发
时间: 2023-09-11 21:10:22 浏览: 132
stm32f10x_encoder.rar_STM32 编码器_STM32编码器_stm32 encoder_stm32 en
根据您提供的代码,中断1可以触发但中断0不能触发的问题可能是由于以下原因导致的:
1. 引脚配置不正确:请确保将外部中断线0连接到GPIOB的引脚0,并将外部中断线1连接到GPIOB的引脚1。同时,确保在GPIO_Initstructure结构体中正确配置了引脚的模式。
2. 中断优先级设置不正确:请确保中断0的优先级高于中断1的优先级,以确保中断0能够被正确触发。可以通过调整`NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority`值来设置优先级。
3. 中断触发方式设置不正确:根据代码,中断触发方式被配置为下降沿触发。请确认外部信号的触发方式是否满足此条件。如果您期望使用其他触发方式,请相应地调整`EXTI_Initstructure.EXTI_Trigger`参数。
4. 中断使能未打开:请确保已通过`NVIC_Initstructure.NVIC_IRQChannelCmd=ENABLE`打开了中断0和中断1的中断向量。
如果仍然存在问题,请检查硬件连接是否正确并提供更多关于硬件环境和其他相关代码的信息,以便更好地帮助您解决问题。
阅读全文