
新年伊始,我从网上购买了一款开发板,这款开发板的核心板的处理器是STM32G031G8U6, 它是32位的Cortex M0+处理器,主频能达到64MHz,内存有8kB。核心板上MCU引脚和核心板引出脚的对应关系如图1。 图1 按键和编码器核心板侧接口 file:///C:/Users/EPT/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png file:///C:/Users/EPT/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png 开发板配套的底板提供了2个按键和一个旋转编码器,其硬件原理图如图2。 图2 按键和编码器底板板侧接口 file:///C:/Users/EPT/AppData/Local/Temp/msohtmlclip1/01/clip_image004.png 引脚关系表如表1所示 表1引脚关系表
硬件原理介绍完了,实现按键和旋转编码开关输入检测的方法有轮询、GPIO的EXIT中断以及定时器的ADC捕获中断等解决方案。由于外部电路没有做硬件滤波消抖,需要做软件去抖,这里我选择了Systick定时器中断轮询的方式对输入信号进行去抖处理。在读取到电平后,软件开始计数,达到滤波要求的计数值后,更新软件内部相应的IO状态标志; 整体的软件设计如图所示: 按键在消抖之后,就可以根据按键得到状态进行相应的处理。 按键的软件设计,网上有很多模板,我选择了安富莱的按键设计框架,详情可以点击查看 对旋转编码器,在消抖后,我选择按下列的处理逻辑进行方向判断和脉冲数计算: 当A信号上升沿时B信号为低电平,或当A信号下降沿时B信号为高电平,证明当前编码器为顺时针转动 当A信号上升沿时B信号为高电平,或当A信号下降沿时B信号为低电平,证明当前编码器为逆时针转动。 编码器信息更新主要分为滤波和编码器器技术计算。 核心代码如下: /*对单个编码器的引脚进行滤波处理*/ static void bsp_DetectEncoder(uint8_t i) { ENCODER_T *pEncoder; # A4 q7 e, g/ @/ \/ x7 ~ j& f. k8 X' t pEncoder=&s_tEncoder; if(EncoderPinActive(i)) { if(pEncoder->FilterCountA<ENCODER_FILTER_TIME) { pEncoder->FilterCountA=KEY_FILTER_TIME; } else if(pEncoder->FilterCountA<2*ENCODER_FILTER_TIME) { pEncoder->FilterCountA++; } else { if(pEncoder->NowAState==0) { pEncoder->PreAState=pEncoder->NowAState; pEncoder->NowAState=1; } else { pEncoder->PreAState=pEncoder->NowAState; } } } else { if(pEncoder->FilterCountA>ENCODER_FILTER_TIME) { pEncoder->FilterCountA=ENCODER_FILTER_TIME; } else if(pEncoder->FilterCountA!=0) { pEncoder->FilterCountA--; } else { if(pEncoder->NowAState==1) { pEncoder->PreAState=pEncoder->NowAState; pEncoder->NowAState=0; } else { pEncoder->PreAState=pEncoder->NowAState; } } } if(EncoderPinActive(i+1)) { if(pEncoder->FilterCountB<ENCODER_FILTER_TIME) { pEncoder->FilterCountB=KEY_FILTER_TIME; } else if(pEncoder->FilterCountB<2*ENCODER_FILTER_TIME) { pEncoder->FilterCountB++; } else { if(pEncoder->BState==0) { pEncoder->BState=1; } } } else { if(pEncoder->FilterCountB>ENCODER_FILTER_TIME) { pEncoder->FilterCountB=ENCODER_FILTER_TIME; } else if(pEncoder->FilterCountB!=0) { pEncoder->FilterCountB--; } else { if(pEncoder->BState==1) { pEncoder->BState=0; } } } , \& I0 j" M0 b: z} 编码器相对脉冲数计算: static void bsp_EncoderCalcPluse(uint8_t i) { ENCODER_T *pEncoder; pEncoder=&s_tEncoder; if((pEncoder->NowAState^pEncoder->PreAState)==1) { if(pEncoder->PreAState==0)//上升沿 { if(pEncoder->BState) { pEncoder->PluseCount-=pEncoder->PluseScale; printf("%d\r\n",pEncoder->PluseCount); } else { pEncoder->PluseCount+=pEncoder->PluseScale; printf("%d\r\n",pEncoder->PluseCount); } } else//下降沿 { if(pEncoder->BState) { pEncoder->PluseCount+=pEncoder->PluseScale; printf("%d\r\n",pEncoder->PluseCount); } else { pEncoder->PluseCount-=pEncoder->PluseScale; printf("%d\r\n",pEncoder->PluseCount); } } } } 首次发帖,不足之处请见谅 |
【技术之约】2025 STM32峰会邀您共赴技术盛宴!
【STM32F769I-DISC1】测评04:使用ADC通道制作的位移采集模块,上传数据到PC端
【STM32F769I-DISC1】测评03:使用板载的串口6制作生物体监测
【STM32F769I-DISC1】测评02:调试串口1与PC通讯功能
【名单公布】GUI Demo板申请活动出名单了!
我是星海灿烂,我的2024年总结
【粉丝福利】“意”起来!2025新年倒计时活动,7天7活动,冲!
收到新年礼物开发板
【板卡试用】ST25R100 – ST新一代高性价比NFC读写器芯片:轻松打造智能交互体验
【Free】新品STM32H503免费申请!高性能!高安全性!尽显锋芒!