ADuc7026学习-I/O
在开始讲如何进行对ADuc7026的I/O进行操作之前,我们先来说一下编程上需要注意的事情。
首先我们新建一个新工程及 .C 文件开始编程的时候,就简单的把“ADuc7026.h”包含进去以及写个main()函数,编译一下
你会发现居然有错误,如下:
提示这几个函数没有定义,可是我们明明没有有道这几个函数,为什么会报错呢,这个问题,我网上查了下,有网友
说“是MDK为aduc72xx提供的启动代码的问题”。那么好,这个暂且先不理,我们来看看这个错误改怎么消。首先它说没有定义,那么我
们可以在当前文件中定义这几个函数,如下:
#include
int main(void)
{
return 1;
}
void DAbt_Handler(void)
{
}
void FIQ_Handler(void)
{
}
void IRQ_Handler(void)
{
}
void PAbt_Handler(void)
{
}
void SWI_Handler(void)
{
}
void Undef_Handler(void)
{
}
这样我们再编译一下就可可以看到没有在报错了,虽然没有在报错,但当我们要用到中断的时候这样处理还是不妥。下面我们来看下
第二种处理方法。首先在Keil的安装目录下(前提是装了MDK) Keil 4\ARM\INC\ADI 文件夹中找到一个名为“irq_arm.c”的文件,把他
放到我们的工程目录下并添加到工程中,编译一下我们可以看到不用我们自己写刚那些中断函数也不会报错了,这是因为“irq_arm.c”
已经有了这些函数的函数原型
在这里我们可以看到这些比我们刚写的那些多了好多东西。其中,关键字“__irq” 在ADS编译器中,是专门用来声明IRQ中断服务程序的,如果用__irq来声明一个函数,那么该函数表示一个IRQ中断服务程序,编译器会自动在该函数内部增加中断现场保护的代码。所以,建议以后我们要用到中断的时候也这样写或者直接把“irq_arm.c” 文件直接包含到工程中。
ADuC7026有 40 个 通 用 双 向 I/O(GPIO)引脚。所有I/O引脚都兼容5V电压,即GPIO支持5V输入电压。默认情况下,GPIO引脚配置为通用I/O引脚。每一个GPIO引脚都有一个内部的上拉电阻(约为100 kΩ)。可以使用GPxPAR寄存器控制以下端口是否使用内部上拉电阻:P0.0、P0.4、P0.5、P0.6、P0.7及P1的8个GPIO口。
现在我们来看下ADuc7026的引脚当做GPIO用时要进行一些什么样的操作。
有关GPIO的寄存器共有CPxPAR、GPxSET、GPxCLR、GPxDAT、GPxCON五个寄存器,其中
GPxPAR(x=0,1)用来设置P0.0、P0.4、P0.5、P0.6、P0.7及P1的8个GPIO口是否使用内部上拉电阻,详细请看数据手册
GPxCON (x=0,1,2,3,4)进行对GPIO的功能进行选择,如设置成GPIO/CMP/MS0等,具体的请看数据手册,帖子后面有上传。
GPxDAT(x=0,1,2,3,4)是端口x的配置和数据寄存器。它们用来配置端口x
的GPIO引脚方向,为配置成输出的引脚设置输出值,并为配置成输入的引脚保存输入值。它是一个32位的寄存器。其中
31~24用来设置数据传输方向位。置 1 , GPIO 引脚作为输出。清 0 ,GPIO 引脚作为输入。当x端口配置为输出时,可通过23~16八个位对x端口的八个引脚进行操作,置一时输出高电平,置零时输出电平。而x端口配置为输入时,可通过7~0这八个位读取x端口的八个引脚的电平状态。剩下的15~8 复位时端口 x 引脚的状态 ( 只读 ) 。
GPxSET (x=0,1,2,3,4) 是端口x的数据置位寄存器,其中
31:24 保留。
23:16 端口 x 置位。置 1 ,端口 x 相对应的位被置位,同时GPxDAT 寄存器相关的位也被置位。
清 0 不影响数据输出。
15:0 保留。
GPxCLR (x=0,1,2,3,4)是端口x的数据清0寄存器,其中
31:24 保留。
23:16 端口 x 清 0 位。置 1 ,端口 x 相对应的位被清 0 ,同时
GPxDAT 寄存器相关的位也被清 0 。清 0 不影响数据输出。
15:0 保留。
好,现在我们来点亮一盏LED看看
#include <ADuc7026>
int main(void)
{
//GPxPAR 是设置P0.0、P0.4、P0.5、P0.6、P0.7及P1的8个GPIO口是否使用内部上拉电阻,这里没用到
/*GPxCON 是进行功能选择(选择GPIO是作为普通引脚还是用作PWM、UARt等),因为默认所有GPIO都当做普通I/O使用,所以这里也不用对GPxCON 寄存器进行设置*/
GP2DAT = 0xfff30000;//设置P2为输出并把P2.3、P2.2电平置底
// 1111 1111 1111 0011 0000 0000 0000 0000
/*31~24全置一,所以P2所有引脚配置为输出,23~16 为 1111 0011,把P2.3、P2.2引脚置底,所以相接的LED就点亮了*/
while(1);
}
我的板上LED另一端接VCC,所以只要把I/O引脚拉低就可以点亮LED,就这样,点亮LED便完成了。
当然如果后面还想对P2的某个引脚进行置一或置零操作的话,可这样
GP2SET = 0x00010000;//把 P2.0 电平置高
GP2CLR = 0x00010000;//把 P2.0 电平置底
那么当 I/O 作输入的时候,想要读取某个引脚的电平的话,可以这样
if(GP2DAT & 0x00000001); //判断P2.0引脚的电平,注意作输出的时候是对GP2DAT的23~16进行写操作,而作输入则是对7~0这八个位读取I/O相应引脚的电平状态。
下面上两个图看下现象:
用户1821994 2015-1-9 13:59
用户1823973 2015-1-9 08:09