乐鑫esp8266学习rtos3.0笔记第2篇: 你要找的基本外设功能都在这里了,包括Gpio、Pwm 和 Uart 接口使用。(附带demo)


  • 本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板。仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。
序号 SDK版本 内容 链接
1 nonos2.0 搭建开发环境,开始一个“hellow world”串口打印。 点我访问
2 nonos2.0 利用GPIO开始使用按钮点亮你的“第一盏灯。 点我访问
3 nonos2.0 利用 "软件定时器 " 定时0.5秒闪烁点亮一盏LED。 点我访问
4 nonos2.0 用PWM控制一盏LED的亮度变化。 点我访问
5 nonos2.0 SDK高级使用之封装Post与Get请求云端,拿到“天气预报信息”。 点我访问
6 nonos2.0 了解 SmartConfig与Airkiss一键配网,给8266配网上云端。无需把wifi名字密码写在固件里。 点我访问
7 nonos2.0 了解 softAP热点配网模式原理,仿“机智云”定义自己的热点配网模式协议。 点我访问
8 nonos2.0 你要找的8266作为UDP、TCP客户端或服务端的角色通讯,都在这了。 点我访问
9 nonos2.0 [小实战上篇]Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。 点我访问
10 nonos2.0 [小实战下篇]Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。 点我访问
11 rtos2.0 接入阿里智能,点亮一盏LED灯,期待天猫精灵语音控制的不约而至! 点我访问
12 nonos2.0 图文并茂学习阿里云主机搭建8266MQTT服务器,实现移动网络远程控制一盏LED。 点我访问
13 nonos2.0 动手做个8266毕设小案例,smartConfig + MQTT协议轻松实现远程控制一盏LED。 点我访问
14 rtos2.0 FreeRtos系统学习的正确姿势 ------ 环境搭建、烧录。 点我访问
15 rtos2.0 接入阿里云平台非阿里智能的SDS服务,点亮一盏LED灯。 点我访问
16 nonos2.0 基于Nonos移植红外线H1838,实现红外遥控器配网,远程控制一盏灯。 点我访问
17 nonos2.0 esp8266自研的快速上电开关五次 (开-关为一次) ,无需按键触发则8266进去一键配网模式。 点我访问
18 nonos2.0 基于NONOS 实现 OTA 远程升级,实现无线“ 热修复 ”升级固件程序。 点我访问
19 nonos2.0 驱动 ds18b20、dht11 温湿度传感器,采集温湿度传感器到服务器。 点我访问
20 nonos2.0 深入学习esp8266的esp now模式,仿机智云做一个小网关,实现无需网络下轻松彼此连接通讯交互数据。 点我访问
21 nonos2.0 浅谈 esp8266 如何在本地局域网网络情况下实现最大效率地和前端实现数据交互。 点我访问
22 nonos2.0 esp8266的工程如何添加第三方静态库文件以及如何自定义文件夹,聊聊那些makeFile的事 点我访问
23 nonos2.0 再来一波 esp8266 基于 freeRtos系统连接自己私有的服务器实现OTA远程升级,接触下 lwip的基本知识。 点我访问
24 nonos2.0 渗透学习回顾下esp8266的外置spi芯片25q系列,熟悉8266代码块在其的分布,得心应手放置图片或其他资料。 点我访问
25 rtos2.0 深聊下esp8266的串口 Uart 通讯中断编程,为您准备好了 NONOS 版本 和 RTOS 系统的串口驱动文件。 点我访问
26 nonos2.0 RTOS分析 MQTT 实现过程,实现移植 MQTT协议在 esp8266 rtos实时系统,可断线重连。 点我访问
27 rtos3.0 跟紧脚步,用VisualStudio Code开发 esp8266 rtos SDK v3.0版本,全新的 idf 框架,节省内存模块化开发。 点我访问
28 rtos3.0 教你轻松自如使用cJson在乐鑫 esp8266 如何解析一段json数据以及如何生成一段json数据。 点我访问
29 rtos3.0 百万条消息免费之使用TCP直连模式MQTT协议接入阿里云物联网平台,支持私家服务器对接支持阿里云规则引擎。 点我访问
30 rtos3.0 SDK编程使用 IIC总线驱动 0.96寸的OLED显示屏,显示天气预报信息。 点我访问
31 rtos3.0 当esp8266遇到 Html,该怎么内置网页控制设备,理清内置网页的实现过程,实现无需路由器手机也可以控制esp8266。 点我访问
32 rtos3.0 细聊HmacMD5的加密方法带来的安全性,并实践在esp8266上,最大保障传输的过程的信息的安全性。 点我访问
33 rtos3.0 如何优雅地像乐鑫原厂封装esp8266底层寄存器的逻辑思维,做成自己的静态库库文件,让第三方人使用? 点我访问
34 nonos3.0 编程使用 SPI 驱动基于Max7219芯片的八位数码管,显示日期信息。 点我访问
35 nonos3.0 借助机智云平台做一个商业化的七彩RGB灯泡可调整体方案项目,炫彩夺目高大尚。 点我访问
36 rtos3.0 认识Rtos 3.0 sdk 工程结构,如何向esp-idf工程靠近的,如何自定义头文件编译? 点我访问
37 rtos3.0 你要找的基本外设功能都在这里了,包括Gpio、Pwm 和 Uart 接口使用。 点我访问
38 rtos3.0 一篇文章带你搞掂存储技术 NVS 的认识和使用,如何利用NVS保存整型、字符串、数组以及结构体。 点我访问
39 rtos3.0 带你捋一捋市面上的微信公众号配网智能设备 esp8266 并绑定设备的过程,移植并成功实现在 esp8266 rtos3.1 sdk。 点我访问
40 rtos3.0 基于乐鑫idf框架,研究出超稳定、掉线重连、解决内存泄露问题的Mqtt框架!支持esp8266和esp32! 点我访问
41 rtos3.0 esp8266-12模块基于rtos3.1版本ota功能远程空中升级固件,官网基础之上增加dns域名解析! 点我访问
42 rtos3.0 我又来了,基于rtos3.0版本 SDK编程 SPI 驱动 ws2812b 七彩灯,代码全部开源奉献给你们! 点我访问
43 rtos3.0 基于rtos3.0版本扫描周围获取附近可用的 Wi-Fi 热点路由器信息,同样适合esp32。 点我访问
44 rtos3.0 整理分享那些我在项目中常用的esp8266 rtos3.0版本的常见驱动,Button按键长短按、PWM平滑调光等。 点我访问
45 rtos3.0 内置仅1M的Esp8285,如何攻破最棘手的OTA问题,大大节省资源成本开发产品 点我访问
46 rtos3.0 详细分析Esp8266上电信息打印的数据,如何做到串口通讯上电不乱码打印; 点我访问
47 rtos3.0 无需外网,如何实现在本地局域网与控制端做数据交换的一些开发经验; 点我访问
48 rtos3.0 迟来的1024程序员祝福,开源分享一个驱动 ds18b20 获取温度的工程。 点我访问
49 rtos3.2 aliyun sdk 直连接入阿里云物联网平台,实现天猫精灵找队友零配网功能和语音控制。 点我访问
持续更新,欢迎关注我,QQ群讨论群:434878850

  • 很多人怎么联系我一起学习进步,下面打个小小公告和干货无偿分享:

