|
UC3 GPIO 驱动包测试及使用详解
Sovereign K?oK!个人测试仅供参考,未经同意严禁转载,版权个人所有,严禁商用,OURdev国内首发!
软件开发环境:WINXP+AVR32STUDIO+GNUCtoolchain1.3.2
硬件开发环境:EVK1100+JTAGICE-MK2
UC3A Framework版本:1.1.1
下载地址:http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4192
GPIO是每个MCU最基本也是最重要的单元,现在来看看UC3在IO上有什么特性:
1、每个管脚都可设定电平变化,上跳沿和下跳沿的中断请求
2、可以设定对输入瞬时脉冲滤波器,也就是时间少于一个时钟周期的脉冲变化,将不被识别,这个特性在按键消抖上可算是个很好的解决方式了。
3、可设定开漏工作方式,实现真正的IO双向
4、优良的输入输出控制(老生常谈)
5、对管脚复用最多达四个寄存器来管理使用(感觉自己理解有问题,不知道怎么表达了,就是现在如果要使用IO的特别功能要对相关的寄存器操作才能使用,而不是像AVR使能就可以了……)
6、可支持5V输入(工作电压3.3V,内核1.8V)
7、可设定上拉电阻,推挽输出时电流为4ma, IO全部输出时在470ma
看上去比AVR的功能强了很多,加了几个比较实用的新特性,用法也更复杂,我仔细看了操作寄存器有十三种之多……
现在开始进入正题
下载好Framework后,可以发现这个驱动包作的非常齐全,驱动,例子,教程,API,甚至连OS都有,这点佩服一下AT的技术支持,虽然国内渠道是在到现在还没有动静,但是AT对AVR32可见是下了大力气的。
我们这次GPIO的驱动包在\AT32UC3A\DRIVERS\GPIO\这个文件夹下
GPIO.C和GPIO.H是驱动包的两个文件。所有对GPIO的操作函数都在这里,在下层文件夹中有一个使用GPIO的例子gpio_example.c
下面我对GPIO驱动包里的各个函数进行介绍,可以发现GPIO的驱动包做的很完善,对以前AVR不支持的位操作有了强有力的支持,现在可以精确定位到某个IO口,不过好像没有AVR那种可以对一组IO口进行操作的方式,比较遗憾,不知道以后是不是会提供支持。
这里先做一下说明,AVR32对IO的命名是 AVR32_PIN_PXxx(前面X是哪个口,后面xx是管脚号)比如B口22脚就是AVR32_PIN_PB22,AVR32UC3A0512 144脚有A B C X四组IO,A组有31个管脚,B组有32个管脚,C组有6个管脚,D组有40个管脚。(不知道为什么要这样排布,可能和功能有关系,了解的人告诉我一下,呵呵)
而且注意,以后所有的操作包括输入输出,中断等等都只对这个变量操作,而改变的是相应的函数,这与AVR有比较大的区别。如果有心看头文件的话,可以发现这个命名只不过是一个地址偏移量……
一、好了来几个最常用的输出操作!
1、void gpio_clr_gpio_pin ( unsigned int pin )
置零操作,方法一比如置零A口31脚,gpio_clr_gpio_pin(AVR32_PIN_PA30)
2、void gpio_set_gpio_pin ( unsigned int pin )
置一操作,用法同方法一
3、void gpio_tgl_gpio_pin(unsigned int pin)
翻转某位,这是比较实用的函数。用法同方法一。
4、int gpio_get_gpio_pin_output_value(unsigned int pin)
在输出状态时,读输出位电平。
方法二:state(自定义变量) = gpio_get_gpio_pin_output_value(AVR32_PIN_PA30);
二、接下来是输入
1、int gpio_get_pin_value(unsigned int pin)
输入状态时,读输入位电平,用法同方法二。
三、特殊功能操作
1、void gpio_enable_pin_open_drain(unsigned int pin)
void gpio_disable_pin_open_drain(unsigned int pin)
开漏模式的开和闭,用法同方法一
2、void gpio_enable_pin_pull_up(unsigned int pin)
void gpio_disable_pin_pull_up(unsigned int pin)
上拉模式的开和闭,用法同方法一
3、void gpio_enable_pin_glitch_filter(unsigned int pin)
void gpio_disable_pin_glitch_filter(unsigned int pin)
瞬时脉冲滤波器的开和闭,用法同方法一
四、中断功能操作
1、int gpio_enable_pin_interrupt(unsigned int pin, unsigned int mode)
void gpio_disable_pin_interrupt(unsigned int pin)
中断使能或关闭,及工作模式设定
方法三::state(自定义变量) = gpio_enable_pin_interrupt(AVR32_PIN_PA30,x)
说明:state是设定状态返回值,1为失败,0成功,x是工作方式,0:电平变化,1:上跳沿,2:下跳沿
2、int gpio_get_pin_interrupt_flag(unsigned int pin)
void gpio_clear_pin_interrupt_flag(unsigned int pin)
读或清中断标志位,读为方法二,清为方法一
五、复用功能操作
1、int gpio_enable_module(const gpio_map_t gpiomap, unsigned int size)
int gpio_enable_module_pin(unsigned int pin, unsigned int function)
使能相关位的复用功能
方法四:state(自定义变量)= gpio_enable_module (gpiomap, size)
说明:state是设定状态返回值,1为失败,0成功,Gpiomap是一个struct数组,里面定义了IO为和复用函数号0:A方式,1:B方式,2:C方式,相关 位 和复用功能在数据手册中有说明,大家可以自己参考。Size是你需用管脚的数量。
gpio_enable_module_pin是对单个操作的函数,其实如果你看源代码的话,gpio_enable_module实际是对gpio_enable_module_pin进行循环操作。
2、void gpio_enable_gpio(const gpio_map_t gpiomap, unsigned int size)
void gpio_enable_gpio_pin(unsigned int pin)
使能相关位的GPIO功能
方法同方法四,没有了返回状态位。
啰里啰唆那么多,现在开始实战!
以下是测试程序:
#include "compiler.h"
#include "gpio.h"
#include "board.h"
void delay_us(int time)//延时函数
{
for(;time>1;time--);
}
int main(void)
{
gpio_enable_pin_glitch_filter(AVR32_PIN_PX16); //按键输入消抖
gpio_enable_pin_glitch_filter(AVR32_PIN_PX19); //按键输入消抖
gpio_enable_pin_glitch_filter(AVR32_PIN_PX22); //按键输入消抖
while (1)
{
delay_us(2000); //延时
if (gpio_get_pin_value(AVR32_PIN_PX16) == 0)
gpio_clr_gpio_pin(AVR32_PIN_PB27); //按键0,LED0亮
else if(gpio_get_pin_value(AVR32_PIN_PX19) == 0)
gpio_tgl_gpio_pin(AVR32_PIN_PB27); //按键1,LED0翻转状态
else if(gpio_get_pin_value(AVR32_PIN_PX22) == 0)
gpio_set_gpio_pin(AVR32_PIN_PB27); //按键1,LED1灭
}
运行结果和我的程序一致,而且滤波器的作用比较明显,如果不加滤波器的话,按键1按下时,翻转状态抖得比较厉害,赞一个! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|