传统编程中,使用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以后的主流。
新唐科技N78E059A单片机简介
毫米波:三个频率的故事
GaN Systems 推出第四代氮化镓平台 突破能源效率瓶颈 加速应用版图拓展
戴森发布风扇新品 增加空气净化功能
三星s8最新消息:屏幕画质惊艳,三星s8屏幕确认支持HDR
在ASF中控制GPIO的两种方法对比
通用射频卡读/写模块的功能特点及设计方案
算法工程师面试时一般问什么
联想推出YOGA 13s 2021款笔记本:搭载11代酷睿
m3芯片与m1处理器参数对比
RIGOL MSO8000系列数字示波器带宽600 MHz成都虹威科技
未来三年人脸识别领域中的3D传感器市场规模有望达到180亿美元
基于人工智能和机器学习的图像处理
磁的单位和电磁基本定律
路由器的分类、功能及主要技术
新型移动通信射频连接器 QC4.1-9.5型的研究与分析
紫色iPhone14 Pro概念渲染图曝光
如何基于G6进行双树流转绘制?
嵌入式开源软件的十大陷阱
一周快讯【151期】机智云入选工信部第五批服务型制造示范平台/广东省工业互联网产业生态供给资源池