玩转esp8266带你飞、加群付费QQ群,提高门槛,不喜的朋友勿喷勿加:434878850
esp8266源代码免费学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266
esp32源代码免费学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32



一、前言;


       这个月的十号,埃塞俄比亚航空飞机出事了,8名中国同胞不幸遇难。唉,只能感到惋惜!

       本博文基于官网的Rtos SDK 3.1 release分支上开发的!

       继续上篇的环境结构学习之后,我迫不得已继续总结下基本外设的使用,因为这个 rtos3.0 的外设和之前2.0的基本一样的,只是有些修改接口,下面一起和我领略下如何使用吧?


二、GPIO使用;


  • GPIO使用一直是最最最基本的了,下面我总结三种:输出、输入以及中断;
  • 注意输入模式时候的设置上拉和下拉设置,要和您的实际电路相符。
  • 一个gpio_config_t结构体可配置多个io口,比如io_conf.pin_bit_mask = ((1ULL << GPIO_ISR_1) | (1ULL << GPIO_ISR_2));这里就是配置了GPIO_ISR_1GPIO_ISR_2这2个脚位!

2.1、配置输出,禁止中断:


  • 下面配置好之后,通过gpio_set_level(num, level);方法设置高低电平!num 是管脚,level是电平状态
   //输出模式,禁止中断
    gpio_config_t io_conf;
    //禁止中断
    io_conf.intr_type = GPIO_INTR_DISABLE;
    //设置为输出模式
    io_conf.mode = GPIO_MODE_OUTPUT;
    //管脚的位
    io_conf.pin_bit_mask = (1ULL << GPIO_OUTPUT);
    //禁止下拉
    io_conf.pull_down_en = 0;
    //禁止上拉
    io_conf.pull_up_en = 0;
    //开始配置管脚
    gpio_config(&io_conf);

