SimonLiu的ESP8266与AliOS Things 学习系列教程之三:点个灯吧 - GPIO输入中断和LED blink

欢迎加入交流群:ESP8266 AliOS Things 群 号: 107723112
系列文章目录:
SimonLiu的ESP8266与AliOS Things 学习教程系列

嵌入式开发之“点个灯”就相当于学习编程的“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下的各个子文件夹当成独立仓库管理,看你的需要了。本系列文章中SimonLiu把AliOSLearning当成一个仓库管理,各个学习项目只是这个仓库下的不同文件夹。

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\[email protected]
SimonLiu的ESP8266与AliOS Things 学习系列教程之三:点个灯吧 - GPIO输入中断和LED blink_第1张图片
看到如下信息表示编译成功:

SimonLiu的ESP8266与AliOS Things 学习系列教程之三:点个灯吧 - GPIO输入中断和LED blink_第2张图片

5. 烧写

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

点击查看本文完整代码

你可能感兴趣的:(#,ESP8266,#,AliOS,Things,ESP8266,AliOS,Things,GPIO,中断,blink)