首页 > 范文大全 > 正文

基于TMS320F2812的GPIO总线在多路多位开关中的应用

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于TMS320F2812的GPIO总线在多路多位开关中的应用范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

【摘要】本文介绍了使用DSP芯片TMS320F2812的GPIO总线,实现对多路多位开关状态的监测,并结合工程实际应用,进行了硬件电路设计和软件编程。该方法的使用大大节约了芯片的硬件资源,提高了DSP芯片的使用效率。

【关键词】TMS320F2812;GPIO总线;I/O引脚;矩阵连接;多路多位开关

1.引言

对于复杂多路多位旋转或按键开关,传统上使用微控制器(MCU)的I/O引脚对开关状态进行监测,这种方法需要占用MCU大量的I/O引脚,浪费了MCU有限的硬件资源,同时也给软件编程带来了诸多不便。TMS320F2812是TI公司的一款用于工业控制和数据处理的高性能、低功耗、具有较高性价比的DSP芯片。与传统的MCU比较,TMS320F2812具有更快的速度、更高的效率和更强大的数据处理能力。它可在150MHz主频下工作,提供56个通用GPIO引脚。本文结合工程应用实际,使用矩阵电路连接形式,结合软件编程,实现了TMS320F2812的GPIO总线对多路多位开关的动态监测,减少了硬件资源的浪费,降低了软件开销。

2.硬件电路设计

TMS320F2812具有6组通用目的GPIO总线的数字量I/O引脚,它们大部分是多功能复用引脚,即这些I/O引脚既可以作为通用数字I/O口,也可以作为特殊功能口(如SCI、SPI、CAN等),可以根据设计需要,通过GPxMUX寄存器将各I/O引脚配置为数字I/O模式或者其他模式。如果引脚工作在数字I/O模式,还可以通过GPxDIR寄存器配置这些数字I/O引脚的方向,即是是输入引脚还是输出引脚。本文介绍对多路多位旋转开关的动态监测,需要将GPIOB总线的引脚配置为数字I/O模式,引脚方向根据实际接线关系配置为输入或输出。TMS320F2812采用低电压供电,所有I/O引脚电压为3.3V,它的输入电平均为TTL电平,输出电平均为3.3V的CMOS电平,输入端不允许5V电压输入。所以在电路设计时,数字I/O引脚的上拉电阻电压需要选择3.3V。

一般开关硬件电路的搭建,需要根据监测的开关状态个数以及可利用的I/O引脚,确定其电路连接形式,如直接连接,还是矩阵连接方式。对于普通的单路多位旋转开关,通常采取如图1所示的连接方式进行直接扫描监测。

图1 直接连接

图1中用GPIOB0~GPIOB9监测旋转开关S1的10个状态位,此种连接方式只需将所用到的I/O引脚配置为数字输入口,读取I/O引脚电平,开关选通的那个状态位将接地为低电平,由此判断出开关的状态。该方式一个I/O引脚只能判断开关的一种状态,但当需要实现对多个旋转开关监测时,其效率将显得非常低,可能出现I/O引脚不够用的情况。

为了提高I/O引脚的利用率,减少硬件资源浪费。实现对多路多位的旋转开关监测,电路中可以将I/O引脚复用,并采取矩阵连接的方式。即用N条引脚构成行线,M条引脚构成列线,行、列的交叉便构成了N×M的矩阵,能够监测N×M个状态位,其所需的I/O引脚仅为N+M个。基于以上分析,本文结合工程应用实际,设计实现6路旋转开关共计45个(即:1路10位,1路9位,2路7位,2路6位)状态位的监测。

具体的实现方法是:将GPIOB的16个I/O引脚分成两组,用10个I/O引脚复用来监测每个旋转开关的状态位构成行线,用6个I/O引脚来选择具体的旋转开关构成列线,设计为10×6的矩阵连接方式,它最多可以监测60个状态位。将各个旋转开关的状态位分别接入DSP的10个行线I/O引脚,各开关的轴端分别接入一个PNP型三极管,三极管的集电极接开关的轴端,发射极接地,基极分别接DSP的6个列线I/O引脚,配置行线I/O引脚为数字输入端,列线I/O引脚为数字输出端。即:配置GPIOB0~GPIOB9为输入,GPIOB10~GPIOB15为输出。将输入I/O引脚接3.3V的上拉电阻。其硬件连接如图2所示。

图2 矩阵连接

当需要判断旋转开关S1的状态时,将GPIOB10口输出为低电平,其他输出口为高电平,此时只有接S1的三极管A0选通,读取行线I/O引脚电平,开关选通的那个状态位将接地为低电平,其他仍为高电平,由此便判断出开关的状态。按此方法可以依次判断出其他旋转开关的状态。

3.软件设计实现