2.2、配置输入,即为获取高低电平:


  • 下面配置好之后,通过gpio_get_level(num);方法获取高低电平!num 是管脚!
    //管脚的位
    io_conf.pin_bit_mask = (1ULL << GPIO_INPUT);
    //设置为输入模式
    io_conf.mode = GPIO_MODE_INPUT;
    //下拉
    io_conf.pull_down_en = 1;
    //下拉
    io_conf.pull_up_en = 0;
    //开始配置管脚
    gpio_config(&io_conf);

2.3、 中断触发配置:


  • 中断这块还是挺好用的,可以添加中断函数,又可以移除中断函数!
   //上升沿中断
    io_conf.intr_type = GPIO_INTR_POSEDGE;
    //配置管脚,这可以配置2个管脚都是上升沿中断
    io_conf.pin_bit_mask = ((1ULL << GPIO_ISR_1) | (1ULL << GPIO_ISR_2));
    //输入模式
    io_conf.mode = GPIO_MODE_INPUT;
    //允许上拉
    io_conf.pull_up_en = 1;
    //禁止下拉
    io_conf.pull_up_en = 0;
    gpio_config(&io_conf);

    //从isr创建一个队列去处理中断触发事件
    gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));
    //start gpio task
    xTaskCreate(Task_gpio_isr, "Task_gpio_isr", 1024, NULL, 10, NULL);
    //注册中断服务
    gpio_install_isr_service(0);
    //添加GPIO_ISR_1的中断回调函数
    gpio_isr_handler_add(GPIO_ISR_1, gpio_isr_handler, (void *)GPIO_ISR_1);
    //添加GPIO_ISR_2的中断回调函数
    gpio_isr_handler_add(GPIO_ISR_2, gpio_isr_handler, (void *)GPIO_ISR_2);
    //移除GPIO_ISR_2的中断回调函数
    //gpio_isr_handler_remove(GPIO_ISR_2);

三、PWM使用;


  • 对于如何设置周期,大家应该也是不陌生了;比如下面的周期100us(相当于0.000100秒),1除于0.0001就是10000也是10K的频率!下面的配置就是下面的图了,还是蛮准的!

在这里插入图片描述


  • 新增的功能还有 相位设置,那么相位设置有什么好处呢?我在公司这边遇到一个棘手问题,2个灯珠中性光,生产要求是全功率,但是中性光对于我们技术来说就是各自占空比一般,也就是全功率的一半,为了解决这个 2个pwm输出一半但是达到全功率的效果,唯有设置相位。抓取的图是这样的:
    在这里插入图片描述
//PWM 周期 100us(也就是10Khz),
#define PWM_PERIOD (100)
//pwm gpio口配置
#define CHANNLE_PWM_TOTAL 2 //一共2个通道
#define CHANNLE_PWM_CW 0
#define CHANNLE_PWM_WW 1
#define PWM_CW_OUT_IO_NUM 14
#define PWM_WW_OUT_IO_NUM 12
// pwm 脚位
const uint32_t pinNum[CHANNLE_PWM_TOTAL] = {PWM_CW_OUT_IO_NUM, PWM_WW_OUT_IO_NUM};
// don't alter it !!! dutys table, (duty/PERIOD)*depth , init
uint32_t setDuties[CHANNLE_PWM_TOTAL] = {50, 50};
//相位设置,这里设置第二通道的相位向前偏移100
int16_t phase[CHANNLE_PWM_TOTAL] = {
    0,
    100,
    0,
    0,
    0,
};

static int set_duty = 10;
static int dir = 1;
os_timer_t os_timer;
void Task_pwm_blank(void)
{
    if (dir == true)
    {
        if (++set_duty >= 100)
        {
            dir = false;
        }
    }
    else
    {
        if (--set_duty <= 10)
        {
            dir = true;
        }
    }
    //其用法和之前的sdk一样,注意其 set_duty 的范围是:0到周期这个范围之前
    pwm_set_duty(CHANNLE_PWM_CW, set_duty);
    pwm_set_duty(CHANNLE_PWM_WW, set_duty);
    pwm_start();
}

