欢迎加入交流群: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
下的各个子文件夹当成独立仓库管理,看你的需要了。本系列文章中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_LED
和esp8266
,然后此处就会变成AliOSLearning.GPIO_LED@esp8266
。然后点击对勾
进行编译。本例中的bin输出文件在out\myProjects.GPIO_LED@esp8266\binary\[email protected]
看到如下信息表示编译成功:
5. 烧写
点击AliOS工具栏的闪电图标即可烧写。
点击查看本文完整代码