实验:PIO输入—读取开关信号

 

实验:PIO输入—读取开关信号

AuthorChen Tuo

Copyright © Chen Tuo, 2008-2009. All rights reserved.

200831日创建

2009329日修改

1.      实验目的

熟悉NiosII PIO设备的访问方法。学习读取引脚的开关信号。

2.      实验设备

硬件:PC机,EP1C3EP1C12核心板,MyEpx3实验版。

软件:Quartus II 7.2MagaCore 7.2Nios II IDE 7.2

3.      实验内容

用一个按键控制一个LED灯显示。

4.      实验预习要求

熟悉PIO外设的访问机制。

5.      实验步骤

(1)    创建一个QuartusII项目PIOReadPin

(2)    如下图,定制一个Nios II CPU

 

其中:onchip_mem8KKEY_PIO1位输入,LED_PIO1位输出。启动向量和异常向量配置如下:

 

(3)    Quartus II中创建一个原理图,放置一个上面定制好的Nios IImyniosii,并如图设置引脚。编译、下载硬件配置到FPGA

(4)    启动Nios II IDE,新建一个空白Nios II C/C++ Application项目,并命名为PIOReadPin

(5)    PIOReadPin项目中添加一个C文件PIOReadPin.c

(6)    设置PIOReadPin项目Properties属性,对该项目的代码编译进行优化:

C/C++ Build > Tool Settings > General > Optimize size (-Os)

(7)    设置PIOReadPin_syslib项目Properties属性,对该项目的代码编译进行优化:

a)       C/C++ Build > Tool Settings > General > Optimize size (-Os)

b)      System library属性页面,清除Support C++Clean exit (flush buffers);选上ProgramLightWeight device driver APIReduced device driversSmall C library

(8)    编译、调试、运行。

6.      程序清单

键盘输入实验程序

/*************************************************************

 * 文件名:PIOReadPin.c

 *   能:读取I/O引脚值,以查询方式控制LED。按下KEY1时,LED1

 *   明:按下KEY1观察LED1的状态

 ************************************************************/

#include "system.h"

#include "altera_avalon_pio_regs.h"

#include "alt_types.h"

 

#define LEDCON 0x01     //低电平亮

#define KEYCON 0x01     //按下为低电平

 

/*************************************************************

 *     称:InitPIO()

 *     能:初始化PIO_KEY为输入,PIO_LED为输出

 * 入口参数:无

 * 出口参数:无

 ************************************************************/

void InitPIO(void)

{

    IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_KEY_BASE, ~KEYCON); //0为输入

    IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_LED_BASE, LEDCON);  //1为输出

}

/*************************************************************

 *     称:main()

 *     能:读取按键的值,并输出控制LED

 ************************************************************/

int main(void)

{

    volatile alt_u32 key_state;  //暂存PIO引脚状态

    InitPIO();

    while(1)

    {

        key_state = IORD_ALTERA_AVALON_PIO_DATA(PIO_KEY_BASE)&KEYCON;

        IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, key_state); 

    }

    return(0);

}

       头文件的说明见《实验:PIO外部中断》。

7.      程序的调试

       在调试程序的过程中,用户可以在Memory窗口中查看PIO内核寄存器在地址空间的映射。先点击 Monitor Memory窗口中输入PIO_KEY的基地址0x00005000

       基地址可以从system.h中获得。

       在单步跟踪时可以查看到输入引脚的状态变化。注意:不能看到输出状态的变化。

 

       上面是KEY1为高电平时的情况,尽管我们在硬件中定义的PIO端口只有一位,但是PIO寄存器还是32位的。0 – 3是数据寄存器,注意到小端存储模式,当前的实际数据为:0x00000001

8.      参考文献

[1] 周立功,等. SOPC嵌入式系统实验教程()[M]. 北京:北京航空航天大学出版社,2006.

[2] 李兰英,等. Nios II 嵌入式软核 SOPC设计原理及应用[M]. 北京:北京航空航天大学出版社,2006.

[3] http://www.altera.com.cn/.

posted @ 2009-04-03 15:51  chentuo  阅读(1353)  评论(0)    收藏  举报