static void Task_Pwm_test(void *pData)
{
    //初始化
    pwm_init(PWM_PERIOD, setDuties, CHANNLE_PWM_TOTAL, pinNum);
    //设置相位
     pwm_set_phases(phase);
    //呼吸效果
    os_timer_disarm(&os_timer);
    os_timer_setfn(&os_timer, (os_timer_func_t *)(Task_pwm_blank), NULL);
    os_timer_arm(&os_timer, 6, 1);
    for (;;)
    {
        /* code */
    }
}


四、uart使用;


  • 个人觉得改动最大的是这个串口了,现在官方给出的代码使用是死循环读取。。。。这点很纳闷!没办法,只能这样了。当使用官网的uart的示范代码后,我们使用printf还是会从串口0打印出来(因为8266有2个串口),通过一些配置(见下面代码的注释部分)就可以让printf从串口1输出了!这样我们就可以串口0来通讯,串口1来看日志!

static void Task_Uart_test()
{

    /**
     * 
     * 
     怎么使用uart1作为串口信息打印?如果SDK版本是 v3.1 的话,可以直接在 make menuconfig 面板里面直接配置:

       Component config  --->
           ESP8266-specific  --->
              UART for console output (Custom)  --->
                  UART peripheral to use for console output (0-1) (UART1)  --->

        在 v3.0 版本配置项可能有些出入,但是大致类似。或者使用下面代码:
         
        PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_U1TXD_BK);
        uart_param_config(UART_NUM_1, &uart_config);
        uart_driver_install(UART_NUM_1, 0, BUF_SIZE + 1, BUF_SIZE + 1, NULL);

     * */

   //这个配置和我们在一些电脑的串口工具软件看到的配置一样的。主要是波特率看您的需要而定!
    uart_config_t uart_config = {
        .baud_rate = 9600, //波特率
        .data_bits = UART_DATA_8_BITS,
        .parity = UART_PARITY_DISABLE,
        .stop_bits = UART_STOP_BITS_1,
        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE};

    uart_param_config(UART_NUM_0, &uart_config);
    uart_driver_install(UART_NUM_0, BUF_SIZE * 2, 0, 0, NULL);

    // 为收到的数组数字开辟一个内存
    uint8_t *data = (uint8_t *)malloc(BUF_SIZE);

    while (1)
    {
        // 读取串口数组
        int len = uart_read_bytes(UART_NUM_0, data, BUF_SIZE, 20 / portTICK_RATE_MS);

        //打印下数组
        for (size_t i = 0; i < len; i++)
        {
            os_printf("uart_read_bytes data[%d]= %02x \n ", i, data[i]);
        }

        // 主动发送数组到串口
        uart_write_bytes(UART_NUM_0, (const char *)data, len);
    }
}


五、后记;


  • 下面是主程序入口方法,我还弄了一些如何获取芯片信息的示范,共勉!!
void app_main(void)
{
    //Initialize NVS
    esp_err_t ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES)
    {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    ESP_ERROR_CHECK(ret);

    //获取IDF版本
    printf("SDK version:%s\n", esp_get_idf_version());

    //获取芯片可用内存
    printf("esp_get_free_heap_size : %d  \n", esp_get_free_heap_size());
    //获取从未使用过的最小内存
    printf("esp_get_minimum_free_heap_size : %d  \n", esp_get_minimum_free_heap_size());
    //获取芯片的内存分布,返回值具体见结构体 flash_size_map
    printf("system_get_flash_size_map(): %d \n", system_get_flash_size_map());
    //获取mac地址(station模式)
    uint8_t mac[6];
    esp_read_mac(mac, ESP_MAC_WIFI_STA);
    printf("esp_read_mac(): %02x:%02x:%02x:%02x:%02x:%02x \n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);

    /*******************************以下方法创建只能选择一个,因为某些管脚是冲突使用了!************************************/

    //xTaskCreate(Task_Gpio_test, "Task_Gpio_test", 1024, NULL, 4, NULL);
    //xTaskCreate(Task_Pwm_test, "Task_Pwm_test", 1024, NULL, 4, NULL);
    xTaskCreate(Task_Uart_test, "Task_Uart_test", 1024, NULL, 10, NULL);
}


  • 本博文的工程代码下载:https://download.csdn.net/download/xh870189248/11015570

  • 很多人怎么联系我一起学习进步,下面打个小小公告和干货无偿分享:

玩转esp8266带你飞、加群付费QQ群,提高门槛,不喜的朋友勿喷勿加:434878850
esp8266源代码免费学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266
esp32源代码免费学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32


展开阅读全文
©️2020 CSDN 皮肤主题: 成长之路 设计师: Amelia_0503 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值