原创 动态构造使PSoC芯片利用率超过120%

2007-12-23 21:40 1964 3 3 分类: FPGA/CPLD
一.引言

PSoC(可编程片上系统)是Cypress 半导体生产的包含有8 位微处理器核和数字与模拟混合信号阵列的可编程片上系统。其应用领域与8 位的MCU 相同。区别于8 位的MCU, PSoC 的数字资源(如定时器、PWM、UART 等等)和模拟资源(放大器、比较器、滤波器等等)以数字模块和模拟模块的方式给出。不同型号的PSoC 芯片的差异主要在于其拥有的数字模块和模拟模块的数量的不同。用户可以根据自己的需要来定义这些模块。PSoC 的集成开发环境PSoC Designer 也预先为用户定义了五十多个常用的数字和模拟资源供用户选择。如数字资源有:定时器、PWM、UART、SPI、CRC、PRS 等等;模拟资源有放大器、比较器、滤波器等等;AD 转换器由若干数字模块和模拟模块组合而成。所有这些预定义的模块被称之为用户模块。PSoC Designer 也为用户提供这些用户模块的API 函数供用户编程时调用。

众所周知,具有不同资源的MCU 会有不同的型号。用户的应用需求千差万别,芯片厂商为了满足用户的需求,就出现了成千上万个型号的MCU。现在一个设计工程师要从成千上万个型号中选择一个刚好满足自己需要的应用的芯片已经不是一件轻松的事了。还有,一个MCU 的所有资源在它被定义时就被完全确定,用户只能使用或不使用这个资源,不能改变这个资源的功能。即使一个经验很丰富的MCU 应用设计工程师最多也只能用到MCU 中90%的资源,总有一些资源要被冗余或浪费掉。然而,由于PSoC 的周边资源是通过数字模块和模拟模块的方式给出,并且这些模块的功能可以由用户自己定义和构造,这就给实现动态重构造PSoC 芯片的周边资源带来可能,使PSoC 的数字模块和模拟模块可以实施一块二用或一块多用,使PSoC 芯片的资源利用率超过120%。这不仅使设计工程师选择芯片成为一件轻松的事,而且,它的设计将成为一个独一无二的设计,系统的成本也为之降低。

二.动态重构造

类似网络通信中使用“时分复用”技术,动态重构造也是使PSoC 的数字模块和模拟模块实施时分复用,即在同一个应用项目中不同的时刻同一个或几个模块有不同的功能。一个典型的例子是:使用PSoC 控制的自动饮料售货机。每天23 小时59 分,PSoC 将两个数字模块定义成计数器和PWM 用于检测客户投入的硬币和控制机械机构送出饮料。在深夜有几秒种的时间,PSoC 将这两个数字模块重新构造,使其变成一个波特率300 的UART(由两个数字模块组成),完成向财务中心传送一天销售额、存货等数据的功能。这两个模块的时分复用降低了系统的成本。

动态重构造并不局限于双重构造,它允许用户实施多重构造,动态多重构造可以大大提高PSoC 的模块资源的利用率。但通常来讲,动态多重构造的实施取决于具体的项目和设计工程师的想象力以及对多任务程序设计的驾绿能力。

三.动态重构造的实施

事实上,PSoC Designer 集成开发环境已经为用户实施动态重构造创造了良好的条件,在进入PSoC Designer 的Device Editor 环境时,它为用户提供一个基本的模块构造平台。当用户在这个平台上完成了基本的模块构造以后,通过点击Add Loadable Configuration 按钮,即会出现一个新的模块构造平台。在这个平台上可以实施第一重的模块构造。再点击Add Loadable Configuration 按钮,又会出现一个新的模块构造平台,在这个平台上可以实施第二重的模块构造….. 通常将不能时分复用或不需要动态重构造的模块放在基本的模块构造中进行构造,而将需要时分复用的模块按其功能要求实施重新构造。构造完毕,并且所有模块参数也设置完毕,点击Generate Application 按钮即可生成所有模块的API 函数和供用户调用。同时在生成的库函数中也包含了各个构造的列表和装载、卸载各个构造的函数。在用户程序中正是使用这些装载、卸载构造的函数来轻松地实施各个模块构造之间的切换。

