基于MSP430F5529实现一个简易USB键鼠设备
2023寒假在家练活动。要求实现一个基于MSP430F5529处理器的USB鼠标、键盘复合设备,拨动游戏摇杆实现鼠标的移动,一个按键实现左键点击,另一个按键按下实现键盘敲入一串字符"eetree.cn"。
标签
MSP430
2023寒假在家练
fyjh2023
更新2023-03-28
复旦大学
616

一、项目需求

在IO扩展板上有一个用X、Y二轴电位计制作的游戏摇杆,并且处理器芯片支持USB通信。要求实现一个基于MSP430F5529处理器的USB鼠标、键盘复合设备,拨动游戏摇杆实现鼠标的移动,一个按键实现左键点击,另一个按键按下实现键盘敲入一串字符"eetree.cn"。

二、设计思路

不断查询摇杆、按键的状态,然后分别作出鼠标移动、点击和键盘输入的动作。由于任务并不复杂,因此不需要使用中断,在主循环中顺序执行各项操作。具体操作如流程图所示。

Fh-PA3XeD6m7CmscpSSJ4pU1bwPb

三、技术细节

自然是面向例程的编程,省时省力又省心。USB-HID设备的实现,参照例程,针对IO扩展板上外设的特点进行补充修改,即可实现相关功能。TI的CCS开发平台提供了充足的例程供用户参考。

3.1 摇杆

经过示波器的测量,发现摇杆在x、y方向上的位置,被转化成输出波形的频率和占空比。用示波器测量了摇杆拨动到正前、正后、正左、正右,四个极限位置的输出波形。因为该波形的频率很低,同时不存在占空比极小或极大的情况,所以采集手段为:使用一个时钟,从第1个上升沿起,依次记录高电平和低电平所用的时钟周期数,到第2个上升沿停止计数。接着,从中提取频率和占空比信息,映射到摇杆在x、y方向上的具体位置。

FlXyJkKmRtmLc_-aRPxhBH0nWGfP

现在,使用MSP430单片机实现这一想法。考虑到它的库函数并没有过多的封装,且没有运行操作系统。因此波形的采集只要在while循环内不断读取输入端口的电平,然后用计数器记录循环的次数。如果,每条指令执行的时间是严格固定的(忽略if语句的跳转操作),并且while循环的过程中不会被打断,那么这种方式等价于用一个较低频率的时钟进行采样。

D1=0,D2=0,D3=0;
valid=1;
while(HWREG16(__MSP430_BASEADDRESS_PORT1_R__ + OFS_PAIN) & (GPIO_PIN2) ==0)         ;
while(HWREG16(__MSP430_BASEADDRESS_PORT1_R__ + OFS_PAIN) & (GPIO_PIN2))         D1++;
while((HWREG16(__MSP430_BASEADDRESS_PORT1_R__ + OFS_PAIN) & (GPIO_PIN2))==0)    D2++;
is_valid=valid;
if(is_valid){
    Point1=D1;Point2=D2;
}

3.2 按键

根据IO扩展板的电路,读取模拟信号输入端口的电压后,与设定的阈值进行比较,然后判断按键的动作。

使用MSP430单片机实现这一想法。配置1路12位ADC,以单次采样的方式采集数据。

ADCHAL_initPorts();
ADC12_A_startConversion(ADC12_A_BASE,ADC12_A_MEMORY_0,ADC12_A_SINGLECHANNEL);
result=ADC12_A_getResults(ADC12_A_BASE,ADC12_A_MEMORY_0);
if(result>3400 && b1==TRUE){
    b1=FALSE;
    button1Pressed=TRUE;
}
else if (result>3600){
    b2=FALSE;
}
else if(result>2800 && result<3060 && b1==FALSE){
    button1Pressed=TRUE;
    b1=TRUE;
    for (result = 0x43FF; result > 1; result--);
}
else if(result>1895 && result<1955 && b2==FALSE){
    button2Pressed=TRUE;
    b2=TRUE;
    for (result = 0x43FF; result > 1; result--);
}
ADC12_A_disableConversions(ADC12_A_BASE,ADC12_A_COMPLETECONVERSION);

3.3 键鼠操作

面向例程编程实现相关操作。

综合MSP430的“H8_Keyboard”和“H7_Mouse”两个例程,得到USB-HID的基本框架。为了简化编程,在MSP430上对摇杆输出的频率和占空比数值以阈值比较的方式映射为鼠标指针的移动量。(稍后在ESP32上会将它们线性映射到指针的移动量上)。

3.4 其他

使用https://github.com/wg0z/MSP430-ST7735-SoftSPI上的开源代码,以软件SPI的方式驱动LCD屏幕,显示简单的图案。以此为基础制作了一个极简的开机动画(屏幕颜色切换)。

四、实现功能

成功实现按键控制文字输入、鼠标点击;摇杆控制鼠标指针;另外使用LCD屏幕制作了一段简单的开机动画(优雅地关闭刺眼的白色屏幕)。

五、遇到的问题

5.1. 波形频率和占空比采集

使用一个闸门信号,记录高频信号在这个时间窗口内上升沿的个数,可以较好地测量高频信号的频率。使能一路中断,记录第一个上升沿、第一个下降沿和第二个上升沿到达的时刻,能够较好地测量低频信号的频率和占空比。

但是这两种方案,要么不能用,要么编程复杂(需要仔细写中断函数,设置本地时钟),因此索性用最低端的轮询来完成任务。但是,需要合理设置编译器的优化等级并检查对应的汇编代码,否则有可能会产生预期之外的行为。

5.2 USB调试

根据以前使用CH552G的经验,使用Bus Hound工具在Windows电脑上直接观察设备发出的HID数据。根据HID数据的内容,及其发送的频率,判断设备的工作是否符合预期。

5.3 烫手

IO扩展板上有4个加热电阻,如果不在程序里拉低加热功能的控制引脚,它们的温度会非常高。注意安全。

5.4 调试器变砖

这是MSP430 LaunchPad的常见问题(这一点不如MSP432P401,它从来没出过这问题)。调试器如果一升级,那么它会提示“需要恢复”。点击Recover并不会解决问题。

FrbDh77-VEZg1VSLpyesZOwgm7Pb

解决方式不复杂,另找一台没有装过CCS的Windows电脑,安装软件,然后在那台电脑上面修复调试器。

六、未来计划

该项目已实现所要求的全部功能,不过仍然存在一些小小的遗憾。首先,希望能找到硬件SPI驱动LCD屏幕的代码,从而实现丰富的动画效果。其次,希望能利用上旋转编码器,实现键盘/鼠标动作的自由切换。

不过,仔细思考了下代码的整个流程,隐隐约约感觉用CH552也可以实现项目的要求。摇杆位置读取的算法在51单片机上自然能用,鼠标、键盘按键的功能我之前做过并取得成功,同时网上也有许多开源资料供参考。

某宝上CH552G的单价为1.85元。不如发3个CH552G的核心板,硬件成本是MSP430F5529 Launchpad的零头。

 

附件下载
yjh_H8_Keyboard.rar
代码
烧录文件.out
团队介绍
杨君昊
团队成员
fyjh2023
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号