傳統(tǒng)編程中,使用GPIO都是通過寄存器來控制的。使用寄存器代碼簡潔、效率高,但是可讀性差,可移植性也不好。不同芯片的GPIO寄存器名稱不同,甚至使用方法也不同,移植程序時修改起來工作量大,容易出錯。
在ASF中,將GPIO的控制封裝到函數(shù)中,使用API函數(shù)來控制GPIO,函數(shù)從函數(shù)名稱就可以看出功能,這樣使用GPIO更加直觀,簡單明了。即使換用不同的芯片,控制函數(shù)也是相同的,只要修改GPIO的定義,不用修改程序。在ASF中使用GPIO有兩種方式:一種是傳統(tǒng)方式,另外一種使用了結(jié)構(gòu)體的方式來定義和控制GPIO。下面簡單介紹一下兩種方式的使用方法和區(qū)別。
傳統(tǒng)方式:
定義GPIO #define LED IOPORT_CREATE_PIN(PIOA, 6)
設(shè)置GPIO輸入輸出 ioport_set_pin_dir(LED, IOPORT_DIR_OUTPUT);
設(shè)置輸出電平 ioport_set_pin_level(LED, IOPORT_PIN_LEVEL_HIGH);
輸出翻轉(zhuǎn) ioport_toggle_pin_level(LED);
讀取GPIO輸入 ioport_get_pin_level(LED);
設(shè)置GPIO模式 ioport_set_pin_mode(LED, IOPORT_MODE_PULLUP);
設(shè)置整個端口或者一個端口中的多個GPIO就是將上面函數(shù)中的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開發(fā)板,只需要將LED定義改為下面,就可以很好的運行
“ title=”ff3300“》”》#ff3300“》#define LED IOPORT_CREATE_PIN(PORTR, 0)
如果是SAM4N Xplained開發(fā)板,將LED改為如下:
” title=“ff3300”》“》#ff3300”》#define LED IOPORT_CREATE_PIN(PIOB, 14)
使用傳統(tǒng)方式,需要在ASF中包含IOPORT模塊。
結(jié)構(gòu)體方式:
定義GPIO #define LED PIN_PA19
設(shè)置GPIO輸入輸出 pin_conf.direction = PORT_PIN_DIR_OUTPUT;
port_pin_set_config(LED, &pin_conf);
設(shè)置輸出電平 port_pin_set_output_level(LED, false);
輸出翻轉(zhuǎn) port_pin_toggle_output_level(LED);
讀取GPIO輸入 port_pin_get_input_level(LED);
設(shè)置GPIO模式 port_pin_set_config(LED, &pin_conf);
例如,下面是SAM R21 Xplained開發(fā)板的例子:
#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上運行。
使用結(jié)構(gòu)體方式,看起來代碼更加復(fù)雜,但是結(jié)構(gòu)性好,在GPIO復(fù)用時更容易,讓程序設(shè)計更容易模塊化。
使用結(jié)構(gòu)體方式,需要添加ASF的PORT模塊。
目前在ASF中,大部分芯片使用傳統(tǒng)方式控制GPIO,如AVR、XMEGA、SAM4S、SAM G55等,另外有一部分芯片使用新的結(jié)構(gòu)體方式控制GPIO,如SAM D21、SAM L21、SAM R21等,兩種方式不能同時使用。今后應(yīng)該會統(tǒng)一用一種方式使用GPIO,這樣全系列的ATMEL芯片可以用相同的方式寫程序,無論從可移植性和代碼的復(fù)用性來說,都會有很大的好處,只是不知道哪種方式會是ASF以后的主流。
評論