17212|6

26

帖子

0

TA的资源

一粒金砂(中级)

 

Atmel微控制器软件库函数ASF操作指南(IO端口篇) [复制链接]

本帖最后由 hejunpeng 于 2015-4-18 09:29 编辑

Atmel微控制器软件库函数操作指南(IO端口篇)
——基于Atmel Studio 6和Atmel软件框架(ASF


本文写的是什么?
      本文主要是结合Atmel软件框架(ASF)官网英文入门指南,使用和总结成的中文版,利用ASFAtmel MEGAMEGA_RFXMEGAUC3SAMIO端口进行操作。文章先结合Atmel Studio 6.2 SP1的使用方法给出程序参考实例,再详细介绍IO软件库函数。

为什么要写这篇文章?
      众所周知,微控制器的底层操作是尤为重要的,特别是寄存器。由于目前微控制器品牌、种类太多,如果像以往那样去自己写寄存器操作代码,这样工作效率会大大降低,并且很容易出错。目前各个厂商已经推出了自家的微控制器库函数,库函数会大大简化用户代码,并且节省大量时间。由于Atmel 库函数使用教程的中文版很少,这篇文章写来分享给大家,并希望能够做一定的交流,如有不正确的地方,敬请指出。

Atmel软件框架是什么?
      Atmel软件框架的英文是Atmel Software Framework,简称ASF。它是Atmel官方对所有微控制器做的一个软件库,本文里面介绍所使用的是版本是3.20.1.1349,官网下载和使用参考以下链接:
http://www.atmel.com/zh/cn/tools/avrsoftwareframework.aspx?tab=overview

进入正题
      使用ASFIO操作必须了解Common IOPORT API,这是一个Atmel全系列的微控制器IO端口编程接口,在ASF里面对应的是ioport.h。它是一个上层的头文件,里面需要调用Atmel 各个系列的微控制器底层IO寄存器操作头文件,ioport.h已经在代码里面做了处理,在实际使用中,只需要包含该头文件,就可以用相应函数对IO进行操作。

      我们首先看一个例子:

         

        相信长期使用过微控制器的朋友能容易看懂以上代码,程序的第12行是定义一个实际操作端口,把LED映射到了PB0,BUTTON映射到了PB1。第3行是IO端口初始化,最后3行依次是设置LED映射端口为输出、BUTTON映射端口为输入、BUTTON映射端口为上拉模式。这些函数都是Atmel软件库(ASF)里面提供的,只需直接调用即可。先介绍在Atmel Studio中如何使用,后面再详细介绍ioport.h驱动函数。

   Atmel Stuido 6.2 SP1官方下载链接:
http://www.atmel.com/zh/cn/tools/ATMELSTUDIO.aspx

新建工程


  









  
添加ASF驱动




  







编写代码








源代码:
  1. <strong>1.<font size="3">#include <avr/io.h>
  2. 2.#include "ASF.h"//包含ASF驱动头文件
  3. 3.
  4. 4.#define  LED     IOPORT_CREATE_PIN(PORTB, 0)//LED定义为PB0
  5. 5.#define  BUTTON  IOPORT_CREATE_PIN(PORTB, 1)//BUTTON定义为PB1
  6. 6.
  7. 7.int main(void)
  8. 8.{
  9. 9.        ioport_init();//初始化IO端口
  10. 10.        ioport_set_pin_dir( LED,  IOPORT_DIR_OUTPUT);//LED端口为输出
  11. 11.        ioport_set_pin_level( LED, IOPORT_PIN_LEVEL_HIGH);//LED端口输出高电平
  12. 12.
  13. 13.        ioport_set_pin_dir( BUTTON,  IOPORT_DIR_INPUT);//BUTTON端口为输入
  14. 14.        ioport_set_pin_mode( BUTTON,  IOPORT_MODE_PULLUP);//BUTTON端口上拉模式
  15. 15.
  16. 16.    while(1)
  17. 17.    {
  18. 18.        //TODO:: Please write your application code
  19. 19.                //以下代码仅作为ASF测试用,按键程序作为简单逻辑测试,无消抖、无实时性
  20. 20.
  21. 21.                if( ioport_get_pin_level(BUTTON)==0 )//读BUTTON端口电平,是否按下
  22. 22.                {
  23. 23.                        while( ioport_get_pin_level(BUTTON)==1 )//读BUTTON端口电平,是否按键释放
  24. 24.                        {
  25. 25.                                ioport_toggle_pin_level(LED);//LED端口电平取反,亮到灭,灭到亮
  26. 26.                        }
  27. 27.                }
  28. 28.    }
  29. 29.}
  30. </strong>
复制代码



部分微控制器Ioport.h的使用必须关联微控制器的系统时钟配置,没有系统时钟,IO口是不会工作的,ASF里面叫System Clock Management。下面将详细介绍Common IOPORT APIioport.h,里面到底需要用到哪些IO操作函数,以及怎么操作。实际应用中可以直接调用ASF.h,因为ASF.h里面已经封装好了各个头文件,其中就包括了ioport.h
IO端口定义函数
#define  IOPORT_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_t  pin )
这个函数用来禁用某个IO端口的,例如:ioport_disable_pin  (LED ) ,将禁用LED相应的PB0端口。

禁用IO一组端口
static void ioport_disable_port  ( ioport_port_t  port,   ioport_port_mask_t  mask  )
这个函数用来禁用某组IO端口的。

使能IO单个端口
static void ioport_enable_pin  ( ioport_pin_t  pin )
这个函数用来使能某个IO端口。

使能IO一组端口
static void ioport_enable_port  ( ioport_port_t  port,  ioport_port_mask_t  mask  )
这个函数用来使能某组IO端口的。

读IO端口状态
static bool ioport_get_pin_level  ( ioport_pin_t  pin )
这个函数用来读取某个IO端口,例如: ioport_get_pin_level  ( BUTTON) ,就是读取PB1状态。

读IO端口状态返回作为掩模
static ioport_port_mask_t ioport_get_port_level ( ioport_pin_t  port,  ioport_port_mask_t  mask )
这个函数用来读取某个IO端口,并从读端口指定管脚的逻辑电平,返回作为掩模。

IO端口初始化
static void ioport_init  ( void )
这个函数用来初始化IO端口,此功能必须在使用IO端口之前调用。

IO端口转换位掩模
static ioport_port_mask_t ioport_pin_to_mask  ( ioport_pin_t  pin )
这个函数用来IO端口转换为一个位掩模。

IO端口转换为ID
static ioport_port_t ioport_pin_to_port_id  ( ioport_pin_t  pin )
这个函数用来化IO端口转换ID。

IO端口单个引脚配置模式复位
static void ioport_reset_pin_mode  ( ioport_pin_t  pin )
这个函数用来复位IO端口配置模式。

IO端口一组引脚配置模式复位
static void ioport_reset_port_mode  ( ioport_port_t  port,  ioport_port_mask_t  mask  )   
这个函数用来复位一组IO端口配置模式。

IO端口方向配置
static void ioport_set_pin_dir  ( ioport_pin_t  pin,  enum ioport_direction  dir  )
这个函数用来配置某个IO端口的方向是。
例如:ioport_set_pin_dir( LED,  IOPORT_DIR_OUTPUT); 就是配置LED的PB0为输出。

IO端口输出配置
static void ioport_set_pin_level  ( ioport_pin_t  pin,  bool  level  )
这个函数用来配置某个IO端口输出高电平、低电平。
例如:ioport_set_pin_level  ( LED,  IOPORT_PIN_LEVEL_LOW  ) 就是配置LED的PB0为低电平。

IO端口模式配置
static void ioport_set_pin_mode  ( ioport_pin_t  pin,  ioport_mode_t  mode  )
这个函数用来配置某个IO端口模式。
例如:ioport_set_pin_mode( BUTTON,  IOPORT_MODE_PULLUP);就是配置BUTTON的PB1为上拉模式。

IO端口感应模式配置
static void ioport_set_pin_sense_mode  ( ioport_pin_t  pin,  enum ioport_sense  pin_sense  )
这个函数用来配置某个IO端口感应模式。配置成为上升沿、下降沿、上升沿和下降沿。

IO端口一组方向配置
static void ioport_set_port_dir  ( ioport_port_t  port,  ioport_port_mask_t  mask,  
enum ioport_direction  dir  )
这个函数用来配置一组IO端口方向。

IO端口一组输出配置
static void ioport_set_port_level  ( ioport_port_t  port,  ioport_port_mask_t  mask,  
ioport_port_mask_t  level  )
这个函数用来配置一组IO输出高电平、低电平。

IO端口一组模式配置
static void ioport_set_port_mode  ( ioport_port_t  port,  ioport_port_mask_t  mask,  
ioport_mode_t  mode  )   
这个函数用来配置一组IO端口模式配置。

IO端口一组感应配置
static void ioport_set_port_sense_mode  ( ioport_port_t  port,   ioport_port_mask_t  mask,  
enum ioport_sense  pin_sense  )
这个函数用来配置一组IO端口感应模式配置。配置成为上升沿、下降沿、上升沿和下降沿。

IO端口输出取反
static void ioport_toggle_pin_level  ( ioport_pin_t  pin )
这个函数用来对IO端口输出取反。

IO端口一组输出取反
static void ioport_toggle_port_level  ( ioport_port_t  port,  ioport_port_mask_t  mask  )
这个函数用来对IO端口一组输出取反。



最新回复

楼主,您好,我设置按键引脚 感应方式为下降沿,那我在程序里应该使用哪个函数来检测下降沿? 例如:if(判断按键下降沿){输出}。 请问在这个功能语句中,“判断按键下降沿”有函数吗?谢谢。  详情 回复 发表于 2016-4-15 20:41

赞赏

2

查看全部赞赏

 

回复

1070

帖子

7

TA的资源

纯净的硅(中级)

 
楼主幸苦了
 
 
 

回复

24

帖子

0

TA的资源

一粒金砂(初级)

 
楼主,你的那个atmel studio中文是怎么弄得

点评

先安装 Visual Studio 2010 中文版  详情 回复 发表于 2015-12-15 13:48
 
 
 

回复

26

帖子

0

TA的资源

一粒金砂(中级)

 
bearphant 发表于 2015-12-12 18:27
楼主,你的那个atmel studio中文是怎么弄得

先安装 Visual Studio 2010 中文版
 
 
 

回复

24

帖子

0

TA的资源

一粒金砂(初级)

 
hejunpeng 发表于 2015-12-15 13:48
先安装 Visual Studio 2010 中文版

谢谢了,
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

 
谢谢何工指导
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

 
楼主,您好,我设置按键引脚 感应方式为下降沿,那我在程序里应该使用哪个函数来检测下降沿? 例如:if(判断按键下降沿){输出}。 请问在这个功能语句中,“判断按键下降沿”有函数吗?谢谢。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

猜你喜欢
随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2023 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表