EMIO即Extensible Multiply I/O,MIO分配在bank0(32bit,3.3V)和bank1(32bit,1.8V),EMIO分配在bank2(32bit)和bank3(32bit)。在MIO不够时,PS可以通过驱动EMIO控制PL的引脚,由于是PL引脚,所以需要添加引脚约束,在导出到SDK时需要包含bitstream。
在大多数情况下,PS端经由EMIO引出的接口会直接连到PL侧的器件引脚上,通过管脚约束来指定所连接PL引脚的位置。通过这种方式,EMIO可以为PS端实现额外的64个扩展引脚。
EMIO还有一种使用方式就是,连接PL内实现的功能模块(IP core),此时的PL侧的IP作为PS端的一个外部设备,如图所示。
在处理器系统中添加GPIO_EMIO,引出4个EMIO(米联客7z030-ffg676-2),连接到LED添加管脚约束。
在SDK程序设计中,参考了一下原子的呼吸灯原理,大概就是说不断改变LED的亮灭占空比,实现一个亮灭速度的变化,所以就将led设置为输出使能,之后改变亮灭频率。
我只做了一个LED0的,其他的也是一样,可以自行更改,对于亮灭变化速度可通过调整CYCLE的大小进行调节。
LED的调光系统是利用一个DC信号或者PWM对LED的正向电流进行调节来完成的的,减小LED的电流将起到调节LED光强度的作用,然而正线电流的改变也会改变LED的颜色,因为LED的色度会因为电流的变化而变化。
许多应用中不允许LED发生任何的色彩漂移,通过施加一个PWM信号来控制LED亮度的做法允许在不改变LED色彩的情况下完成LED的调光。
三、SDK工程代码
#include"xparameters.h"
#include"xgpiops.h"
#include"xstatus.h"
#include"xplatform_info.h"
#include<xil_printf.h>
#include<sleep.h>
#define LED0 54 #define LED1 55 #define LED2 56 #define LED3 57
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
#define OUTPUT 1 #define INPUT 0 #define LIGHT 1
#define MIE 0 //不会“灭”这个单词hhhh
void delay(unsignedint time)
{ while(time--); //not equal 0,wait }
XGpioPs Gpio; //GPIO驱动实例
int main()
{
int status;
XGpioPs_Config *gpiops_cfg_ptr; //Ps GPIO配置信息
print("EMIO test!\r\n");
gpiops_cfg_ptr=XGpioPs_LookupConfig(GPIO_DEVICE_ID);
status=XGpioPs_CfgInitialize(&Gpio,gpiops_cfg_ptr,gpiops_cfg_ptr->BaseAddr);
if(status!=XST_SUCCESS) return XST_FAILURE;
XGpioPs_SetDirectionPin(&Gpio,LED0,OUTPUT);//指定管脚方向 0:input 1:output
XGpioPs_SetOutputEnablePin(&Gpio,LED0,1); //输出使能
//XGpioPs_LookupConfig(GPIO_DEVICE_ID);
unsignedint CYCLE=6000,PWM;
unsignedint LOW=0;
while(1){
delay(600);
for(LOW=0;LOW<CYCLE;LOW++)
{ //渐渐变亮
XGpioPs_WritePin(&Gpio,LED0,LIGHT);
delay(LOW); //亮的时间越来越多
XGpioPs_WritePin(&Gpio,LED0,MIE);
delay(CYCLE-LOW);
}
for(PWM=CYCLE;PWM>0;PWM--)
{
XGpioPs_WritePin(&Gpio,LED0,MIE); //渐渐变暗
delay(PWM); //灭的时间越来越多
XGpioPs_WritePin(&Gpio,LED0,LIGHT);
delay(CYCLE-PWM);
}}}