基于stm32实现的红外遥控控制USB鼠标

2015-06-13 01:25权德奎长安大学西安710021
山东工业技术 2015年11期

权德奎(长安大学, 西安 710021)

基于stm32实现的红外遥控控制USB鼠标

权德奎
(长安大学, 西安 710021)

摘 要:嵌入式技术的发展早已成为信息化产业中不可缺少的重要一页。本文旨在应用嵌入式技术开发基于STM32实现的红外遥控控制USB鼠标,从更多的角度和细节阐述基于STM32在实际开发中需要注意和学习的细节。这也是一次从理论到到实践的过程。

关键词:STM32中断系统;STM32通用定时器;STM32红外遥控

加快嵌入式技术的开发应用,掌握嵌入式开发核心技术,对于未能赶上前几次世界范围计算机技术发展机遇的中国来说非常重要。基于SΤM32实现的红外遥控控制USB鼠标就是利用SΤM32的中断系统将各模块相互连接。当SΤM32捕获到信号时,向CUP发送中断请求,然后响应该中断,对中断进行处理。SΤM32通过识别捕获到的红外信号向PC端通过USB协议发送鼠标控制信号。

1 STM32中断系统

在SΤM32中,外部中断可由每一个I/O口进行外部事件的中断触发。在中断控制器支持的19个外部中断事件中,只有线0至15对应外部I/O的输入中断,线16则连接到PVD的输出,线17连接到RΤC的闹事件,线18连接到USB的唤醒时事件。在主程序运行之前,需要先进行中断初始化,包括使能中断通道、中断优先级分组初始化、配置中断线。当有多个中断时,CUP处理中断时严格按照中断优先级分组来决定处理哪个中断。中断优先级分为抢占优先级和子优先级,中断处理的顺序先有抢占优先级决定,当抢占优先级相同时,则由子优先级决定。

2 STM32通用定时器

SΤM32的通用定时器是一个通过可编程预分频器(PSC)驱动的16位自动装载计数器(CNΤ)构成。在这次开发中,SΤM32的通用定时器主要用于测量输入信号的脉冲长度即输入捕获。当输入捕获发生时将产生中断/DMΑ。当从独立通道中捕获到外界信号时,定时器将测量外界信号的周期、占空比来实现信号的识别。例如,在测量时,定时器设置为边沿触发,即定时器会计算信号上升沿和下降沿之间的时间差,其计算精度取决于定时器本身频率的精度。在测量方法中分为测频法和测周法,当被测信号频率大于中介频率时采用测频法,即在SΤM32中采用测频法。

3 STM32红外遥控

红外遥控是通过红外发射信号的过程,在遥控器上不同的按键所发射的信号是不同的,这样在接受端才能区别按键。红外是不能穿墙的,但红外遥控器也有无线电遥控器无法比拟的优点—在多个红外遥控器同时使用时,尽管采用相同的遥控频率或编码,但不会出现遥控信号“串门”的情况。在一点在家电中运用非常广泛。在SΤM32中,我们使用的红外遥控器编码方式为PWM(脉冲宽度调制)的NEC协议。其特征为:8位地址和8位指令长度;地址和命令2次传输(确保可靠性);PWM脉冲位置调制,以发射红外载波的占空比代表“0”和“1”;载波频率为38Khz;位时间为1.125ms或2.25ms。不同的逻辑和位码采用了不同时间间隔的红外高低脉冲。地址码和控制码等都采用8位的数据格式,且用反码表示以增加传输的可靠性。

4 STM32的主程序

在主程序中,首先要完成SΤM32的延时函数、中断分组设置、串口初始化、红外接受初始化、USB配置及初始化,其次就是while循环部分,这部分是最核心、最主要的一部分。在while(1)的死循环中,首先对遥控器的按键进行监控扫描。遥控器上的每一个按键都对应一个独一无二的键值key。通过函数Remote_Scan()进行按键监控扫描,若没有检测到按键,则键值key为假,若检测到遥控器有按键,则获取相应的键值并保存到key中,并通过switch(key)对不同的key进行不同的处理。对相应key值的处理实际上就是准备要发送的控制鼠标的数据。如何对相应的key值经行数据处理呢,在这里,就要先了解它的发送数据的函数Joystick_Send(a,b,c,d)。参数a是一个八位的数据,a的不同位置1分别代表鼠标中键按下、右键按下、左键按下、xy坐标的变化量和变化符号(光标移动方向)等。参数b表示x坐标的变化量,这个变化量是相对上一次坐标的变化量。参数c表示y坐标的变化量,同理为相对变化量。参数d为滚轮的变化,可以控制滚轮的上下滚动和滚动速率。这里要介绍一下电脑的坐标系,电脑的坐标系不同于一般的直角坐标系。电脑坐标以屏幕左上角为原点,水平向右为x轴正方向,竖直向下为y轴正方向。了解了数据发送函数,就可以经行数据准备了。例如接受的键值key代表鼠标左键按下,则设置参数a的相应位;若key代表鼠标右移,则设置参数b为相应整数;若key代表鼠标滚轮上滚,则设置参数d。理论上讲,这样的数据处理已经比较完美了,可在实际使用中会发现另外一个问题,就是鼠标移动灵敏度的问题。这时需要定义另外一个参数s代表灵敏度,在发送坐标数据b和c时,改为发送b*s和c*s,这样就可以相应地扩大或减小鼠标灵敏度了。当发送完数据后,需要将b、c、d数据清0。以上的处理在检测到键值key的情况下,当没有检测到键值的情况下,若之前有键按下,则需发送松开命令,即将a置为0。以上的整个过程都处在while(1)的死循环中,这样的话,当鼠标长时间没有移动的时候就会造成资源浪费。这里提供一个解决思路:当鼠标在一定时间内没有任何触发信号产生时,可认为此时之后的很长一段时间内都不会有信号产生,可将SΤM32设置为休眠状态。当有触发信号产生时,可先用该触发信号将SΤM32从休眠状态唤醒,当程序正常执行时,再处理 该信号(当然,也可以直接将该信号丢弃)。

5 结论

基于SΤM32实现的红外遥控控制USB鼠标旨在研究嵌入式系统的原理及系统设计。在本次的开发中涉及到嵌入式特别重要的定时器、中断等概念,将书本知识运用于实际,注重基础知识,为以后嵌入式开发奠定良好基础。

参考文献:

[1]刘艺,许大琴,万福.嵌入式系统设计大学教程[M].北京:人民邮电出版社,2008.

[2]李智奇,白小平,陈晓龙,樊晓虹.MSP430系列超低功耗单片机原理与系统设计[M].西安:西安电子科技大学出版社,2008.

[3]赵玉田.刮楔铁快速夹紧工具[J].设备维修.1982(06).

作者简介:权德奎(1993-),男,四川苍溪人,本科,研究方向:嵌入式系统开发。