```c
void Interrupt_Init(void)
{ GPIO_InitTypeDef GPIO_InitStructure;//引脚初始结构体
EXTI_InitTypeDef EXTI_InitStructure;//EXTI结构体
NVIC_InitTypeDef NVIC_InitStructure;//NVIC结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO时钟
//注意RCC_APB2PeriphClockCmd()里面需要与里面对应
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//选中断口选择GPIOA0
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource4);//选中断口选择GPIOA4
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
EXTI_InitStructure.EXTI_Line=EXTI_Line4|EXTI_Line0;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//外部中断
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling;//工作方式
EXTI_Init(&EXTI_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;//EXTI0中断通道
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道使能
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//子优先级
NVIC_Init(&NVIC_InitStructure);//根据指定的参数初始化VIC寄存器
NVIC_InitStructure.NVIC_IRQChannel =EXTI4_IRQn;//EXTI4中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
}
``uint16_t CountSensor_Get(void)
{
return CountSensor_Count0;
}
//注意中断函数名字EXTIx_IRQHandler
void EXTI0_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line0)==1)
{
//if(EXTI_GetITStatus(EXTI_Line0)==1)
**if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4))**//当两相电平相等时,对应是顺时针转。不相等反之
{
CountSensor_Count0++;
}
else
{
CountSensor_Count0--;
}
}
while(!EXTI_GetITStatus(EXTI_Line0));
EXTI_ClearITPendingBit(EXTI_Line0);
}
void EXTI4_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line4)==1)
{
if(EXTI_GetITStatus(EXTI_Line4)==1)
{
//sw=~sw;
}
}
EXTI_ClearITPendingBit(EXTI_Line4);
}
/*
编码器A相和B相输出低电平:顺时针
编码器A相输出低电平和B相输出高电平:逆时针
注意:当你开启中断服务是一定要再中断服务函数中写代码,不然会卡死代码(可以空着,也要写)
注意:编码器模块中断触发最好使用双边沿触发模式
*/
我们可以选择中断法可以选择查询法,我们根据自己需要选择`
在这里插入代码片`void encodeing_scan(void)
{
if((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))==0)
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4) == 0)//正转
{
CountSensor_Count0++;
}
else
{
CountSensor_Count0--;
}
while((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))==0 );
}
}
STM32使用编码器模块遇到问题(库函数版)
于 2022-02-15 11:35:49 首次发布