根据系统实际情况,软件对多路多位开关监测方式的实现可以采取随机扫描方式和定时中断扫描方式,当选用定时器中断方式时,需要占用tms320f2812内部的一个定时器。在随机扫描方式中,CPU完成某特定任务后,即执行开关状态位扫描程序,逐路进行扫描,确定每一路开关的状态,然后根据开关的状态,执行相应的操作。在执行操作过程中不理睬旋转开关的输入,直到操作执行完成,再次进行扫描判断监测。定时中断扫描方式与随机扫描方式基本相同,只是利用CPU内的定时器中断,每隔固定时间扫描各路旋转开关状态位。其流程如图所示。

不管是通过随机扫描还是定时中断扫描,其开关扫描部分的软件编码都一样,随机扫描可以根据实际应用情况将开关扫描程序放在主函数或子函数中执行,定时中断扫描可以放在定时器中断中执行。编写开关扫描程序时需要注意的是,行线读数据,必须在列线发送完开关扫描数据字之后执行。

图3 软件流程图

经过以上分析,用C语言对开关扫描函数的编码如下:

void gpio_select (void) // 对各I/O引脚配置初始化

{ EALLOW; // 允许访问受保护的空间

// 配置将GPIOB配置为数字I/O引脚

GpioMuxRegs.GPBMUX.all=0x0000; // 置0为数字I/O模式

// 配置GPIOB0~GPIOB9为输入,GPIOB10~ GPIOB15为输出

GpioMuxRegs.GPBDIR.all=0xFC00; // 置0为输入,置1为输出

// 配置所有端口无量化

GpioMuxRegs.GPBQUAL.all=0x0000;

EDIS; // 禁止访问受保护的空间

}

void ScanKey() // 旋转开关扫描函数程序

{ // 向开关发送数据字,选择扫描S1开关

GpioDataRegs.GPBDAT.all=0xFBFF;

//读取GPIOB总线数据字,判断开关状态

switch(GpioDataRegs.GPBDAT.all)

{ case 0xFBFE: 执行对应操作…; break; // S1旋转开关位1

case 0xFBFD: 执行对应操作…; break; // S1旋转开关位2

case 0xFBFB: 执行对应操作…; break; // S1旋转开关位3

case 0xFBF7: 执行对应操作…; break; // S1旋转开关位4

case 0xFBEF: 执行对应操作…; break; // S1旋转开关位5

case 0xFBDF: 执行对应操作…; break; // S1旋转开关位6

case 0xFBBF: 执行对应操作…; break; // S1旋转开关位7

case 0xFB7F: 执行对应操作…; break; // S1旋转开关位8

case 0xFAFF: 执行对应操作…; break; // S1旋转开关位9

case 0xF9FF: 执行对应操作…; break; // S1旋转开关位10

default: 执行对应操作…; break;

}

// 向开关发送数据字,选择扫描S2开关

GpioDataRegs.GPBDAT.all=0xF7FF;

switch(GpioDataRegs.GPBDAT.all)

{ case 0xF7FE: 执行对应操作…; break; // S2旋转开关位1

case 0xF7FD: 执行对应操作…; break; // S2旋转开关位2

case 0xF7FB: 执行对应操作…; break; // S2旋转开关位3

case 0xF7F7: 执行对应操作…; break; // S2旋转开关位4

case 0xF7EF: 执行对应操作…; break; // S2旋转开关位5

case 0xF7DF: 执行对应操作…; break; // S2旋转开关位6

case 0xF7BF: 执行对应操作…; break; // S2旋转开关位7

case 0xF77F: 执行对应操作…; break; // S2旋转开关位8

case 0xF6FF: 执行对应操作…; break; // S2旋转开关位9

default: 执行对应操作… ; break;

}

… … … … …

}

4.结束语

在实际使用中,本文提到的设计方法对多路多位旋转开关的键位状态判断准确、可靠、稳定。该方法具有电路连接简单,硬件占用资源少,软件实现容易,编程灵活等优点。通过对GPIO总线的合理使用,有效地节约了软硬件资源,对含有多路多位开关监测的硬件系统小型化,提供了一种思路和方法;同时,此种方法对于其他拥有GPIO总线的DSP芯片应用,也具有很好的借鉴意义。

参考文献

[1]任润柏,周荔丹,姚钢编著.TMS320F28x源码解读[M].2010,7.

[2]孙丽明编著.TMS320F2812原理及其C语言程序开发[M].2008,12.

作者简介:

宋彦博(1981―),男,工程师,高级设计师,现供职于陕西凌云电器集团有限公司设计所,主要从事数字电路、嵌入式软件的设计和开发以及软件测试方面的工作。

郭秋谋(1972―),男,工程师,高级设计师,现供职于陕西凌云电器集团有限公司设计所,主要从事嵌入式软件开发方面的工作。

范以训(1981―),男,工程师,高级设计师,现供职于陕西凌云电器集团有限公司设计所,主要从事数字电路设计方面的工作。