SimonLiu的ESP8266與AliOS Things 學(xué)習(xí)系列教程之三:點(diǎn)個(gè)燈吧 - GPIO輸入中斷和LED blink

歡迎加入交流群: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)。

點(diǎn)擊查看本文完整代碼

本文涉及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ù)管理,看你的需要了。本系列文章中SimonLiuAliOSLearning當(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_LEDesp8266,然后此處就會(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)即可燒寫。

點(diǎn)擊查看本文完整代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容