#include "stm32f10x.h" // Device header
int16_t encoder_count;
void encoder_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_INitstructure;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开启AFIO的时钟 EXTI是CPU的内置部分 是一直开启状态 NVIC同理
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输出 (在EXTI中上拉 下拉 浮空 都是可以的)
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);//配置数据选择器 配置我们要中断的引脚
//GPIO_PinRemapConfig-引脚重映射
//外部中断的配置
EXTI_INitstructure.EXTI_Line = EXTI_Line0 | EXTI_Line1 ; //指定要配置的中断线
EXTI_INitstructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_INitstructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_INitstructure.EXTI_LineCmd = ENABLE; //中断线状态
EXTI_Init(&EXTI_INitstructure);
//NVIC在misc.h中 配置
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设定分组
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
void EXTI0_IRQHandler(void)//中断函数的配置
{
if(EXTI_GetITStatus(EXTI_Line0) == SET)
{
EXTI_ClearITPendingBit(EXTI_Line0);
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0)
{
encoder_count--;
}
}
void EXTI1_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line1) == SET)
{
EXTI_ClearITPendingBit(EXTI_Line1);
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0) == 0)//判断另一个引脚
{
encoder_count++;
}
}
int16_t get_count(void)//返回count 的变化值
{
int16_t temp;
temp = encoder_count;
encoder_count = 0;
return temp;
}
//注意事项
//中断函数执行不宜过长 否则会形成堵塞 在主程序和中断程序里,不要操作同一会发生冲突的硬件
//可以在中断里 操作变量 或者 标志位
STM32学习(四)旋转编码器 新手入门及常见问题解决
最新推荐文章于 2024-04-26 16:10:52 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)