美文网首页
SimonLiu的ESP8266与AliOS Things 学习

SimonLiu的ESP8266与AliOS Things 学习

作者: 刘知海SimonLiu | 来源:发表于2019-03-23 13:32 被阅读0次

    欢迎加入交流群:ESP8266 AliOS Things 群 号: 107723112
    所有教程请看 AliOS Things 入门教程系列
    此教程在SimonLiu的CSDN博客同步更新。

    嵌入式开发之“点个灯”就相当于学习编程的“hello world”练习。所以我们就来点个灯吧。点灯有两种方式,一种是blink(自动闪烁),另外一种是通过一个连接到GPIO的按键输入(外部中断)来切换另外一个GPIO(LED )状态。

    点击查看本文完整代码

    本文涉及AliOS Things ESP8266 GPIO的三个方面:

    • GPIO输入输出配置
    • GPIO中断配置
    • GPIO输出电平设置
    1. 新建项目

    还记得我们在系列文章的上一篇SimonLiu的ESP8266与AliOS Things 学习系列之二:新建项目一文中,我们在Alios-Things\app\examples下面存放了新建项目的文件夹。但是examples文件夹下有很多AliOS自带的例程文件夹,为了未来查找方便,我们可以把自己的项目文件夹放在一起。首先使用vs code打开AliOS-Things文件夹,然后在examples下新建一个文件夹AliOSLearning

    为了git管理版本方便,我们需要把app/example/AliOSLearning/这个文件夹添加到git的忽略文件夹。在vs code中打开AliOS-Things文件夹的.gitignore文件,添加一行app/example/AliOSLearning/,这样就把文件夹AliOSLearning列为忽略文件夹,我们就可以对它进行单独的git版本管理而无须担心git仓库的嵌套了。

    然后把上一篇文章我们建立的GPIO_LED文件夹,移动到AliOSLearning文件夹下,目录结构变成AliOSLearning/GPIO_LED。你也可以在AliOSLearning下新建文件夹,存放新的项目。至于项目的版本管理,你可以把AliOSLearning当成一个仓库统一管理,或者把AliOSLearning下的各个子文件夹当成独立仓库管理,看你的需要了。本系列文章中SimonLiuAliOSLearning当成一个仓库管理,各个学习项目只是这个仓库下的不同文件夹。

    2. 配置GPIO

    目标:

    • GPIO4:推挽输出,连接LED1,LED每秒闪烁一次,持续时间500ms。
    • GPIO5:推挽输出,连接LED2,当检测到GPIO14的按键按下的时候,切换输出电平。
    • GPIO14:输入,连接按键,检测下降沿中断,中断回调里面实现GPIO5(LED2)的翻转控制。

    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);
    

    中断回调函数:

    static void gpio_isr_handler(void* arg)
    {
    
        hal_gpio_disable_irq(&input);
        hal_gpio_output_toggle(&led1);
        hal_gpio_clear_irq(&input);
       
    } 
    
    3. 其他相关内容

    中断模式目前有三种选项(似乎没看到电平中断,只有沿中断):

        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;
    

    输出电平设置这里使用了hal_gpio_output_toggle(),当然还有hal_gpio_output_high()hal_gpio_output_low()(在官方的blink例程可以看到)。

    AliOS程序入口是int application_start(int argc, char *argv[]),LED闪烁是通过AliOS Things异步事件框架Yloop实现。

    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. 编译

    点击vs code下方的alios工具栏,在右侧弹出列表中依次选择AliOSLearning.GPIO_LEDesp8266,然后此处就会变成AliOSLearning.GPIO_LED@esp8266。然后点击对勾进行编译。本例中的bin输出文件在out\myProjects.GPIO_LED@esp8266\binary\myProjects.GPIO_LED@esp8266.bin

    在这里插入图片描述
    看到如下信息表示编译成功: 在这里插入图片描述
    5. 烧写

    点击AliOS工具栏的闪电图标即可烧写。

    点击查看本文完整代码

    相关文章

      网友评论

          本文标题:SimonLiu的ESP8266与AliOS Things 学习

          本文链接:https://www.haomeiwen.com/subject/vhcsvqtx.html