Atmel微控制器软件库函数操作指南(IO端口篇)
——基于Atmel Studio 6和Atmel软件框架(ASF)
本文写的是什么?
本文主要是结合Atmel软件框架(ASF)官网英文入门指南,使用和总结成的中文版,利用ASF对Atmel MEGA、MEGA_RF、XMEGA、UC3和SAM的IO端口进行操作。文章先结合Atmel Studio 6.2 SP1的使用方法给出程序参考实例,再详细介绍IO软件库函数。
为什么要写这篇文章?
众所周知,微控制器的底层操作是尤为重要的,特别是寄存器。由于目前微控制器品牌、种类太多,如果像以往那样去自己写寄存器操作代码,这样工作效率会大大降低,并且很容易出错。目前各个厂商已经推出了自家的微控制器库函数,库函数会大大简化用户代码,并且节省大量时间。由于Atmel 库函数使用教程的中文版很少,这篇文章写来分享给大家,并希望能够做一定的交流,如有不正确的地方,敬请指出。
Atmel软件框架是什么?
Atmel软件框架的英文是Atmel Software Framework,简称ASF。它是Atmel官方对所有微控制器做的一个软件库,本文里面介绍所使用的是版本是3.20.1.1349。
进入正题
使用ASF对IO操作必须了解Common IOPORT API,这是一个Atmel全系列的微控制器IO端口编程接口,在ASF里面对应的是ioport.h。它是一个上层的头文件,里面需要调用Atmel 各个系列的微控制器底层IO寄存器操作头文件,ioport.h已经在代码里面做了处理,在实际使用中,只需要包含该头文件,就可以用相应函数对IO进行操作。
我们首先看一个例子:
相信长期使用过微控制器的朋友能容易看懂以上代码,程序的第1、2行是定义一个实际操作端口,把LED映射到了PB0,BUTTON映射到了PB1。第3行是IO端口初始化,最后3行依次是设置LED映射端口为输出、BUTTON映射端口为输入、BUTTON映射端口为上拉模式。这些函数都是Atmel软件库(ASF)里面提供的,只需直接调用即可。先介绍在Atmel Studio中如何使用,后面再详细介绍ioport.h驱动函数。
新建工程
添加ASF驱动
编写代码
源代码:
<strong>1.<font size="3">#include <avr/io.h>
2.#include "ASF.h"//包含ASF驱动头文件
3.
4.#defineLED IOPORT_CREATE_PIN(PORTB, 0)//LED定义为PB0
5.#defineBUTTONIOPORT_CREATE_PIN(PORTB, 1)//BUTTON定义为PB1
6.
7.int main(void)
8.{
9. ioport_init();//初始化IO端口
10. ioport_set_pin_dir( LED,IOPORT_DIR_OUTPUT);//LED端口为输出
11. ioport_set_pin_level( LED, IOPORT_PIN_LEVEL_HIGH);//LED端口输出高电平
12.
13. ioport_set_pin_dir( BUTTON,IOPORT_DIR_INPUT);//BUTTON端口为输入
14. ioport_set_pin_mode( BUTTON,IOPORT_MODE_PULLUP);//BUTTON端口上拉模式
15.
16. while(1)
17. {
18. //TODO:: Please write your application code
19. //以下代码仅作为ASF测试用,按键程序作为简单逻辑测试,无消抖、无实时性
20.
21. if( ioport_get_pin_level(BUTTON)==0 )//读BUTTON端口电平,是否按下
22. {
23. while( ioport_get_pin_level(BUTTON)==1 )//读BUTTON端口电平,是否按键释放
24. {
25. ioport_toggle_pin_level(LED);//LED端口电平取反,亮到灭,灭到亮
26. }
27. }
28. }
29.}
</strong>
部分微控制器Ioport.h的使用必须关联微控制器的系统时钟配置,没有系统时钟,IO口是不会工作的,ASF里面叫System Clock Management。下面将详细介绍Common IOPORT API即ioport.h,里面到底需要用到哪些IO操作函数,以及怎么操作。实际应用中可以直接调用ASF.h,因为ASF.h里面已经封装好了各个头文件,其中就包括了ioport.h。
IO端口定义函数
#defineIOPORT_CREATE_PIN (port, pin)((IOPORT_ ## port) * 8 + (pin))
这个函数是端口宏定义函数,看上面的例子,将LED定义到了PB0,BUTTON定义到了PB1,很简单。
IO端口方向枚举
IOPORT_DIR_INPUT
IO端口方向为输入
IOPORT_DIR_OUTPUT
IO端口方向为输出
IO端口感应枚举
IOPORT_SENSE_BOTHEDGES
IO端口感应:上升沿和下降沿
IOPORT_SENSE_RISING
IO端口感应:上升沿
IOPORT_SENSE_FALLING
IO端口感应:下降沿
IO端口输出枚举
IOPORT_PIN_LEVEL_LOW
IO端口输出低电平
IOPORT_PIN_LEVEL_HIGH
IO端口输出高电平
禁用IO单个端口
static void ioport_disable_pin( ioport_pin_tpin )
这个函数用来禁用某个IO端口的,例如:ioport_disable_pin(LED ) ,将禁用LED相应的PB0端口。
禁用IO一组端口
static void ioport_disable_port( ioport_port_tport, ioport_port_mask_tmask)
这个函数用来禁用某组IO端口的。
使能IO单个端口
static void ioport_enable_pin( ioport_pin_tpin )
这个函数用来使能某个IO端口。
使能IO一组端口
static void ioport_enable_port( ioport_port_tport,ioport_port_mask_tmask)
这个函数用来使能某组IO端口的。
读IO端口状态
static bool ioport_get_pin_level( ioport_pin_tpin )
这个函数用来读取某个IO端口,例如: ioport_get_pin_level( BUTTON) ,就是读取PB1状态。
读IO端口状态返回作为掩模
static ioport_port_mask_t ioport_get_port_level ( ioport_pin_tport,ioport_port_mask_tmask )
这个函数用来读取某个IO端口,并从读端口指定管脚的逻辑电平,返回作为掩模。
IO端口初始化
static void ioport_init( void )
这个函数用来初始化IO端口,此功能必须在使用IO端口之前调用。
IO端口转换位掩模
static ioport_port_mask_t ioport_pin_to_mask( ioport_pin_tpin )
这个函数用来IO端口转换为一个位掩模。
IO端口转换为ID
static ioport_port_t ioport_pin_to_port_id( ioport_pin_tpin )
这个函数用来化IO端口转换ID。
IO端口单个引脚配置模式复位
static void ioport_reset_pin_mode( ioport_pin_tpin )
这个函数用来复位IO端口配置模式。
IO端口一组引脚配置模式复位
static void ioport_reset_port_mode( ioport_port_tport,ioport_port_mask_tmask)
这个函数用来复位一组IO端口配置模式。
IO端口方向配置
static void ioport_set_pin_dir( ioport_pin_tpin,enum ioport_directiondir)
这个函数用来配置某个IO端口的方向是。
例如:ioport_set_pin_dir( LED,IOPORT_DIR_OUTPUT); 就是配置LED的PB0为输出。
IO端口输出配置
static void ioport_set_pin_level( ioport_pin_tpin,boollevel)
这个函数用来配置某个IO端口输出高电平、低电平。
例如:ioport_set_pin_level( LED,IOPORT_PIN_LEVEL_LOW) 就是配置LED的PB0为低电平。
IO端口模式配置
static void ioport_set_pin_mode( ioport_pin_tpin,ioport_mode_tmode)
这个函数用来配置某个IO端口模式。
例如:ioport_set_pin_mode( BUTTON,IOPORT_MODE_PULLUP);就是配置BUTTON的PB1为上拉模式。
IO端口感应模式配置
static void ioport_set_pin_sense_mode( ioport_pin_tpin,enum ioport_sensepin_sense)
这个函数用来配置某个IO端口感应模式。配置成为上升沿、下降沿、上升沿和下降沿。
IO端口一组方向配置
static void ioport_set_port_dir( ioport_port_tport,ioport_port_mask_tmask,
enum ioport_directiondir)
这个函数用来配置一组IO端口方向。
IO端口一组输出配置
static void ioport_set_port_level( ioport_port_tport,ioport_port_mask_tmask,
ioport_port_mask_tlevel)
这个函数用来配置一组IO输出高电平、低电平。
IO端口一组模式配置
static void ioport_set_port_mode( ioport_port_tport,ioport_port_mask_tmask,
ioport_mode_tmode)
这个函数用来配置一组IO端口模式配置。
IO端口一组感应配置
static void ioport_set_port_sense_mode( ioport_port_tport, ioport_port_mask_tmask,
enum ioport_sensepin_sense)
这个函数用来配置一组IO端口感应模式配置。配置成为上升沿、下降沿、上升沿和下降沿。
IO端口输出取反
static void ioport_toggle_pin_level( ioport_pin_tpin )
这个函数用来对IO端口输出取反。
IO端口一组输出取反
static void ioport_toggle_port_level( ioport_port_tport,ioport_port_mask_tmask)
这个函数用来对IO端口一组输出取反。