ID.LODA

  • 2020-09-05
  • 发表了主题帖: 【ESP32-S2-Kaluga-1测评】二维码实现及简单的试用感受

    之前已经成功移植了 lvgl,能进行一些 HMI 界面的绘制,今天实现一个 LVGL 二维码库,通过二维码显示一些数据, 二维码库也可以在 LVGL 的 [github 仓库](https://github.com/lvgl/lv_lib_qrcode)下载到 ### 移植使用 1. 将下载的二维码库放到 lvgl 工程内,可以看到二维码的实现文件只有两个.c, 比较简洁 1. 修改工程 main 文件夹下的 CMakeLists.txt,添加二维码库的注册 1. 二维码库的使用也是比较简单,函数接口已经封装的很简洁,`lv_qrcode_create()`, `lv_qrcode_update()` 1. 在 main.c 包含相应头文件`lv_qrcode.h`,替换之前的 demo 为二维码演示 1. 编译运行,看到效果如下 1. 通过微信扫描二维码会自动跳转到 eeworld 的网页版,`记得点赞收藏` ### 感受 1. idf 的开发非常便捷,内置了大多数常用的组件,便于用户上手 1. ESP32S2 本身也是极具性价比,接口类型多,但是 IO 有些少,导致一些功能使用时会冲突,而且目前放出来的资料还是较少,idf 开发的支持也没有完全匹配上,不过我看 github 上 idf 主分支的更新还是比较频繁的,相信很快能支持的比较好 1. 最后对于这个套件我觉得真的非常不错,音频,摄像头,人机交互,触摸,可玩性高,而我也跑了官方提供的几个 demo 示例,略显简单,哈哈。 1. 本次试用也是学习了 IDF 的开发,完成一些示例,其实还有很多想玩的方向,想尝试的领域,比如蓝牙音箱,网络电台,人脸识别等应用开发,有些难度,但是很有乐趣,奈何精力、时间有限,一个月的试用只能到此截至。 ### 以上 SKR~~~~

  • 发表了主题帖: 【ESP32-S2-Kaluga-1测评】LVGL的移植测试

    板卡带了 LCD 屏幕的扩展版,可以移植一个 LVGL 做图形化界面,而且 LVGL 官方提供了 ESP32 的移植接口,可以从 [lvgl github 地址](https://github.com/lvgl/lv_port_esp32) 下载到源码,但是因为 ESP32S 和 ESP32 的 SPI 外设是有差异的,需要进行相应的修改,spi 驱动例程可以从板卡的[例程](https://github.com/espressif/esp-dev-kits)获取 1. 准备一个简单的工程,可以选择 hello world 例程,把 [lv_port_esp32](https://github.com/lvgl/lv_port_esp32)添加到工程路径,我新建了一个 components 文件夹存放,拷贝 main 文件下的 main.c 替换工程 hello world 下的 main.c, 然后删除了里面 main 文件夹和一些不相关的文件,剩余工程结构如下 1. 修改工程路径下的 CMakeLists.txt, 添加 lvgl 相关文件路径和板卡的路径,按自己实际存放位置修改 1. 修改工程 main 文件夹下的 CMakeLists.txt,添加 LVGL 及板卡的模块注册 1. 修改工程 main 文件夹下 Kconfig.projbuild,加入 LCD 驱动的配置 1. 保存,打开 GUI 配置界面,可以看到 LVGL 和 LCD 扩展板的配置界面,说明模块已经添加成功,可以添加头文件的方式调用相关接口,暂时对 LVGL 的配置不是特别熟悉,就先保留默认配置 1. 如上配置之后,编译的时候还是会失败,还需要修改几个文件, lvgl_esp32_drivers 目录下的 lvgl_help.c 文件,同目录下的 lvgl_tft 文件下的 disp_driver.c 文件,屏蔽相关文件实现即可,具体修改如图 1. 修改 main 文件下的 LCD 初始化函数,用板卡 LCD 例程下的初始化替换即可 1. LVGL 的绘图是通过 frambuff 的方式实现,所以移植的时候其实只需要修改刷屏函数即可 1. 修改 main 的线程创建,就修改完成了 1. 编译,运行,可以看到 ESP32S2 的刷图速率还是不错的,肉眼没有感受到明显的卡顿感 1. 以上就是 lvgl 的移植工作,因为 LVGL 官方提供了 ESP32 的参考,所以对我第一次使用的我来说有一定帮助,当然也是因为 ESP32S2 的一些差异性,移植过程也是遇到了很多困难,好在最终结果是光明的。

  • 发表了主题帖: 【ESP32-S2-Kaluga-1测评】mqtt 组件连接 onenet

    通过 mqtt 方式连接 onenet 云,没有在例程里面看到 mqtt 的例程,有点不应该啊,但是在 IDF SDK 的 examples 目录下其实是有的,而且在工程的默认配置选项里可以看到 mqtt 的配置,所以应该添加对应的库就能直接使用,直接把例程的代码复制过来,替换前一节 httpss_request 的例程即可 1. MQTT的使用并不复杂,从例程的代码结构也也看出来 - 1.1.首先在主函数里面初始化启动必须的外设,然后初始化mqtt - 1.2.mqtt的初始化主要涉及一个重要的结构体 `esp_mqtt_client_config_t`,和一个关键的消息回调函数`esp_mqtt_client_register_event`,完成这个的点的设置和实现,就能顺利使用mqtt - 1.3.消息回调函数会返回各种类型的消息事件,如连接状态,推送消息反馈,订阅消息通知等,用户可以根据自己需要实现相应的处理 ## 修改例程适配 ONENET 云 1. 打开配置界面,修改例程配置里,WiFI 的账户密码,这里注意有些 mqtt 的服务器不支持 websocket 的方式,记得反选,如果没用加密项也需要反选 1. 修改需要连接的服务器地址端口等,client_id,username,password 都是根据你在 ONENET 平台建立的产品来的,具体可以去看 onenet 的官方文档 1. 修改处理信息的回调函数,例程是在连接成功消息内,订阅和发布消息,我们测试就在这里简单修改下,适配 onenet 平台的需求 1. 编译运行,输出如下,可以看到服务器已经连接成功,而且收到了订阅的 topic 信息,错误是因为,平台需要发送的信息需要走 json 格式,我这里发送的信息不符合格式 1. 以上就是 mqtt 的使用

  • 发表了主题帖: 【ESP32-S2-Kaluga-1测评】https 获取天气信息

    通过 https 方式获取天气信息,天气获取源我选择的和风天气的接口,采用的 https 的方式,介于刚开始使用 IDF, 对于网络和加密信息配置等还不是很熟悉,可以直接打开 httpss_request 例程,基本需要的配置就不要自己配,出现问题时直接调试即可,非常方便 1. 例程是通过固定 WIFI 的方式连接网络,所以需要先修改 WIFI 账户和密码,点击 VSCODE 底部的 GUI 配置,找到例程配置,修改账户密码 1. 修改例程的 web_server 和 web_port,和请求 url,改成和风天气提供的即可 1. 修改 request 请求,和连接的服务器地址 1. 编译运行,看到如下结果 1. 以上就是 https 的使用

  • 2020-09-03
  • 发表了主题帖: 【ESP32-S2-Kaluga-1测评】控制台组件的使用

    之前安装环境已经搭建完成,现在就可以进行应用开发了。DEMO 的例程在 ESP32 上面应该都是可以运行的,但是 ESP32S2 上面存在兼容性的问题,有一些外设和蓝牙的例程会运行失败,我这边也没有全部测试。 ## 控制台例程 类似于 linux 的控制台,可以通过输入指令的方式运行你期望的函数,前提功能实现需要提前预制,是非常实用的一个组件,只需要一个串口。 ### 工程源码 ### 控制台的初始化 ```c static void initialize_console(void) {     /* Drain stdout before reconfiguring it */     fflush(stdout);     fsync(fileno(stdout));     /* Disable buffering on stdin */     setvbuf(stdin, NULL, _IONBF, 0);     /* Minicom, screen, idf_monitor send CR when ENTER key is pressed */     esp_vfs_dev_uart_port_set_rx_line_endings(CONFIG_ESP_CONSOLE_UART_NUM, ESP_LINE_ENDINGS_CR);     /* Move the caret to the beginning of the next line on '\n' */     esp_vfs_dev_uart_port_set_tx_line_endings(CONFIG_ESP_CONSOLE_UART_NUM, ESP_LINE_ENDINGS_CRLF);     /* Configure UART. Note that REF_TICK is used so that the baud rate remains      * correct while APB frequency is changing in light sleep mode.      */     const uart_config_t uart_config = {             .baud_rate = CONFIG_ESP_CONSOLE_UART_BAUDRATE,             .data_bits = UART_DATA_8_BITS,             .parity = UART_PARITY_DISABLE,             .stop_bits = UART_STOP_BITS_1,             .source_clk = UART_SCLK_REF_TICK,     };     /* Install UART driver for interrupt-driven reads and writes */     ESP_ERROR_CHECK( uart_driver_install(CONFIG_ESP_CONSOLE_UART_NUM,             256, 0, 0, NULL, 0) );     ESP_ERROR_CHECK( uart_param_config(CONFIG_ESP_CONSOLE_UART_NUM, &uart_config) );     /* Tell VFS to use UART driver */     esp_vfs_dev_uart_use_driver(CONFIG_ESP_CONSOLE_UART_NUM);     /* Initialize the console */     esp_console_config_t console_config = {             .max_cmdline_args = 8,             .max_cmdline_length = 256, #if CONFIG_LOG_COLORS             .hint_color = atoi(LOG_COLOR_CYAN) #endif     };     ESP_ERROR_CHECK( esp_console_init(&console_config) );     /* Configure linenoise line completion library */     /* Enable multiline editing. If not set, long commands will scroll within      * single line.      */     linenoiseSetMultiLine(1);     /* Tell linenoise where to get command completions and hints */     linenoiseSetCompletionCallback(&esp_console_get_completion);     linenoiseSetHintsCallback((linenoiseHintsCallback*) &esp_console_get_hint);     /* Set command history size */     linenoiseHistorySetMaxLen(100);     /* Don't return empty lines */     linenoiseAllowEmpty(false); #if CONFIG_STORE_HISTORY     /* Load command history from filesystem */     linenoiseHistoryLoad(HISTORY_PATH); #endif } ``` ### 控制台函数注册 通过注册自己需要的命令,esp_console_cmd_register(),函数传参是一个 esp_console_cmd_t 的结构体 ```c typedef struct {     /**      * Command name. Must not be NULL, must not contain spaces.      * The pointer must be valid until the call to esp_console_deinit.      */     const char *command;     /**      * Help text for the command, shown by help command.      * If set, the pointer must be valid until the call to esp_console_deinit.      * If not set, the command will not be listed in 'help' output.      */     const char *help;     /**      * Hint text, usually lists possible arguments.      * If set to NULL, and 'argtable' field is non-NULL, hint will be generated      * automatically      */     const char *hint;     /**      * Pointer to a function which implements the command.      */     esp_console_cmd_func_t func;     /**      * Array or structure of pointers to arg_xxx structures, may be NULL.      * Used to generate hint text if 'hint' is set to NULL.      * Array/structure which this field points to must end with an arg_end.      * Only used for the duration of esp_console_cmd_register call.      */     void *argtable; } esp_console_cmd_t; ``` ### 运行演示 可以看到输入提前注册的指令之后就能运行想对应的函数 ## 结尾 控制台可以脱离仿真器,辅助用户进行代码调试和问题检测,是一个非常不错的组件

  • 发表了主题帖: 【ESP32-S2-Kaluga-1测评】开发环境选择和搭建

    ESP32S2的开发方式和ESP32是一样的,支持 ESP-IDF、Arduino、PlatfromIO 等多种开发方式,大家可以依据自己的习惯去选择。 这次申请板卡就是为了学习 ESP-IDF 的,所以准备用这种方式开发。espressif 提供了详细的[ 文档 ](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32s2/index.html)支持,里面介绍了搭建环境,快速上手以及 API 的介绍。 ## 环境搭建 关于开发环境的搭建,文档中介绍了 3 种 OS 环境下的命令行方式开发。除此之外,其实还有VSCODE,ECLISPE 等安装插件的可选方式开发。这里我选择是 VSCODE 安装插件的插件,因为其他几种方式都遇到了问题,当然 VSCode 在安装的过程种也遇到了各种问题,但是好在最终都解决了(艰难.jpg) 1. 安装 Java、python、git 等必要组件 1. 打开 vscode extensions 目录,搜索 espressif idf,点击安装。可以看到 espressif idf 插件的 detail 描述还是还丰富的,介绍了必要的环境,如何使用等 1. 装完插件之后,在 VSCODE 的底部可以看到几个快捷键,配置、编译、下载等 1. 下载 esp-idf 仓库,由于包含了很多COMPONENT,文件还是挺大的,但是 github 的下载速度你懂的,所以上网还是要`科学` 1. 新建一个工作空间,vscode 方式打开,按 F1 (笔记本可能需要+ Fn 按键),往下找到ESP-IDF:Configure ESP-IDF extension 1. 选择用户设置,点击开始 1. 选择本地的 python 路径 1. 选择之前下载到本地的 esp-idf 版本,当然也可以直接选择版本,让 VSCODE 自行下载,但是速度同样非常慢。校验之后下一步 1. 之前没有安装过 ESP-IDF Tools 的,需要选择 Download 选项,选择下载地址之后会自动下载安装,耐心等待(下载速度是真的慢,还容易失败,我装了好几次,真的要崩溃);之前安装过的可以选择 skip 跳过,跳入相应的地址即可 1. 等待安装成功之后,可以通过 F1 目录查找 ESP:Show ESP-IDF Examples Projects,选择之后可以看到有很多的示例程序,但是像蓝牙、外设的部分例程跑 ESPS2 的芯片会有问题,兼容性还是有些问题,后续应该会慢慢完善。 ## demo 演示 1. 选择 hello_world 例程测试下环境是否搭建成功。 1. 打开 GUI 配置界面,修改两个地方, flash 大小和主频,如图 1. 打开 espressif 插件设置界面,修改芯片型号和串口号 1. 点击底部一键编译下载,等待完成之后就可以看到控制台打印信息 ## 结束 至此第一步环境搭建就成功了。

  • 2020-07-14
  • 回复了主题帖: 【测评名单公布】乐鑫ESP32-S2-Kaluga-1多媒体开发板

    已经确认个人信息,确定可以按时完成测评计划

  • 2020-04-26
  • 发表了日志: RT-Thread设备框架学习之RTC设备

  • 发表了主题帖: RT-Thread设备框架学习之RTC设备

    RT-Thread学习记录 1.Studio新建工程 2.控制台使用简述 3.PIN设备框架学习 4.UART设备框架学习 5.I2C设备框架学习 6.SPI设备框架学习   RTC设备     首先在Components设置项下勾选RTC驱动框架,这边有两个可选项,使用闹钟和开启模拟RTC,STM32带硬件RTC直接使用即可,不需要模拟,如下图:     然后在Samples设置项下勾选rtc device的例程,保存,如下图可以看到例程已添加入工程。 /* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date           Author       Notes * 2018-11-30     misonyo     first implementation. */ /* * 程序清单:这是一个 RTC 设备使用例程 * 例程导出了 rtc_sample 命令到控制终端 * 命令调用格式:rtc_sample * 程序功能:设置RTC设备的日期和时间,延时一段时间后获取当前时间并打印显示。 */ ​ #include <rtthread.h> #include <rtdevice.h> ​ static int rtc_sample(int argc, char *argv[]) {    rt_err_t ret = RT_EOK;    time_t now; ​    /* 设置日期 */    ret = set_date(2018, 12, 3);    if (ret != RT_EOK)   {        rt_kprintf("set RTC date failed\n");        return ret;   } ​    /* 设置时间 */    ret = set_time(11, 15, 50);    if (ret != RT_EOK)   {        rt_kprintf("set RTC time failed\n");        return ret;   } ​    /* 延时3秒 */    rt_thread_mdelay(3000); ​    /* 获取时间 */    now = time(RT_NULL);    rt_kprintf("%s\n", ctime(&now)); ​    return ret; }c /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(rtc_sample, rtc sample); ​       然后在board.h文件下的RTC CONFIG段,开启RTC的驱动支持。     保存,编译,运行,可以看到例程设置了RTC的时间并打印,我们也可以通过date指令查看当前的时间,带参数更新时间。     以上就是RTC设备的使用说明 此内容由EEWORLD论坛网友ID.LODA原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 发表了主题帖: RT-Thread设备框架学习之SPI设备

    RT-Thread学习记录 1.Studio新建工程 2.控制台使用简述 3.PIN设备框架学习 4.UART设备框架学习 5.I2C设备框架学习   SPI设备     RT-Thread的SPI驱动目前只支持硬件SPI/QSPI模式。     首先在Components设置项下勾选SPI驱动框架,这里几个可选项分别为QSPI模式、SPI SD卡、SPI Flash、SPI以太网、SPI WiFi、这边我板载了QSPI的FLASH和SPI SD卡,所以两个都勾选了,如果设备不是以上选项可以直接跳过,如下图       然后在Samples设置项下勾选spi device例程, 保存,如下图可以看到spi的例程已添加入工程       打开例程文件,可以看到该例程的功能是通过SPI方式夺取Flash的设备ID,因为我板卡用的是qspi的Flash,所以例程不能用,需要自己重新实现。     首先我们先在board.h打开QSPI设备驱动的支持       然后在board.c文件或者其他任意源文件,添加对QSPI的引脚初始化,这边我先是在CubeMX下设置生成了代码之后拷贝过来的,具体如下图所示:     模仿之前添加进来的SPI例子简单的写一个测试例程 #include <rtthread.h> #include <rtdevice.h> #include "drv_qspi.h" ​ #define W25Q_SPI_DEVICE_NAME     "qspi10" ​ char w25qxx_read_status_register2(struct rt_qspi_device *device) {    /* 0x35 read status register2 */    char instruction = 0x35, status; ​    rt_qspi_send_then_recv(device, &instruction, 1, &status, 1); ​    return status; } ​ void w25qxx_write_enable(struct rt_qspi_device *device) {    /* 0x06 write enable */    char instruction = 0x06; ​    rt_qspi_send(device, &instruction, 1); } ​ void w25qxx_enter_qspi_mode(struct rt_qspi_device *device) {    char status = 0;    /* 0x38 enter qspi mode */    char instruction = 0x38;    char write_status2_buf[2] = {0}; ​    /* 0x31 write status register2 */    write_status2_buf[0] = 0x31; ​    status = w25qxx_read_status_register2(device);    if (!(status & 0x02))   {        status |= 1 << 1;        w25qxx_write_enable(device);        write_status2_buf[1] = status;        rt_qspi_send(device, &write_status2_buf, 2);        rt_qspi_send(device, &instruction, 1);        rt_kprintf("flash already enter qspi mode\n");        rt_thread_mdelay(10);   } } ​ //static void usr_spi_hw_config(struct rt_spi_device* device) //{ //   struct rt_spi_configuration cfg; // //   cfg.data_width = 8; //   cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB; //   cfg.max_hz = 50 * 1000 *1000;                           /* 50M */ // //   rt_spi_configure(device, &cfg); //} ​ static void usr_qspi_hw_config(struct rt_qspi_device* device) {    struct rt_qspi_configuration cfg; ​    cfg.parent.data_width = 8;    cfg.parent.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB;    cfg.parent.max_hz = 50 * 1000 *1000;    /* 20M */ ​    cfg.medium_size = 0x1000000;    cfg.ddr_mode = 0;    cfg.qspi_dl_width = 4;    rt_qspi_configure(device, &cfg); } ​ static void qspi_w25q_sample(int argc, char *argv[]) {    struct rt_qspi_device *spi_dev_w25q;    char name[RT_NAME_MAX];    rt_uint8_t w25x_read_id = 0x90;    rt_uint8_t id[5] = {0}; ​ ​    stm32_qspi_bus_attach_device("qspi1", "qspi10", RT_NULL, 4, w25qxx_enter_qspi_mode, RT_NULL); ​    if (argc == 2)   {        rt_strncpy(name, argv[1], RT_NAME_MAX);   }    else   {        rt_strncpy(name, W25Q_SPI_DEVICE_NAME, RT_NAME_MAX);   } ​    /* 查找 spi 设备获取设备句柄 */    spi_dev_w25q = (struct rt_qspi_device *)rt_device_find(name);    if (!spi_dev_w25q)   {        rt_kprintf("spi sample run failed! can't find %s device!\n", name);   }    else   {        usr_qspi_hw_config(spi_dev_w25q); ​        /* 方式1:使用 rt_spi_send_then_recv()发送命令读取ID */        rt_qspi_send_then_recv(spi_dev_w25q, &w25x_read_id, 1, id, 5);        rt_kprintf("use rt_qspi_send_then_recv() read w25q ID is:%x%x\n", id[3], id[4]); ​        /* 方式2:使用 rt_spi_transfer_message()发送命令读取ID */ //       struct rt_qspi_message msg1, msg2; // //       msg1.send_buf   = &w25x_read_id; //       msg1.recv_buf   = RT_NULL; //       msg1.length     = 1; //       msg1.cs_take   = 1; //       msg1.cs_release = 0; //       msg1.next       = &msg2; // //       msg2.send_buf   = RT_NULL; //       msg2.recv_buf   = id; //       msg2.length     = 5; //       msg2.cs_take   = 0; //       msg2.cs_release = 1; //       msg2.next       = RT_NULL; ​ //       rt_qspi_transfer_message(spi_dev_w25q, &msg1); //       rt_kprintf("use rt_spi_transfer_message() read w25q ID is:%x%x\n", id[3], id[4]); ​   } } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(qspi_w25q_sample, qspi w25q sample);       保存,编译,运行,可以看到已经能读取到外部FLASH的设备ID     SPI的测试可以参考官网提供的示例程序,我这边没有相应的外设做测试,SD卡这个测试留到之后的文件系统组件一起测试。     以上就是SPI驱动框架的使用说明。 此内容由EEWORLD论坛网友ID.LODA原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 发表了日志: RT-Thread设备框架学习之SPI设备

  • 发表了主题帖: RT-Thread设备框架学习之I2C设备

    RT-Thread学习记录 1.Studio新建工程 2.控制台使用简述 3.PIN设备框架学习 4.UART设备框架学习   I2C设备   RT-Thread的I2C使用的是软件模拟的方式,增加了灵活性。   首先在Components设置项下勾选I2C驱动框架,因为目前只支持软件模拟的方式,需要勾选Use GPIO to simulate I2C选项,Use I2C debug message不建议勾选,如果驱动失败可以打开或者硬件调试,如下图   然后在Samples设置项下勾选i2c device例程, 保存,如下图可以看到i2c的例程已添加入工程   打开例程文件,可以看到该例程的功能是通过I2C方式驱动aht10,因为我板卡用的就是atk的pandora,所以带有这个外设,可以直接测试     例程使用的是i2c2,因为是软件模拟的这个尾缀可以修改成1,3,5这些,不过需要和驱动设置一致,具体的引脚设置在board.h文件下的I2C CONFIG段,开启对应的I2C定义和板载引脚   保存,编译,下载.在控制台输入例程,可以看到相关信息打印。 /* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date           Author       Notes * 2018-08-15     misonyo     first implementation. */ /* * 程序清单:这是一个 I2C 设备使用例程 * 例程导出了 i2c_aht10_sample 命令到控制终端 * 命令调用格式:i2c_aht10_sample i2c1 * 命令解释:命令第二个参数是要使用的I2C总线设备名称,为空则使用默认的I2C总线设备 * 程序功能:通过 I2C 设备读取温湿度传感器 aht10 的温湿度数据并打印 */ ​ #include <rtthread.h> #include <rtdevice.h> ​ #define AHT10_I2C_BUS_NAME         "i2c2"  /* 传感器连接的I2C总线设备名称 */ #define AHT10_ADDR                 0x38    /* 从机地址 */ #define AHT10_CALIBRATION_CMD       0xE1    /* 校准命令 */ #define AHT10_NORMAL_CMD           0xA8    /* 一般命令 */ #define AHT10_GET_DATA             0xAC    /* 获取数据命令 */ ​ static struct rt_i2c_bus_device *i2c_bus = RT_NULL;     /* I2C总线设备句柄 */ static rt_bool_t initialized = RT_FALSE;                /* 传感器初始化状态 */ ​ /* 写传感器寄存器 */ static rt_err_t write_reg(struct rt_i2c_bus_device *bus, rt_uint8_t reg, rt_uint8_t *data) {    rt_uint8_t buf[3];    struct rt_i2c_msg msgs; ​    buf[0] = reg; //cmd    buf[1] = data[0];    buf[2] = data[1]; ​    msgs.addr = AHT10_ADDR;    msgs.flags = RT_I2C_WR;    msgs.buf = buf;    msgs.len = 3; ​    /* 调用I2C设备接口传输数据 */    if (rt_i2c_transfer(bus, &msgs, 1) == 1)   {        return RT_EOK;   }    else   {        return -RT_ERROR;   } } ​ /* 读传感器寄存器数据 */ static rt_err_t read_regs(struct rt_i2c_bus_device *bus, rt_uint8_t len, rt_uint8_t *buf) {    struct rt_i2c_msg msgs; ​    msgs.addr = AHT10_ADDR;    msgs.flags = RT_I2C_RD;    msgs.buf = buf;    msgs.len = len; ​    /* 调用I2C设备接口传输数据 */    if (rt_i2c_transfer(bus, &msgs, 1) == 1)   {        return RT_EOK;   }    else   {        return -RT_ERROR;   } } ​ static void read_temp_humi(float *cur_temp, float *cur_humi) {    rt_uint8_t temp[6]; ​    write_reg(i2c_bus, AHT10_GET_DATA, 0);      /* 发送命令 */    rt_thread_mdelay(400);    read_regs(i2c_bus, 6, temp);                /* 获取传感器数据 */ ​    /* 湿度数据转换 */    *cur_humi = (temp[1] << 12 | temp[2] << 4 | (temp[3] & 0xf0) >> 4) * 100.0 / (1 << 20);    /* 温度数据转换 */    *cur_temp = ((temp[3] & 0xf) << 16 | temp[4] << 8 | temp[5]) * 200.0 / (1 << 20) - 50; } ​ static void aht10_init(const char *name) {    rt_uint8_t temp[2] = {0, 0}; ​    /* 查找I2C总线设备,获取I2C总线设备句柄 */    i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(name); ​    if (i2c_bus == RT_NULL)   {        rt_kprintf("can't find %s device!\n", name);   }    else   {        write_reg(i2c_bus, AHT10_NORMAL_CMD, temp);        rt_thread_mdelay(400); ​        temp[0] = 0x08;        temp[1] = 0x00;        write_reg(i2c_bus, AHT10_CALIBRATION_CMD, temp);        rt_thread_mdelay(400);        initialized = RT_TRUE;   } } ​ static void i2c_aht10_sample(int argc, char *argv[]) {    float humidity, temperature;    char name[RT_NAME_MAX]; ​    humidity = 0.0;    temperature = 0.0; ​    if (argc == 2)   {        rt_strncpy(name, argv[1], RT_NAME_MAX);   }    else   {        rt_strncpy(name, AHT10_I2C_BUS_NAME, RT_NAME_MAX);   } ​    if (!initialized)   {        /* 传感器初始化 */        aht10_init(name);   }    if (initialized)   {        /* 读取温湿度数据 */        read_temp_humi(&temperature, &humidity); ​        rt_kprintf("read aht10 sensor humidity   : %d.%d %%\n", (int)humidity, (int)(humidity * 10) % 10);        rt_kprintf("read aht10 sensor temperature: %d.%d \n", (int)temperature, (int)(temperature * 10) % 10);   }    else   {        rt_kprintf("initialize sensor failed!\n");   } } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(i2c_aht10_sample, i2c aht10 sample); ​   以上就是I2C驱动框架的使用说明。 此内容由EEWORLD论坛网友ID.LODA原创,如需转载或用于商业用途需征得作者同意并注明出处  

  • 发表了日志: RT-Thread设备框架学习之I2C设备

  • 发表了日志: RT-Thread设备框架学习之UART设备

  • 发表了主题帖: RT-Thread设备框架学习之UART设备

      RT-Thread学习记录 1.Studio新建工程 2.控制台使用简述 3.PIN设备框架学习   UART设备   首先在Components设置项下勾选UART驱动框架,一般工程建立的时候默认已经勾选,且因为有依赖不可被反选,不过支持DMA方式选择,如下图     然后在Samples设置项下勾选uart device的例程,这边提供了两个例程,普通中断和DMA两种方式,保存,如下图可以看到例程已添加入工程.     UART口的选择和引脚设置在board.h文件下的UART CONFIG段,可以看到控制台的串口已经被设置开启,如需其他的串口可以开启相应的BSP_USING_UARTx及其对应的引脚。 如果要使用DMA,需要先在Components设置项下的UART驱动勾选使能DMA,并在Board.h文件下的UART CONFIG段,添加RX/TX DMA的使能   具体的测试因为手边缺少相应工具就不进行了,留到后续UART组件一起(AT MODBUS等)。       以上就是UART驱动框架的使用说明。 此内容由EEWORLD论坛网友ID.LODA原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 发表了日志: RT-Thread设备框架学习之PIN设备

  • 发表了主题帖: RT-Thread设备框架学习之PIN设备

    本帖最后由 ID.LODA 于 2020-4-26 17:32 编辑 [TOCM] RT-Thread学习记录 1.RT-Thread Studio新建工程 2.常用组件学习之控制台使用简述 PIN设备   首先在Components设置项下勾选GPIO驱动框架,一般工程建立的时候默认已经勾选,且因为有依赖不可被反选,如下图   然后在Samples设置项下勾选pin device的例子,保存,可以看到工程目录中自动添加了相应的代码     打开例程文件,可以看到该例程的功能是通过按键中断的方式开关beep,我们修改一下相应的引脚定义,没有beep的可以把引脚修改成LED的引脚(新建工程的时候main函数里面也有个LED,别冲突了)     RT-Thread的引脚号可以在drv_gpio.c文件的struct pin_index查到,我这边修改成了自己熟悉的PORT+PIN的方式,需要包含下board.h头文件     保存,编译,下载.在控制台输入例程,通过按键触发可以看到信息打印和LED的变化。     以上就是PIN设备框架的使用说明。 此内容由EEWORLD论坛网友ID.LODA原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 发表了日志: RT-Thread常用组件学习之控制台的使用简述

  • 发表了主题帖: RT-Thread常用组件学习之控制台的使用简述

        Finsh/msh的控制台真的是好用!!!建议大家尽快熟悉。具体可以参阅官网组件FinSH控制台章节 。   工程建立运行之后,正常情况下打印的信息只有系统的版本,回车调出msh > (有时候直接有),就可以输入指令来查看一些系统信息了,具体支持的指令可以通过输入help,然后回车查看 以上可以看到目前控制台所支持的指令,输入部分相关指令查看效果如下: 支持自定义指令,比如以下例子:   下载更新程序,输入help指令,可以看到自己添加的指令已被加入控制台 运行,结果如下: 以上就是控制台的简单使用说明 此内容由EEWORLD论坛网友ID.LODA原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 发表了日志: RT-Thread系统-Studio方式新建工程

最近访客

< 1/6 >

统计信息

已有89人来访过

  • 芯币:707
  • 好友:2
  • 主题:31
  • 回复:55
  • 课时:--
  • 资源:1

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言