歡迎加入交流群:ESP8266 AliOS Things 群 號(hào): 107723112
所有教程請(qǐng)看 AliOS Things 入門教程系列
此教程在SimonLiu的CSDN博客同步更新。
嵌入式開發(fā)之“點(diǎn)個(gè)燈”就相當(dāng)于學(xué)習(xí)編程的“hello world”練習(xí)。所以我們就來(lái)點(diǎn)個(gè)燈吧。點(diǎn)燈有兩種方式,一種是blink(自動(dòng)閃爍),另外一種是通過(guò)一個(gè)連接到GPIO的按鍵輸入(外部中斷)來(lái)切換另外一個(gè)GPIO(LED )狀態(tài)。
本文涉及AliOS Things ESP8266 GPIO的三個(gè)方面:
- GPIO輸入輸出配置
- GPIO中斷配置
- GPIO輸出電平設(shè)置
1. 新建項(xiàng)目
還記得我們?cè)谙盗形恼碌纳弦黄?a target="_blank" rel="nofollow">SimonLiu的ESP8266與AliOS Things 學(xué)習(xí)系列之二:新建項(xiàng)目一文中,我們?cè)?code>Alios-Things\app\examples下面存放了新建項(xiàng)目的文件夾。但是examples文件夾下有很多AliOS自帶的例程文件夾,為了未來(lái)查找方便,我們可以把自己的項(xiàng)目文件夾放在一起。首先使用vs code打開AliOS-Things文件夾,然后在examples下新建一個(gè)文件夾AliOSLearning。
為了git管理版本方便,我們需要把app/example/AliOSLearning/這個(gè)文件夾添加到git的忽略文件夾。在vs code中打開AliOS-Things文件夾的.gitignore文件,添加一行app/example/AliOSLearning/,這樣就把文件夾AliOSLearning列為忽略文件夾,我們就可以對(duì)它進(jìn)行單獨(dú)的git版本管理而無(wú)須擔(dān)心git倉(cāng)庫(kù)的嵌套了。
然后把上一篇文章我們建立的GPIO_LED文件夾,移動(dòng)到AliOSLearning文件夾下,目錄結(jié)構(gòu)變成AliOSLearning/GPIO_LED。你也可以在AliOSLearning下新建文件夾,存放新的項(xiàng)目。至于項(xiàng)目的版本管理,你可以把AliOSLearning當(dāng)成一個(gè)倉(cāng)庫(kù)統(tǒng)一管理,或者把AliOSLearning下的各個(gè)子文件夾當(dāng)成獨(dú)立倉(cāng)庫(kù)管理,看你的需要了。本系列文章中SimonLiu把AliOSLearning當(dāng)成一個(gè)倉(cāng)庫(kù)管理,各個(gè)學(xué)習(xí)項(xiàng)目只是這個(gè)倉(cāng)庫(kù)下的不同文件夾。
2. 配置GPIO
目標(biāo):
- GPIO4:推挽輸出,連接LED1,LED每秒閃爍一次,持續(xù)時(shí)間500ms。
- GPIO5:推挽輸出,連接LED2,當(dāng)檢測(cè)到GPIO14的按鍵按下的時(shí)候,切換輸出電平。
- GPIO14:輸入,連接按鍵,檢測(cè)下降沿中斷,中斷回調(diào)里面實(shí)現(xiàn)GPIO5(LED2)的翻轉(zhuǎn)控制。
GPIO4的代碼(GPIO5代碼類似):
#define GPIO_LED1 4
gpio_dev_t led1;
/* gpio port config */
led1.port = GPIO_LED1;
/* set as output mode */
led1.config = OUTPUT_PUSH_PULL;
/* configure GPIO with the given settings */
hal_gpio_init(&led1);
GPIO14的代碼
#define GPIO_INPUT 14
gpio_dev_t input;
/* input pin config */
input.port = GPIO_INPUT;
/* set as interrupt mode */
input.config = IRQ_MODE;
/* configure GPIO with the given settings */
hal_gpio_init(&input);
hal_gpio_enable_irq(&input, IRQ_TRIGGER_FALLING_EDGE, gpio_isr_handler, (void *) GPIO_INPUT);
中斷回調(diào)函數(shù):
static void gpio_isr_handler(void* arg)
{
hal_gpio_disable_irq(&input);
hal_gpio_output_toggle(&led1);
hal_gpio_clear_irq(&input);
}
3. 其他相關(guān)內(nèi)容
中斷模式目前有三種選項(xiàng)(似乎沒(méi)看到電平中斷,只有沿中斷):
typedef enum {
IRQ_TRIGGER_RISING_EDGE = 0x1, Interrupt triggered at input signal's rising edge
IRQ_TRIGGER_FALLING_EDGE = 0x2, Interrupt triggered at input signal's falling edge
IRQ_TRIGGER_BOTH_EDGES = IRQ_TRIGGER_RISING_EDGE | IRQ_TRIGGER_FALLING_EDGE,
} gpio_irq_trigger_t;
*/
GPIO模式有如下選擇
typedef enum {
ANALOG_MODE, /* Used as a function pin, input and output analog */
IRQ_MODE, /* Used to trigger interrupt */
OUTPUT_PUSH_PULL, /* Output, actively driven high and actively driven low */
OUTPUT_OPEN_DRAIN_PULL_UP, /* Output, actively driven low. When set high, is pulled high with an internal resistor */
OUTPUT_OPEN_DRAIN_NO_PULL, /* Output, actively driven low. When set high, is high-impedance */
INPUT_PULL_DOWN, /* Input, with an internal pull-down resistor */
INPUT_PULL_UP, /* Input, with an internal pull-up resistor */
INPUT_HIGH_IMPEDANCE, /* Input, must always be driven, either actively or by an external pullup resistor */
} gpio_config_t;
輸出電平設(shè)置這里使用了hal_gpio_output_toggle(),當(dāng)然還有hal_gpio_output_high()和hal_gpio_output_low()(在官方的blink例程可以看到)。
AliOS程序入口是int application_start(int argc, char *argv[]),LED閃爍是通過(guò)AliOS Things異步事件框架Yloop實(shí)現(xiàn)。
int application_start(int argc, char *argv[])
{
gpioInit();
aos_post_delayed_action(1000, toggleLed2, NULL);
aos_loop_run();
return 0;
}
static void toggleLed2(void)
{
hal_gpio_output_toggle(&led2);
aos_post_delayed_action(500, toggleLed2, NULL);
LOG("LOG ouput: Toggle LED2 \r\n");
}
4. 編譯
點(diǎn)擊vs code下方的alios工具欄,在右側(cè)彈出列表中依次選擇AliOSLearning.GPIO_LED和esp8266,然后此處就會(huì)變成AliOSLearning.GPIO_LED@esp8266。然后點(diǎn)擊對(duì)勾進(jìn)行編譯。本例中的bin輸出文件在out\myProjects.GPIO_LED@esp8266\binary\myProjects.GPIO_LED@esp8266.bin
看到如下信息表示編譯成功:
5. 燒寫
點(diǎn)擊AliOS工具欄的閃電圖標(biāo)即可燒寫。