在ASF中控制GPIO的两种方法对比

嵌入式技术

1372人已加入

描述

  传统编程中,使用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上运行:

  #include 《asf.h》

  #define LED IOPORT_CREATE_PIN(PIOA, 6)

  int main (void)

  {

  /* Insert system clock initialization code here (sysclk_init())。 */

  sysclk_init();

  board_init();

  delay_init();

  ioport_init();

  ioport_set_pin_dir(LED, IOPORT_DIR_OUTPUT);

  while(1)

  {

  ioport_toggle_pin_level(LED);

  delay_ms(100);

  }

  }

  如果是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开发板的例子:

  #include 《asf.h》

  #define LED PIN_PA19

  int main (void)

  {

  struct port_config pin_conf;

  system_init();

  /* Insert application code here, after the board has been initialized. */

  delay_init();

  port_get_config_defaults(&pin_conf);

  pin_conf.direction = PORT_PIN_DIR_OUTPUT;

  port_pin_set_config(LED, &pin_conf);

  port_pin_set_output_level(LED, false);

  while(1)

  {

  port_pin_toggle_output_level(LED);

  delay_ms(100);

  }

  }

  将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以后的主流。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分