在ASF中使用GPIO的两种方法

分享到:

传统编程中,使用GPIO都是通过寄存器来控制的。使用寄存器代码简洁、效率高,但是可读性差,可移植性也不好。不同芯片的GPIO寄存器名称不同,甚至使用方法也不同,移植程序时修改起来工作量大,容易出错。

在ASF中,将GPIO的控制封装到函数中,使用API函数来控制GPIO,函数从函数名称就可以看出功能,这样使用GPIO更加直观,简单明了。即使换用不同的芯片,控制函数也是相同的,只要修改GPIO的定义,不用修改程序。在ASF中使用GPIO有两种方式:一种是传统方式,另外一种使用了结构体的方式来定义和控制GPIO。下面简单介绍一下两种方式的使用方法和区别。

传统方式:

定义GPIO   #define LED    IOPORT_CREATE_PIN(PIOA, 6)
设置GPIO输入输出   ioport_set_pin_dir(LED, IOPORT_DIR_OUTPUT);
设置输出电平   ioport_set_pin_level(LED, IOPORT_PIN_LEVEL_HIGH);
输出翻转   ioport_toggle_pin_level(LED);
读取GPIO输入   ioport_get_pin_level(LED);
设置GPIO模式   ioport_set_pin_mode(LED, IOPORT_MODE_PULLUP);
     
     



设置整个端口或者一个端口中的多个GPIO就是将上面函数中的pin改为port。


下面是一个简单的例子,它可以在G55 Xplained上运行:

  1.  
  2. #include <asf.h>
  3. #define LED             IOPORT_CREATE_PIN(PIOA, 6)
  4. int main (void)
  5. {
  6.         /* Insert system clock initialization code here (sysclk_init()). */
  7.         sysclk_init();
  8.         board_init();
  9.         delay_init();
  10.         ioport_init();
  11.         ioport_set_pin_dir(LED, IOPORT_DIR_OUTPUT);        
  12.         while(1)
  13.         {
  14.                 ioport_toggle_pin_level(LED);
  15.                 delay_ms(100);
  16.         }
  17. }
如果是XMEGA-A3BU Xplained开发板,只需要将LED定义改为下面,就可以很好的运行

" title="ff3300">">#ff3300">#define LED             IOPORT_CREATE_PIN(PORTR, 0)

如果是SAM4N Xplained开发板,将LED改为如下:
" title="ff3300">">#ff3300">#define LED             IOPORT_CREATE_PIN(PIOB, 14)

使用传统方式,需要在ASF中包含IOPORT模块。

结构体方式:

定义GPIO   #define LED             PIN_PA19
设置GPIO输入输出   pin_conf.direction  = PORT_PIN_DIR_OUTPUT;
port_pin_set_config(LED, &pin_conf);  
设置输出电平   port_pin_set_output_level(LED, false);
输出翻转   port_pin_toggle_output_level(LED);
读取GPIO输入   port_pin_get_input_level(LED);
设置GPIO模式   port_pin_set_config(LED, &pin_conf);
     
     


例如,下面是SAM R21 Xplained开发板的例子:

  1. #include <asf.h>
  2. #define LED           PIN_PA19
  3. int main (void)
  4. {
  5.         struct port_config pin_conf;
  6.         system_init();
  7.         /* Insert application code here, after the board has been initialized. */
  8.         delay_init();
  9.         port_get_config_defaults(&pin_conf);
  10.         pin_conf.direction  = PORT_PIN_DIR_OUTPUT;
  11.         port_pin_set_config(LED, &pin_conf);
  12.         port_pin_set_output_level(LED, false);
  13.         while(1)
  14.         {
  15.                 port_pin_toggle_output_level(LED);
  16.                 delay_ms(100);
  17.         }
  18. }

将LED定义改为PIN_PB10就可以在L21 Xplained上运行。

使用结构体方式,看起来代码更加复杂,但是结构性好,在GPIO复用时更容易,让程序设计更容易模块化。

使用结构体方式,需要添加ASF的PORT模块。

目前在ASF中,大部分芯片使用传统方式控制GPIO,如AVR、XMEGA、SAM4S、SAM G55等,另外有一部分芯片使用新的结构体方式控制GPIO,如SAM D21、SAM L21、SAM R21等,两种方式不能同时使用。今后应该会统一用一种方式使用GPIO,这样全系列的ATMEL芯片可以用相同的方式写程序,无论从可移植性和代码的复用性来说,都会有很大的好处,只是不知道哪种方式会是ASF以后的主流。

 

更多Atmel及科技资讯请关注:  
Atmel中文官网:http://www.atmel.com/zh/cn/
Atmel技术论坛:http://atmel.eefocus.com/
Atmel中文博客:http://blog.sina.com.cn/u/2253031744
Atmel新浪微博:http://www.weibo.com/atmelcn

 

继续阅读
可视化的调试助手FreeRTOS+Trace

在AS开发库中,除了直接用于程序嵌入的库和内核以外,还有用来调试的工具。对于FreeRTOS而言,相对的线程和任务调度是比较难于用普通的设置断点,进行参数跟踪来实现的。因此,一种可视化的调试工具就被引入到AS中——FreeRTOS+Trace。

XMEGA PWM模块多通道的用法

本文介绍ASF中PWM模块同时使用多个通道的用法: 1、定义PWM变量,每个通道需要单独定义一个变量 2、使用pwm_init函数初始PWM。如果是同一个PWM模块(定时器),需要使用相同的频率参数。 3、设置每个通道的占空比

Atmel SAM D 系列 EEPROM快速上手指南(基于ASF)

在数据存储应用中,EEPROM用的非常广泛,以前常常需要在电路中外接一个EEPROM芯片,随着MCU技术的发展,EEPROM慢慢集成到了MCU内部,容量也越来越大,逐渐替代之前的单独EEPROM芯片,本帖将利用Atmel SAM D20 Xplained Pro ,对EEPROM 作出简单使用说明。

Atmel SAM D系列 I2C快速上手指南(基于ASF)

在芯片通信应用中,I2C总线用的非常广泛,I2C只需要2根线即可并挂很多器件进行东西,使用非常灵活,本帖将利用Atmel SAM D20 Xplained Pro ,对I2C作简单说明。

Atmel SAM D系列 WDT快速上手指南(基于ASF)

在MCU应用中,为了防止芯片死机,出现产品故障,经常利用看门狗解决这一问题,本文将利用Atmel SAM D20 Xplained Pro ,对WDT作出简单使用说明。

©2017 Microchip Corporation
facebook google plus twitter linkedin youku weibo rss