通常在程序开始要先调用基本的模块构造,在使用某一个功能块任务时调用这一个功能块相应的模块构造。在这一个功能块的任务完成以后,要切换到另一个模块构造实施相应的任务之前,必须先卸载当前的模块构造,然后再调用新的模块构造。通过这种反复不断地装载、卸载构造函数的调用,使PSoC 的某些模块资源在不同的时刻发挥不同的作用和功能。

四.动态重构造的实例

在这个例子中,使用CY8C21434 实施四个触摸感应键的检测,并将对应的感应键状态在P2.0~P2.3 输出控制4 个LED 灯。同时通过P1.1 口输入电压来控制P2.6 上的LED 的亮度。

触摸感应键的检测使用CapSense CSD 用户模块,它需要占用三个数字模块和三个模拟模块;输入电压的检测使用一个10 位的ADC,它需要占用一个数字模块和两个模拟模块;LED 灯的亮度控制使用一个PWM 控制,它需要占用一个数字模块。总共需要5 个数字模块和5 个模拟模块。但是,CY8C21434 仅有4 个数字模块和4 个模拟模块。利用动态重构造解决了模块资源不足的问题。

首先在基本构造中放置PWM 模块并将其输出引到P2.6,再在第一重构造中放置ADC 模
块,将输入连到P1.1,再在第二重构造中放置CSD 模块并设定四个感应键的Pin 脚和相关参
数,4 个LED 灯由程序通过IO 口直接控制。下面是实施上面所说功能的程序代码。所有被调
用的函数均由系统生成并位于相应的库函数中。

void main()
{
PRT2DR = bPRT2Shade; //设定LED 脚为高
LoadConfig_Base(); //装载基本构造
PWM8_Start();
while(1){
M8C_EnableGInt;
LoadConfig_ADC(); // 装载ADC 构造
ADC10_Start(ADC10_FULLRANGE);
ADC10_iCal(0x10A, ADC10_CAL_VBG); // 用1.3V=0x10 标定ADC,5.0V 输入范围
ADC10_StartADC();
while(0 == ADC10_fIsDataAvailable()); //一次ADC 采样
wData = ADC10_iGetDataClearFlag();
PWM8_WritePulseWidth(wData>>3);//ADC 值除8 并用作PWM 宽度
ADC10_Stop();
UnloadConfig_ADC(); //卸载ADC 构造
LoadConfig_CapSense_CSD(); // 装载CapSense_CSD 构造
M8C_EnableGInt;
CSD_Start();
if(bRunOnce ==0){ //设置手指感应阈值和初始化baselines 一次
CSD_SetDefaultFingerThresholds();
CSD_InitializeBaselines();
bRunOnce =1;
}
CSD_ScanAllSensors(); //扫描所有的感应键
CSD_UpdateAllBaselines();
CSD_bIsAnySensorActive();
CSD_ScanAllSensors(); //扫描所有的感应键
CSD_UpdateAllBaselines();
CSD_bIsAnySensorActive();
switch (CSD_baSnsOnMask[0]){ //找被按的键,一次仅一个有效.
case SENSOR0:
bPRT2Shade |= 0xff; //关所有的LED
bPRT2Shade &= ~SENSOR0; //开LED0
PRT2DR = bPRT2Shade;
break;
case SENSOR1:
bPRT2Shade |= 0xff; //关所有的LED
bPRT2Shade &= ~SENSOR1; //开LED1
PRT2DR = bPRT2Shade;
break;
case SENSOR2:
bPRT2Shade |= 0xff; /关所有的LED
bPRT2Shade &= ~SENSOR2; //开LED2
PRT2DR = bPRT2Shade;
break;
case SENSOR3:
bPRT2Shade |= 0xff; //关所有的LED
bPRT2Shade &= ~SENSOR3; //开LED3
PRT2DR = bPRT2Shade;
break;
default:
bPRT2Shade |= 0x0f; //关所有的LED
PRT2DR = bPRT2Shade;
break;
}
CSD_Stop();
UnloadConfig_CapSense_CSD(); //卸载CapSense_CSD 构造
}
}

五.结束语

动态重构造可以使PSoC 模块资源得到更充分的利用。它也给PSoC 的应用设计工程师带来了更多的想象空间和创造独一无二的设计的机会。在使用动态重构造时应注意不同的构造之间的切换时间是否能满足项目的实时要求。

qrs_072123db-1.jpg

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /2 下一条