1. 程式人生 > >AliOS-Things--ESP8266--Blink/GPIO(四)

AliOS-Things--ESP8266--Blink/GPIO(四)

下載的master分支的AliOS-Things SDK。直接使用aos make [email protected]命令各種報錯,反正意思就是有很多函式沒有定義。

1、在blink.mk檔案裡面新增$(NAME)_COMPONENTS += mcu/esp8266

NAME := blink

$(NAME)_SOURCES := blink.c

$(NAME)_COMPONENTS += mcu/esp8266   # 新增這一行

GLOBAL_DEFINES += AOS_NO_WIFI

$(NAME)_COMPONENTS := yloop cli

GLOBAL_INCLUDES +=
./

2、在blink.c檔案裡面新增標頭檔案

可以這麼寫

#include <pwm.h>
#include <gpio.h>

也可以這麼寫

#include <../../../platform/mcu/esp8266/bsp/include/espressif/pwm.h>
#include <../../../platform/mcu/esp8266/bsp/include/driver/gpio.h>

3、修改路徑為:D:\Output\AliOS\AliOS-Things-master\platform\mcu\esp8266\esp8266.mk的.mk檔案新增gpio.c依賴

增加.mk檔案依賴

$(NAME)_SOURCES  += hal/gpio.c

在這裡插入圖片描述

4、需要在路徑下:AliOS-Things-master\platform\mcu\esp8266\hal新增一個gpio.c

gpio.c檔案

#include <aos/aos.h>

#define gpio_dev_t aos_gpio_dev_t
#define gpio_config_t aos_gpio_config_t
#include <hal/soc/gpio.h>
#undef gpio_dev_t
#undef gpio_config_t

#define
gpio_config_t GPIO_ConfigTypeDef
#include "driver/gpio.h" #include "esp8266/gpio_register.h" #include "esp8266/ets_sys.h" #define ESP_INTR_FLAG_DEFAULT 0 static enum gpio_state { disable, enable } state; int32_t hal_gpio_init(aos_gpio_dev_t *gpio) { if (gpio == NULL) { return EIO; } if (gpio ->port > 16) { return EIO; } if (gpio->port == 16) { gpio16_output_conf(); return 0; } gpio_config_t io_conf; /* disable interrupt */ io_conf.GPIO_IntrType = GPIO_PIN_INTR_DISABLE; /* set mode */ if (gpio->config == OUTPUT_PUSH_PULL) { io_conf.GPIO_Mode = GPIO_Mode_Output; } else if ((gpio->config == OUTPUT_OPEN_DRAIN_NO_PULL) || (gpio->config == OUTPUT_OPEN_DRAIN_PULL_UP)) { io_conf.GPIO_Mode = GPIO_Mode_Out_OD; } else if ((gpio->config == INPUT_PULL_UP) || (gpio->config == INPUT_PULL_DOWN) || (gpio->config == INPUT_HIGH_IMPEDANCE)) { io_conf.GPIO_Mode = GPIO_Mode_Input; } /* bit mask of the pins */ io_conf.GPIO_Pin = BIT(gpio->port); /* set pull-up mode */ io_conf.GPIO_Pullup = ((gpio->config == INPUT_PULL_UP) || (gpio->config == IRQ_MODE) || (gpio->config == OUTPUT_OPEN_DRAIN_PULL_UP)) ? 1 : 0; /* configure GPIO with the given settings */ gpio_config(&io_conf); return 0; } int32_t hal_gpio_output_high(aos_gpio_dev_t *gpio) { if (gpio == NULL) { return EIO; } if (gpio->port == 16) { gpio16_output_set(enable); uint32_t ret = gpio16_input_get(); if (ret != enable) { return EIO; } return 0; } GPIO_OUTPUT_SET(gpio->port, enable); uint32_t ret = GPIO_INPUT_GET(gpio->port); if (ret != enable) { return EIO; } return 0; } int32_t hal_gpio_output_low(aos_gpio_dev_t *gpio) { if (gpio == NULL) { return EIO; } if (gpio->port == 16) { gpio16_output_set(disable); int ret = gpio16_input_get(); if (ret != disable) { return EIO; } return 0; } GPIO_OUTPUT_SET(gpio->port, disable); int ret = GPIO_INPUT_GET(gpio->port); if (ret != disable) { return EIO; } return 0; } int32_t hal_gpio_output_toggle(aos_gpio_dev_t *gpio) { if (gpio == NULL) { return EIO; } if (gpio->port == 16) { uint32_t bit, new_bit; bit = gpio16_input_get(); gpio16_output_set(bit ^ 0x0000001); new_bit = gpio16_input_get(); if (new_bit != bit ^ 0x0000001) { return EIO; } return 0; } uint32_t bit, new_bit; bit = GPIO_INPUT_GET(gpio->port); GPIO_OUTPUT_SET(gpio->port, bit ^ 0x0000001); new_bit = GPIO_INPUT_GET(gpio->port); if (new_bit != bit ^ 0x0000001) { return EIO; } return 0; } int32_t hal_gpio_input_get(aos_gpio_dev_t *gpio, uint32_t *value) { if (gpio == NULL || value == NULL) { return EIO; } if (gpio->port == 16) { *value = gpio16_input_get(); } *value = GPIO_INPUT_GET(gpio->port); return 0; } int32_t hal_gpio_enable_irq(aos_gpio_dev_t *gpio, gpio_irq_trigger_t trigger, gpio_irq_handler_t handler, void *arg) { int32_t ret = EIO; if (gpio == NULL || arg == NULL) { return EIO; } GPIO_ConfigTypeDef gpio_in_cfg; //Define GPIO Init Structure gpio_in_cfg.GPIO_IntrType = (GPIO_INT_TYPE)trigger; //set the type gpio_in_cfg.GPIO_Mode = GPIO_Mode_Input; //Input mode gpio_in_cfg.GPIO_Pullup = GPIO_PullUp_EN; gpio_in_cfg.GPIO_Pin = BIT(gpio->port); // Enable GPIO gpio_config(&gpio_in_cfg); //Initialization function //GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(gpio->port));//Forbidden ouput register gpio_intr_handler_register(handler, arg); _xt_isr_unmask(1 << ETS_GPIO_INUM); //enable return 0; } int32_t hal_gpio_disable_irq(aos_gpio_dev_t *gpio) { if (gpio == NULL) { return EIO; } _xt_isr_mask(1<<ETS_GPIO_INUM); //disable interrupt ETS_GPIO_INTR_DISABLE(); return 0; } int32_t hal_gpio_clear_irq(aos_gpio_dev_t *gpio) { if (gpio == NULL) { return EIO; } GPIO_REG_WRITE( GPIO_STATUS_W1TC_ADDRESS, BIT(gpio->port) ); //clear interrupt mask _xt_isr_unmask(1 << ETS_GPIO_INUM); //Enable the GPIO interrupt return 0; } int32_t hal_gpio_finalize(aos_gpio_dev_t *gpio) { gpio_config_t io_conf; if (gpio == NULL) { return EIO; } /* disable interrupt */ io_conf.GPIO_IntrType = GPIO_PIN_INTR_DISABLE; /* disable output */ io_conf.GPIO_Mode = GPIO_Mode_Input; /* bit mask of the pins */ io_conf.GPIO_Pin = BIT(gpio->port); /* disable pull-down mode */ // io_conf.pull_down_en = 0; /* disable pull-up mode */ io_conf.GPIO_Pullup = 0; //configure GPIO with the given settings gpio_config(&io_conf); // uninstall isr service // @TODO 8266應該做什麼? // gpio_uninstall_isr_service(); return 0; }