一、硬件部分
1、EC11硬件和时序
硬件不详细叙述,RC滤波一定要加,不然检测不准。
A为上升沿时,B为高电平。顺时针
A为下升沿时,B为低电平。顺时针
A为上升沿时,B为低电平。逆时针
A为下升沿时,B为高电平。逆时针
2、单片机接口
使用STM32 PA2(中断口),PA4(普通输入)。
二、软件部分
使用原子STM32F103寄存器模板。
1、GPIO初始化和宏定义
#define B_PORT PAin(4)
#define A_PORT PAin(2)
void KEY_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFFF0F0FF; //PA2,4设置成输入
GPIOA->CRL|=0X00080800;
}
2、中断初始化
void EXTIX_Init(void)
{
KEY_Init();
Ex_NVIC_Config(GPIO_A,2,FRTIR); //上升沿、下降沿都触发
MY_NVIC_Init(2,3,EXTI2_IRQn,2); //抢占2,子优先级3,组2
}
3、中断服务程序
char count=0;
void EXTI2_IRQHandler(void)
{
/*初始化采样值,防止干扰while值的判断*/
//char keytemp=0x55; 错误的
static char keytemp=0x55; //根据网友jwdeng1995 反馈指正 非常感谢
/*keytemp&0X0F 表示只取末尾四位为有效值*/
/*0x0F 表示采样四次IO为高电平 表示IO状态稳定在高电平*/
/*0x00 表示采样四次IO为低电平 表示IO状态稳定在低电平*/
while(((keytemp&0X0F)!=0x0F)&&((keytemp&0X0F)!=0x00))
{
/*间隔1us后采集*/
delay_us(1);
/*按键缓存器左移一位*/
keytemp<<=1;
/*当脉冲脚为高时 或称为A相*/
if(A_PORT== 1)
{
/*按键缓存器末尾补1*/
keytemp |= 0x01;
}
}
/*引脚电平稳定状态后判断AB脉冲 判断方向正反 然后加减脉冲*/
if(A_PORT==1)
{
if(B_PORT==1)
{
count++; /*A上升沿时 B为高 顺时针*/
}
else
{
count--; /*A上升沿时 B为低 逆时针*/
}
}
else
{
if(B_PORT==0)
{
count++; /*A下降沿时 B为低 顺时针*/
}
else
{
count--; /*A下降沿时 B为高 逆时针*/
}
}
EXTI->PR=1<<2; //清除LINE2上的中断标志位
}
本文到此结束。
本人比较懒,如果有错误欢迎指正。
欢迎有共同兴趣爱好的人加群交流:QQ群:37244526 |