初始化中断要按照路径依次初始化,时钟->GPIO->EXTI->NVIC
void Encoder_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//EXTI与NVIC时钟始终开启,不用手动开启
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//如果不清楚外设应该配置什么模式,可以查看手册或ai查询
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//GPIO初始化配置
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);//AFIO初始化配置
//void GPIO_EXTILineConfig(uinit8_t GPIO_PortSource, uinit8_t GPIO_PinSource);
//配置EXTI一般流程
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.EXTI_Line = EXTI_Line0 | EXTI_Line1;//按照插的引脚的数字
EXTI_InitStruct.EXTI_LineCmd = ENABLE;//开启中断
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//中断 or 事件
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;//触发方式:上升沿,下降沿,两者皆可
EXTI_Init(&EXTI_InitStruct); //初始化EXTI_InitStruct结构体
//配置NVIC一般流程
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel =EXTI0_IRQn;//我们使用EXTI0所以选择EXTI0的通道
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;//我们使用EXTI1所以选择EXTI1的通道
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_Init(&NVIC_InitStructure);
}
中断函数,查Startup文件看中断函数名称
在中断函数中最好判断一下是否是对应端口的中断,再执行中断内容,最后清除中断状态回到主函数:
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0) == SET)
{
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
{
中断内容;
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
最后为了消抖,可以采用读取变化量再叠加,如:
int16_t XXX_Count = 0;
int16_t Get_XXX(void)
{
int16_t temp = XXX_Count;
XXX_Count = 0;
return temp;
}
然后在主函数中
显示变量Num += Get_XXX;

1483

被折叠的 条评论
为什么被折叠?



